家用住宅主机Linux磁盘IO瓶颈优化站点卡顿
家用主机磁盘IO瓶颈的典型表现
不少使用家用主机自建网站或服务的读者会遇到这样的问题:站点平时正常,一到访问高峰或执行备份任务时直接卡死;
点击页面后浏览器转圈几十秒才加载;
SSH连上去执行 ls 都慢吞吞。
这些现象很可能指向磁盘IO瓶颈。
家用环境常用机械硬盘或老旧SSD,再加上Linux默认的IO调度器不一定适合高并发小文件场景,很容易成为瓶颈。
本文从零开始,带你走完排查、优化、验证全流程。
三步定位IO瓶颈:iostat和iotop实战
1. 安装工具
# CentOS / Rocky Linux / Almalinux
yum install sysstat iotop -y
# Debian / Ubuntu
apt install sysstat iotop -y
2. 用iostat看磁盘负载
执行 iostat -x 1 5(每1秒输出一次,共5次),重点关注这几列:
- %util:磁盘利用率,超过 80% 表示繁忙,可能接近瓶颈。
- await:平均每次IO请求的等待时间(毫秒),机械硬盘正常应在 10-30ms ,如果超过 100ms 说明排队严重。
- svctm:平均每次IO服务时间,与硬件性能相关。
3. 用iotop查进程
执行 iotop -o(只显示正在IO的进程),看看是哪个进程在疯狂读写磁盘。
常见元凶:MySQL大量写日志、PHP-FPM慢日志、系统日志(rsyslog/journald)、swap交换频繁。
针对性地优化IO策略:从硬件到系统参数
硬件层面
首选方案:将系统盘和网站数据盘换成SSD(哪怕入门级SATA SSD也比机械盘快5-10倍)。
如果预算有限,至少把 swap 分区、日志分区放在SSD上。
系统层面
调整IO调度器
查看当前调度器:
cat /sys/block/sda/queue/scheduler
机械硬盘推荐用 deadline 或 mq-deadline,SSD推荐 none(NVMe)或 kyber。
临时修改:
echo deadline > /sys/block/sda/queue/scheduler
永久修改需在 /etc/default/grub 的 GRUB_CMDLINE_LINUX 中添加 elevator=deadline 然后 grub2-mkconfig -o /boot/grub2/grub.cfg(CentOS)或 update-grub(Ubuntu)。
调整swap使用倾向
如果内存充足,降低系统使用swap的倾向可以减少IO:
sysctl vm.swappiness=10
echo 'vm.swappiness=10' >> /etc/sysctl.conf
减少磁盘缓存回写压力
sysctl vm.dirty_ratio=30
sysctl vm.dirty_background_ratio=5
(可根据实际内存调整,避免大量回写导致卡顿)
应用层面
- 将MySQL慢日志、PHP错误日志等重定向到tmpfs(内存盘),或定期轮转压缩。
- 优化Nginx日志:关闭访问日志或使用缓冲写入。
- 定时任务执行
echo 3 > /proc/sys/vm/drop_caches清理缓存(谨慎,建议非高峰时手动)。
这些常见坑一定要避开
- 别在机械盘上频繁读写小文件:例如每秒钟写一次缓存文件,IO随机性能极差,改用内存缓存或调整写入频率。
- iostat %util 100% 不一定就是磁盘故障:可能某块盘的并行能力低(如SMR硬盘),换SSD前先查硬盘型号。
- 不要同时对多块盘执行大量同步写:家用主机的磁盘控制器(AHCI)带宽有限,分盘按时段错开任务。
- 调整swappiness后仍频繁swap:检查是否有内存泄漏(用
free -h和top),加内存条比调参数更有效。
优化后确认效果以及FAQ
验证方法
优化完成后,重复执行 iostat -x 1 5,对比 %util 是否降低、await 是否回归正常。
用 iotop -o 确认高IO进程是否消失。
顺便用 time dd if=/dev/zero of=/tmp/test bs=1M count=100 conv=fdatasync 测试实际写入速度(单位MB/s)。
高频问题
Q:我家用主机用的是树莓派,也能优化吗?
A:树莓派用SD卡,IO更脆弱。建议将系统装在USB3.0的SSD上,并对 /var/log 挂载到tmpfs。
Q:优化后站点仍然卡顿,怎么办?
A:检查CPU和内存是否也不足,使用 htop 或 vmstat 1 进一步排查;同时确认网络带宽是否被占满。
Q:使用宝塔面板如何监控 IO?
A:宝塔面板的“监控”模块可查看磁盘读写速率;另外可以在面板“计划任务”中执行 iostat -x 1 3 并保存输出用于分析。
如果你按上述步骤优化后站点响应明显提升,说明瓶颈确在磁盘IO。
建议后续定期检查磁盘健康状态(smartctl),并养成备份数据的好习惯。