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 接近满盘会显著降速,必须控制高水位。

四、常见排错步骤(存储性能类)#

  1. 确认是否为单盘瓶颈
    bash iostat -xm 1 3
    - %util 长期接近100%且 await 高,说明磁盘繁忙。
  2. 确认是否为缓存不足
    bash free -h vmstat 1 5
    - si/so 非零说明发生swap,需增加内存或优化缓存。
  3. 检查文件系统与挂载
    bash mount | grep /data
    - 确认挂载参数符合业务需要。
  4. 应用层I/O热点
    bash lsof +D /data | head
    - 识别高频访问文件,做冷热分层或重构写入模式。

五、练习(可落地操作)#

  1. 使用 fio 建立顺序写与随机读基线,记录 IOPS/吞吐/延迟。
  2. 切换 I/O 调度器(如 mq-deadline -> none),复测并对比差异。
  3. 调整 vm.dirty_ratiovm.dirty_background_ratio,观察写入抖动变化。
  4. 编写容量趋势记录脚本并生成一周数据,给出 6 个月扩容预测结论。
  5. 制作一份容量告警策略,设置 70%/85%/95% 三档阈值并模拟触发。