Linux 服务器磁盘 IO 过高,导致网站卡顿
一、磁盘IO过高到底是什么意思?
磁盘IO(Input/Output)简单说就是硬盘读写数据的效率。
当大量程序同时读写磁盘,或者单个程序读写量过大,磁盘就会“忙不过来”。
这时CPU会等待磁盘完成操作,导致网站处理请求变慢,页面加载超时或直接卡死。Linux服务器磁盘IO过高,导致网站卡顿是站长最常遇到的性能瓶颈之一。
二、准备环境与安装排查工具
本教程适用于CentOS 7/8、Ubuntu 20.04+等常见发行版。
需要你有服务器SSH登录权限并熟悉基本命令。
先更新包管理器并安装必备工具:
# CentOS / RHEL
sudo yum install -y sysstat iotop
# Ubuntu / Debian
sudo apt update && sudo apt install -y sysstat iotop
sysstat 包含 iostat 命令,iotop 是一个交互式查看进程IO的工具。
安装后即可开始排查。
三、用iostat快速判断磁盘是否过载
运行以下命令查看磁盘整体IO情况,每1秒输出一次,共输出3次:
iostat -x 1 3
重点关注 %util(磁盘繁忙百分比)和 await(平均每次IO请求等待时间,单位毫秒)。
如果 %util 持续超过 80%,或 await 超过几十毫秒,说明磁盘确实处于高负载状态。
另外 rKB/s 和 wKB/s 能看出读写量大小。
如果这里已经显示异常,继续下一步找具体进程。如果正常,则网站卡顿可能由其他原因引起(如CPU、内存或网络)。
四、用iotop锁定“罪魁祸首”
安装 iotop 后直接运行:
sudo iotop -oP
参数 -o 只显示实际有IO的进程,-P 只显示进程(不显示线程)。
你会看到一个实时列表,每行包含进程PID、IO读写速率、磁盘耗时百分比等。找出读写量最大或DISK WRITE/SYNC比例异常的进程。
常见高IO进程举例:
- MySQL / MariaDB 数据库(日志刷写或大量查询)
- 网站访问日志写入(如Nginx访问日志)
- 定时备份任务(如数据库备份、文件同步)
- 日志切割或压缩进程
五、针对高IO进程的优化方案
根据上一步找到的进程,采取相应措施:
- 数据库(MySQL):进入MySQL执行
SHOW FULL PROCESSLIST;检查慢查询;修改my.cnf适当调大innodb_buffer_pool_size(建议物理内存的60%-70%),并关闭不必要的查询日志。 - Web服务日志:若Nginx日志写入频繁,可关闭访问日志或改为缓冲写入。编辑Nginx配置,在对应server块内添加
access_log off;或使用缓冲参数access_log /var/log/nginx/access.log buffer=4k flush=5s;。 - 系统日志:编辑
/etc/systemd/journald.conf,将Storage=auto改为Storage=volatile(日志存内存),然后重启systemd-journald。 - 禁用不必要的服务:如
updatedb(mlocate定时更新)或cron中的大量备份任务。
六、避坑高频问题
- iotop需要root权限:忘记加
sudo会报错。 - iostat初次安装后可能无数据:因为需要系统采集周期,耐心等几秒或重启 sysstat 服务。
- 优化后立即生效吗? 大部分配置需重启相应服务,如
systemctl restart nginx或systemctl restart mysqld。 - 不要随意调大页面缓存:盲目增加
vm.dirty_ratio可能导致数据丢失风险,建议保持默认。
七、效果验证
优化后再次运行 iostat -x 1 3,观察 %util 是否下降到合理范围(一般低于 40%)。
同时打开网站测试响应速度。
可以尝试持续压力测试(如使用 ab 命令)并监控IO变化。
如果 %util 仍然很高且找不到特定进程,可能需要考虑升级磁盘硬件(如换SSD或增加RAID带宽)。
当你按照以上步骤完成排查和优化,Linux服务器磁盘IO过高,导致网站卡顿的问题应该能得到明显改善。
如果仍异常,请回头检查是否有未被发现的进程(如swap交换导致的持续IO),必要时使用 vmstat 结合 dstat 做进一步分析。