3.10.6 性能优化与容量规划建议
在性能优化与容量规划中,先明确业务 I/O 模式与性能瓶颈(延迟/吞吐/并发),再建立基线并小步调参。以下给出可执行的测量、优化、排错与规划示例,确保可复现实验结果与容量预算。
原理草图(从业务到介质的调优路径):
一、基线建立与对比测试(示例)#
安装常用工具:
# Debian/Ubuntu
sudo apt update && sudo apt install -y fio iotop sysstat
# RHEL/CentOS/Rocky
sudo yum install -y fio iotop sysstat
建立基线(顺序写/随机读):
# 顺序写:测试吞吐(1G文件,direct避免缓存干扰)
fio --name=seq_write --rw=write --bs=1M --size=1G --iodepth=32 \
--numjobs=1 --direct=1 --filename=/data/fio_seq_write.dat
# 随机读:测试延迟与IOPS
fio --name=rand_read --rw=randread --bs=4k --size=1G --iodepth=64 \
--numjobs=4 --direct=1 --filename=/data/fio_rand_read.dat
命令解释要点:
- --rw=write/randread:顺序写/随机读模式
- --bs=1M/4k:块大小决定吞吐与IOPS偏好
- --iodepth:队列深度影响并发与延迟
- --direct=1:绕过页缓存,贴近真实磁盘能力
观察I/O现状:
iostat -xm 1 5 # 关注 %util, await, svctm
iotop -o # 找到高IO进程
二、性能优化示例(带配置与预期效果)#
1)I/O调度器优化#
查看与设置调度器:
cat /sys/block/sda/queue/scheduler
# 例:将SSD/NVMe设置为none或mq-deadline
echo none | sudo tee /sys/block/nvme0n1/queue/scheduler
预期:降低延迟,提升随机IO吞吐。
永久化(udev规则示例):
sudo tee /etc/udev/rules.d/60-io-scheduler.rules <<'EOF'
ACTION=="add|change", KERNEL=="nvme0n1", ATTR{queue/scheduler}="none"
EOF
sudo udevadm control --reload
2)文件系统与挂载参数#
调整挂载参数(示例:XFS,关注atime与barrier):
# 临时调整
sudo mount -o remount,noatime,nodiratime /data
# /etc/fstab 持久化
UUID=xxxx /data xfs defaults,noatime,nodiratime 0 0
解释:noatime/nodiratime 减少元数据写入;若使用 barrier 需结合UPS评估一致性风险。
3)内核回写与内存回收#
查看与设置回写参数:
sysctl vm.dirty_ratio vm.dirty_background_ratio
sudo sysctl -w vm.dirty_background_ratio=5
sudo sysctl -w vm.dirty_ratio=20
预期:控制脏页回写,避免写入抖动。
4)RAID/控制器与缓存#
检查RAID与缓存策略(示意命令,依据厂商工具替换):
# 例:MegaCli
sudo megacli -LDInfo -Lall -aALL | egrep 'Write Policy|Cache'
建议:启用写回缓存需配合BBU/断电保护。
三、容量规划与告警策略(可执行示例)#
1)容量趋势建模与预测#
记录文件系统利用率:
df -hT /data
du -sh /data/*
生成简单月度增长模型(示例脚本):
cat <<'EOF' > /usr/local/bin/capacity_trend.sh
#!/bin/bash
ts=$(date +%F)
used=$(df -P /data | awk 'NR==2{print $3}')
echo "$ts,$used" >> /var/log/capacity_trend.csv
EOF
chmod +x /usr/local/bin/capacity_trend.sh
预期:形成历史曲线,为3-12个月容量预测提供数据。
2)高水位阈值与告警#
建议阈值:70%预警,85%强预警,95%紧急扩容。
# 简单告警脚本
cat <<'EOF' > /usr/local/bin/check_fs.sh
#!/bin/bash
used=$(df -P /data | awk 'NR==2{print $5}' | tr -d '%')
if [ "$used" -ge 85 ]; then
echo "CRITICAL: /data usage ${used}%"
elif [ "$used" -ge 70 ]; then
echo "WARN: /data usage ${used}%"
else
echo "OK: /data usage ${used}%"
fi
EOF
chmod +x /usr/local/bin/check_fs.sh
3)冗余与重建预留#
- RAID重建空间、快照与备份至少预留 20%–30%。
- XFS/EXT4 接近满盘会显著降速,必须控制高水位。
四、常见排错步骤(存储性能类)#
- 确认是否为单盘瓶颈:
bash iostat -xm 1 3
-%util长期接近100%且await高,说明磁盘繁忙。 - 确认是否为缓存不足:
bash free -h vmstat 1 5
-si/so非零说明发生swap,需增加内存或优化缓存。 - 检查文件系统与挂载:
bash mount | grep /data
- 确认挂载参数符合业务需要。 - 应用层I/O热点:
bash lsof +D /data | head
- 识别高频访问文件,做冷热分层或重构写入模式。
五、练习(可落地操作)#
- 使用
fio建立顺序写与随机读基线,记录 IOPS/吞吐/延迟。 - 切换 I/O 调度器(如
mq-deadline->none),复测并对比差异。 - 调整
vm.dirty_ratio与vm.dirty_background_ratio,观察写入抖动变化。 - 编写容量趋势记录脚本并生成一周数据,给出 6 个月扩容预测结论。
- 制作一份容量告警策略,设置 70%/85%/95% 三档阈值并模拟触发。