4.8.7 常见问题与优化案例

常见问题与优化案例#

导语:本节聚焦磁盘与文件系统性能的典型故障场景,提供可执行的排查步骤、命令解释、优化方法与练习。

I/O路径原理草图(简化)

文章图片

1) I/O延迟突增(await升高)#

现象:iostat中await升高、svctm稳定,应用超时。
排查与示例

# 安装工具(Debian/Ubuntu)
sudo apt-get update && sudo apt-get install -y sysstat iotop

# 安装工具(RHEL/CentOS)
sudo yum install -y sysstat iotop

# 1) 观察磁盘延迟、队列
iostat -x 1 5
# 关键字段解释:
# await:请求平均等待时间(含排队+服务),升高=排队/拥塞
# svctm:设备服务时间,若稳定且await升高=队列长度增加
# avgqu-sz:平均队列长度,过大=堆积

# 2) 进程级I/O
iotop -oPa
# -o 仅显示有I/O的进程 -P显示线程 -a累计

优化策略与命令示例

# 查看当前调度器
cat /sys/block/sda/queue/scheduler

# 临时切换调度器(例如SSD用none或mq-deadline)
echo mq-deadline | sudo tee /sys/block/sda/queue/scheduler

# 将日志与数据分盘(示例挂载)
sudo mkdir -p /data /logs
# /etc/fstab 添加(示例)
# /dev/sdb1 /data ext4 defaults,noatime 0 2
# /dev/sdc1 /logs ext4 defaults,noatime 0 2
sudo mount -a

练习
- 使用dd制造写入负载,观察await变化并记录优化前后对比。

dd if=/dev/zero of=/data/test.img bs=1M count=2048 oflag=direct
iostat -x 1 3

2) 磁盘利用率高但吞吐低(随机I/O/碎片)#

现象%util接近100%,但kB/s不高。
排查与示例

# 观察随机I/O与小IO比例
iostat -x 1 3

# 检查文件系统碎片(ext4/xfs)
sudo e4defrag -c /data
sudo xfs_db -r -c frag -c quit /dev/sdb1

优化与挂载参数示例

# /etc/fstab 示例(减少元数据写)
# /dev/sdb1 /data ext4 defaults,noatime,nodiratime,barrier=1 0 2
sudo mount -o remount /data

练习
- 创建大量小文件,观察随机I/O对%util影响。

for i in {1..5000}; do echo $i > /data/small_$i.txt; done
iostat -x 1 3

3) 文件系统缓存抖动(cache命中率下降)#

现象:频繁读写导致cache命中下降,应用反复触发磁盘访问。
排查与示例

# 查看缓存与回收
free -h
vmstat 1 5
# si/so 频繁=换入换出,缓存压力大

优化与命令

# 调整swappiness(建议10~30)
echo "vm.swappiness=20" | sudo tee /etc/sysctl.d/99-io-tune.conf
sudo sysctl -p /etc/sysctl.d/99-io-tune.conf

# 禁止频繁drop_caches(仅排查时临时使用)
# echo 3 | sudo tee /proc/sys/vm/drop_caches

练习
- 设置不同swappiness,观察vmstatsi/so变化。


4) 数据库写入抖动与fsync阻塞(MySQL/Redis)#

现象:MySQL/Redis写入延迟高。
排查与示例

# 观察数据库进程I/O
pidstat -d 1 5 -p $(pidof mysqld)

# 检查磁盘写缓存与电源保护
sudo hdparm -W /dev/sdb

优化建议(示例配置)

# MySQL my.cnf 示例(按业务选择)
[mysqld]
innodb_flush_log_at_trx_commit=2
sync_binlog=100
# Redis redis.conf 示例
appendfsync everysec

练习
- 修改innodb_flush_log_at_trx_commit后做压测,记录TPS与延迟变化。


5) Nginx日志写入瓶颈#

现象:高QPS导致access_log写入阻塞。
排查与示例

# 查看Nginx进程写入
pidstat -d 1 5 -p $(pidof nginx | tr ' ' ',')

优化配置示例

# /etc/nginx/nginx.conf
http {
    access_log /var/log/nginx/access.log main buffer=64k flush=5s;
    # 或关闭不必要的日志
    # access_log off;
}
sudo nginx -t && sudo systemctl reload nginx

练习
- 设置bufferflush参数,对比日志写入延迟。


6) 容器化场景I/O性能下降(overlay2写放大)#

现象:容器内I/O延迟高。
排查与示例

# 查看Docker存储驱动
docker info | grep -i "Storage Driver"

优化方案:高I/O目录挂载宿主机卷

docker run -d --name app \
  -v /data/appdata:/var/lib/app \
  myimage:latest

练习
- 将同一应用的高I/O目录改为宿主机卷,比较吞吐与延迟。


7) RAID重建导致性能恶化#

现象:重建期间I/O被挤占。
排查与示例

cat /proc/mdstat
# 观察recovery进度与速度

优化与限速

# 限制重建速率(单位KB/s)
echo 50000 | sudo tee /proc/sys/dev/raid/speed_limit_min
echo 200000 | sudo tee /proc/sys/dev/raid/speed_limit_max

练习
- 调整重建速度,观察应用I/O的await变化。


8) 快照/备份窗口影响业务#

现象:高峰期快照触发大量元数据操作。
排查与示例

# 观察备份任务I/O
iotop -oPa

优化建议:低峰执行、分批备份、使用增量快照。

# 示例:LVM快照(低峰时段)
lvcreate -L 10G -s -n data_snap /dev/vg0/data

练习
- 在低峰进行快照,比较业务延迟曲线。


综合优化建议(落地清单)#

  1. 建立基线iostat -xvmstatpidstat定期采样。
  2. 区分负载类型:顺序I/O适合大块写入,随机I/O需减少小文件。
  3. 日志与数据分盘:避免写放大与干扰。
  4. 硬件升级与参数调优:SSD/NVMe+合理调度器。
  5. 变更后压测回归:保留优化前后对比数据。