第一步:先定位延迟原因,别瞎优化
先查当前磁盘I/O负载,找到具体瓶颈再动手,避免做无用功。
1.1 安装I/O诊断工具iotop、iostat
所有主流Linux发行版通用安装命令:
```bash
CentOS/RHEL 7-9
sudo yum install -y sysstat iotop
Ubuntu/Debian 18-24
sudo apt update && sudo apt install -y sysstat iotop
```
1.2 实时诊断延迟根因
- 查实时读写进程:终端执行
sudo iotop -o(只显示有I/O活动的进程),重点看%IO列,超过80%的进程就是主要瓶颈
- 查磁盘等待时间:终端执行
sudo iostat -x 1(每1秒刷新一次,x显示扩展统计),重点观察:
- %util:磁盘利用率,超过90%说明磁盘饱和
- await:平均I/O请求等待时间(包括队列+处理),SSD超过5ms、HDD超过20ms说明延迟高
- svctm:磁盘平均处理时间,SSD超过1ms、HDD超过10ms说明磁盘本身性能不足
第二步:软件层面通用零门槛优化
不管是SSD还是HDD,先做软件优化,成本最低。
2.1 关闭不必要的后台进程和服务
后台进程会抢占I/O资源,先关没用的:
- 临时关闭服务:比如MySQL/Redis测试服不用的话,执行
sudo systemctl stop mysql redis
- 永久关闭开机自启:执行
sudo systemctl disable mysql redis
- 查开机自启列表:执行
sudo systemctl list-unit-files --type=service --state=enabled,逐个排查非必要的关闭
2.2 调整Linux磁盘I/O调度算法
不同场景用不同算法,通用SSD优先选mq-deadline,HDD优先选bfq:
- 先看当前调度算法:执行
cat /sys/block/sda/queue/scheduler(sda换成你的磁盘名,可通过df -h看挂载对应的磁盘)
- 临时修改(重启失效,适合测试):
- SSD:
echo mq-deadline | sudo tee /sys/block/sda/queue/scheduler
- HDD:
echo bfq | sudo tee /sys/block/sda/queue/scheduler
- 永久修改(重启生效):
- 编辑grub配置文件:
sudo vim /etc/default/grub
- 找到GRUB_CMDLINE_LINUX_DEFAULT这一行,在引号内末尾添加:
elevator=mq-deadline(SSD)或elevator=bfq(HDD),注意前面加空格
- 完整示例(SSD版):
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash elevator=mq-deadline"
- 更新grub配置:
```bash
CentOS/RHEL
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
Ubuntu/Debian
sudo update-grub
```
- 重启服务器:
sudo reboot
2.3 调整Linux内存缓存策略(适用于读多写少场景)

读多写少(比如Web静态资源服务器、CDN节点)可以增大内存缓存比例:
- 临时修改(重启失效):
```bash
调整脏页阈值(内存中允许的脏数据比例),默认10%读多写少可设为20%
echo 20 | sudo tee /proc/sys/vm/dirty_ratio
调整后台开始回写脏页的阈值,默认5%读多写少可设为15%
echo 15 | sudo tee /proc/sys/vm/dirty_background_ratio
调整脏数据过期时间,默认30秒读多写少可设为60秒
echo 6000 | sudo tee /proc/sys/vm/dirty_expire_centisecs
调整后台回写间隔,默认5秒读多写少可设为10秒
echo 1000 | sudo tee /proc/sys/vm/dirty_writeback_centisecs
```
- 永久修改(重启生效):
- 编辑sysctl配置文件:
sudo vim /etc/sysctl.conf
- 在文件末尾添加完整可复制内容:
```bash
读多写少场景内存缓存优化
vm.dirty_ratio = 20
vm.dirty_background_ratio = 15
vm.dirty_expire_centisecs = 6000
vm.dirty_writeback_centisecs = 1000
```
- 加载配置:
sudo sysctl -p
2.4 调整Linux内存缓存策略(适用于写多读少场景)
写多读少(比如日志服务器、数据库写入节点)要减少脏页积压,避免突然大流量I/O:
- 临时修改(重启失效):
```bash
echo 5 | sudo tee /proc/sys/vm/dirty_ratio
echo 2 | sudo tee /proc/sys/vm/dirty_background_ratio
echo 1500 | sudo tee /proc/sys/vm/dirty_expire_centisecs
echo 300 | sudo tee /proc/sys/vm/dirty_writeback_centisecs
```
- 永久修改(重启生效):
- 编辑sysctl配置文件:
sudo vim /etc/sysctl.conf
- 在文件末尾添加完整可复制内容:
```bash
写多读少场景内存缓存优化
vm.dirty_ratio = 5
vm.dirty_background_ratio = 2
vm.dirty_expire_centisecs = 1500
vm.dirty_writeback_centisecs = 300
```
- 加载配置:
sudo sysctl -p
第三步:硬件/挂载层面补充优化
3.1 挂载时添加noatime、nodiratime参数
Linux默认每次读文件/目录都会更新访问时间(atime),会产生大量无用写I/O,关闭后延迟明显降低:
- 先看当前挂载参数:执行
mount,找到你的数据盘挂载行
- 临时修改(重启失效,适合测试):比如数据盘挂载在
/data,执行sudo mount -o remount,noatime,nodiratime /data
- 永久修改(重启生效):
- 编辑fstab配置文件:
sudo vim /etc/fstab
- 找到数据盘对应的行,在第四列(挂载参数)添加
noatime,nodiratime,多个参数用逗号分隔
- 完整示例(ext4格式SSD挂载/data):
/dev/sda1 /data ext4 defaults,noatime,nodiratime 0 2
- 测试挂载是否成功:
sudo mount -a,如果没有报错说明配置正确
3.2 确认SSD已开启TRIM(仅SSD适用)
TRIM可以让SSD提前擦除无效数据,减少写入时的延迟,主流Linux发行版默认已开启,确认一下:
- 检查是否支持TRIM:执行
sudo fstrim / --dry-run,如果显示类似/: 2.3 GiB (2462347264 bytes) trimmed说明支持
- 检查是否开启定时TRIM:
```bash
检查fstrim.timer状态
sudo systemctl status fstrim.timer
```
- 如果没开启,手动开启:
```bash
sudo systemctl enable --now fstrim.timer
```
第四步:快速验证优化效果
用dd命令测试读写速度,对比优化前后的结果:
- 测试写入速度(避开缓存,真实反映磁盘性能):
```bash
创建1G大小的测试文件,直接写入磁盘(oflag=direct),块大小4k(匹配常见文件系统块大小)
sudo dd if=/dev/zero of=/data/test_write bs=4k count=256000 oflag=direct
```
- 测试读取速度(清空缓存后真实反映):
```bash
清空内存缓存
sudo sync && echo 3 | sudo tee /proc/sys/vm/drop_caches
读取刚才创建的测试文件,直接从磁盘读(iflag=direct)
sudo dd if=/data/test_write of=/dev/null bs=4k count=256000 iflag=direct
```
- 清理测试文件:
sudo rm -f /data/test_write