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,观察vmstat的si/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
练习:
- 设置buffer与flush参数,对比日志写入延迟。
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
练习:
- 在低峰进行快照,比较业务延迟曲线。
综合优化建议(落地清单)#
- 建立基线:
iostat -x、vmstat、pidstat定期采样。 - 区分负载类型:顺序I/O适合大块写入,随机I/O需减少小文件。
- 日志与数据分盘:避免写放大与干扰。
- 硬件升级与参数调优:SSD/NVMe+合理调度器。
- 变更后压测回归:保留优化前后对比数据。