网站运行过程中,有时会遇到这样的问题:CPU和内存使用率都不高,但网页响应却明显变慢,甚至出现间歇性卡顿。这类问题不一定是服务器算力不足,也可能与磁盘IO负载过高、读写请求排队有关。
磁盘是服务器性能的重要组成部分。当数据库查询、日志写入或备份任务产生大量读写请求时,如果磁盘处理能力跟不上,就可能导致请求等待时间增加,进而影响数据库、Web服务以及整个网站的响应速度。
本文将介绍Linux系统中两个常用的磁盘IO监控工具——iostat和iotop,分别从磁盘整体负载和进程读写活动两个角度进行分析,帮助管理员快速定位磁盘IO瓶颈,并根据具体原因采取优化措施。
一、为什么磁盘IO性能会影响服务器响应速度?
服务器运行过程中,文件读取、数据库查询、日志写入以及数据备份等操作,都可能产生磁盘IO请求。当磁盘处理请求的速度跟不上实际需求时,部分进程就需要等待IO完成,导致业务响应时间增加。
例如,数据库执行查询时需要从磁盘读取数据,网站程序也可能频繁写入日志。如果磁盘负载持续处于较高水平,数据库操作可能变慢,PHP等应用进程也会因为等待数据库响应而堆积,最终表现为网页加载缓慢。
这也是为什么有些网站即使升级了CPU和内存,访问速度仍然没有明显改善。问题可能并不在计算资源,而是磁盘读写性能已经成为新的瓶颈。
不同存储设备的性能表现也存在差异。机械硬盘的随机读写延迟通常高于SSD,而SSD在高并发读写或持续写入压力较大的情况下,同样可能出现IO排队。因此,遇到服务器卡顿时,除了检查CPU和内存使用情况,也需要关注磁盘IO指标。
日常排查可以重点回答两个问题:
- 磁盘整体负载是否过高? 使用iostat查看磁盘读写速率、等待时间和利用率。
- 哪些进程正在大量读写磁盘? 使用iotop定位具体的IO活动进程。
下面分别介绍这两个工具的使用方法。
二、使用iostat监控磁盘整体负载
iostat是Linux系统中常用的磁盘IO监控工具,属于sysstat工具包,可以查看设备的读写速率、IO请求数量、平均等待时间及利用率等信息。
如果服务器尚未安装iostat,可以根据系统类型执行以下命令。
Debian / Ubuntu:
apt update
apt install sysstat
CentOS / AlmaLinux / Rocky Linux:
yum install sysstat
安装完成后,执行以下命令:
iostat -xz 1
其中:
-x:显示扩展磁盘IO统计信息;-z:隐藏没有活动的设备;1:每隔1秒刷新一次统计数据。
运行后,终端会持续输出各个磁盘设备的IO情况。排查时可以重点关注以下指标:
| 指标 | 含义 | 排查参考 |
|---|---|---|
%util |
设备处于活动状态的时间占比 | 持续接近100%时,需要关注设备是否接近饱和 |
await |
每个IO请求的平均等待时间,单位为毫秒 | 数值持续升高,可能意味着IO请求等待时间增加 |
r/s |
每秒完成的读请求数量 | 用于判断磁盘读取活动 |
w/s |
每秒完成的写请求数量 | 用于判断磁盘写入活动 |
aqu-sz |
平均IO队列长度 | 持续升高时,需要关注请求排队情况 |
其中,%util和await是排查磁盘IO问题时比较重要的指标。
例如,某块磁盘的%util长期接近100%,同时await从平时的几毫秒上升到80ms,说明设备持续处于繁忙状态,IO请求的平均等待时间也明显增加。如果此时w/s较高,还可以进一步检查是否存在大量写入任务。
需要注意的是,%util并不能单独作为判断磁盘性能瓶颈的依据。对于支持并行处理IO请求的SSD和NVMe设备,即使利用率较高,也不一定意味着设备已经达到实际性能上限。建议结合await、aqu-sz、读写吞吐量以及业务响应情况综合判断。
如果服务器有多块磁盘,还可以通过对比不同设备的指标,判断是否存在某一块磁盘负载明显偏高的情况。例如,网站文件、数据库数据和日志集中存放在同一块磁盘上,就可能导致该设备承担过多读写任务。
三、使用iotop定位高IO占用进程
通过iostat可以判断磁盘是否存在较高负载,但仅凭设备层面的统计信息,还无法确定具体是哪个程序产生了大量IO请求。
这时可以使用iotop。它能够按照进程或线程展示磁盘读写活动,帮助管理员进一步定位IO占用较高的任务。
如果服务器尚未安装iotop,可以执行以下命令。
Debian / Ubuntu:
apt update
apt install iotop
CentOS / AlmaLinux / Rocky Linux:
yum install iotop
安装完成后,建议使用root权限运行:
iotop -oP
其中:
-o:只显示当前存在IO活动的进程;-P:按照进程聚合IO信息,而不是分别显示线程。
运行后,可以观察各个进程的磁盘读写情况。建议持续观察一段时间,例如30秒左右,记录读写量较大的进程,并结合业务运行时间判断是否存在异常任务。
在实际运维中,以下几类进程比较容易成为磁盘IO负载过高的原因:
1. 数据库进程
例如MySQL的mysqld进程。当数据库执行大量查询、数据写入、临时表操作或备份任务时,可能产生较高的磁盘IO负载。
如果发现数据库进程长期占据较高的写入量,可以进一步检查慢查询日志、数据库执行计划以及索引配置,判断是否存在低效查询或不合理的数据处理任务。
2. 日志写入进程
网站访问日志、应用运行日志以及调试日志都可能产生持续写入。如果日志级别设置过高,或者某个程序出现异常并持续输出日志,就可能增加磁盘写入压力。
可以使用以下命令查看日志目录占用情况:
du -sh /var/log/*
如果某个日志文件或目录增长异常,需要进一步检查对应服务的日志配置和运行状态。
3. 备份与数据同步任务
网站备份、数据库导出、文件压缩以及rsync同步等操作,通常会在短时间内产生大量磁盘读写。
如果这些任务集中在业务访问高峰期执行,就可能与正常的网站访问和数据库操作争抢磁盘资源。建议结合任务执行时间和IO监控结果进行判断,必要时将备份任务调整到业务低峰期。
4. Swap交换空间活动
当系统可用内存不足时,Linux可能使用Swap交换空间,将部分内存数据换出到磁盘。频繁的换入和换出操作会增加磁盘IO负载。
如果在iotop中发现kswapd等相关进程活动明显,可以进一步使用free -h、vmstat等命令检查内存和Swap使用情况,判断是否存在内存压力。
四、结合iostat和iotop排查磁盘IO瓶颈
了解两个工具的基本用法后,可以将它们结合起来进行实际排查。
假设某台运行WordPress网站的VPS,白天访问量增加后,页面响应时间从平时的800ms上升到5秒以上,但CPU使用率不足20%,内存也比较充足。此时可以按照以下步骤排查。
第一步:检查磁盘整体负载
运行:
iostat -xz 1
监控结果显示,数据盘vdb的%util长期处于95%以上,await达到60ms,而系统盘vda的相关指标相对正常。
由此可以初步判断,问题可能集中在数据盘,需要进一步检查该磁盘上的读写任务。
第二步:定位高IO占用进程
运行:
iotop -oP
持续观察约30秒后,发现MySQL的mysqld进程写入速度维持在每秒8MB左右,在当前活跃进程中占比较高。
进一步检查数据库任务,发现每天白天都会执行一个统计任务,该任务需要扫描大量数据,并产生临时表写入操作。
第三步:针对性优化
结合排查结果,可以采取以下措施:
- 为统计任务涉及的数据库表补充合适的索引,减少不必要的数据扫描;
- 将统计任务调整到凌晨3点等业务访问低峰期执行;
- 优化数据库查询逻辑,降低临时表读写带来的磁盘压力。
调整后,在相同业务时段再次使用iostat进行监控,发现await回落至4ms左右,%util降至30%以下,网站页面响应时间也恢复到1秒以内。
通过这个案例可以看出,磁盘IO排查的重点不只是发现设备负载过高,还需要进一步找到产生负载的具体进程和业务任务。只有明确瓶颈所在,才能采取更有针对性的优化措施,避免盲目升级服务器配置。
五、常见磁盘IO问题及优化方法
定位到高IO进程后,还需要根据具体原因选择合适的处理方式。以下是服务器运维中比较常见的几种情况。
1. 日志文件持续增长
如果日志写入占用了较多磁盘资源,可以检查日志级别和轮转策略,使用logrotate对日志进行定期轮转,并将不必要的调试日志调整为正常运行级别,减少持续写入。
2. 数据库写入压力过大
如果主要负载来自数据库,可以优先检查慢查询、索引和SQL执行计划,减少不必要的全表扫描和重复写入。
对于MySQL InnoDB,还可以根据业务对数据安全性和性能的要求,评估innodb_flush_log_at_trx_commit等参数。但这类参数会影响事务日志刷盘行为及数据安全性,不建议在不了解业务容错要求的情况下直接修改。
3. 多个服务争抢同一块磁盘
如果数据库、网站文件和日志都集中存放在同一块磁盘上,可以根据服务器配置和业务需求合理规划存储布局。例如,将数据库数据与系统文件、日志分开存放,减少不同服务之间的IO资源竞争。
4. 磁盘硬件性能不足或存在健康问题
如果没有发现明显的异常进程,但磁盘等待时间仍然持续偏高,可以进一步检查存储设备的性能和健康状态。
对于支持SMART检测的设备,可以使用以下命令查看磁盘健康信息:
smartctl -a /dev/vdb
如果发现重映射扇区数量持续增加、设备健康状态异常等情况,应及时备份重要数据,并评估更换磁盘的必要性。
如果经过软件优化后,磁盘IO仍然无法满足业务需求,就需要考虑升级存储配置。例如,数据库和高并发网站通常对随机读写性能有较高要求,使用SSD或NVMe存储可以改善部分IO密集型场景下的性能表现。
HostEase提供多种服务器产品,其中HostEase独立服务器采用SSD存储方案,适合对磁盘读写性能有较高要求的网站、数据库及业务应用。用户可以根据业务规模、数据量和实际IO需求选择合适的服务器配置。
六、总结:建立日常磁盘IO监控习惯
服务器出现CPU和内存使用率不高、网站却频繁卡顿的情况时,不妨将磁盘IO纳入排查范围。通过iostat和iotop两个工具,可以形成一套比较清晰的排障流程:
- 使用iostat检查磁盘整体负载,重点关注
%util、await和aqu-sz等指标; - 使用iotop定位高IO进程,找出持续读写磁盘的程序或任务;
- 根据具体原因进行优化,包括调整数据库查询、优化日志配置、错峰执行备份任务或升级存储设备;
- 优化后再次监控验证,对比相同业务时段的磁盘指标和网站响应时间,确认优化效果。
日常运维中,建议结合服务器历史负载设置合理的监控告警,并定期检查日志增长、数据库运行状态和备份任务执行情况。及时发现磁盘IO异常,可以减少网站卡顿和业务中断的风险。
如果现有服务器的存储性能已经难以满足业务增长需求,也可以了解HostEase独立服务器,根据网站访问量、数据库负载及存储需求选择更合适的硬件配置。对于需要长期稳定运行的网站和业务系统,持续监控与合理规划存储资源同样重要。
HostEase官网:点击直达
