服务器风扇狂转?别慌!手把手教你用top和iostat揪出磁盘I/O这个‘元凶’
服务器风扇狂转别把手弄脏用这些工具揪出磁盘I/O的真凶那天凌晨三点手机突然响起刺耳的告警声。机房温度超标服务器风扇转速突破安全阈值。作为值班工程师我揉了揉惺忪的睡眼脑海中闪过无数可能CPU过热内存泄漏还是最棘手的——磁盘I/O暴走这种紧急状况下我们需要像侦探破案一样用专业工具层层排查最终锁定那个让服务器发高烧的元凶。1. 第一现场快速确认症状冲进机房时服务器的轰鸣声已经盖过了空调运转声。面对这种突发状况切忌直接重启——那会销毁所有现场证据。我做的第一件事是连接KVM用最基础的命令快速建立问题画像uptime 14:03:21 up 27 days, 8:32, 2 users, load average: 15.32, 10.45, 7.89这个简单的命令已经透露关键信息15.32的1分钟负载远超4核CPU的承受能力经验值是负载不超过核心数×0.7。但高负载可能由多种因素引起需要进一步区分是CPU密集型任务还是我们最担心的I/O等待。专业提示当load average中1分钟值显著高于15分钟值时往往说明突发性资源争用而非长期性能瓶颈2. 凶器鉴定top命令的深度验尸真正的排查从top命令开始这个瑞士军刀能给出进程级的资源消耗快照。但大多数人只盯着CPU%和MEM%看忽略了真正有价值的**wa(iowait)**指标top - 14:05:03 up 27 days, 8:34, 2 users, load average: 16.01, 11.23, 8.12 Tasks: 231 total, 5 running, 226 sleeping, 0 stopped, 0 zombie %Cpu(s): 15.3 us, 8.2 sy, 0.0 ni, 12.1 id, 64.4 wa, 0.0 hi, 0.0 si, 0.0 st看到那触目惊心的64.4% wa了吗这意味着CPU有近三分之二的时间在等待磁盘I/O完成。此时即便CPU使用率看起来不高15.3% us 8.2% sy系统也会卡顿得像老牛拉车。关键观察点技巧当wa持续30%时磁盘已成系统瓶颈结合running任务数本例中5个判断并发争用程度按ShiftW保存当前视图方便后续对比3. 犯罪现场重建iostat的时空分析确认I/O问题后需要用iostat进行微观层面的磁盘行为分析。建议使用-x参数获取扩展统计-d参数指定设备并设置2秒的刷新间隔iostat -xdm sda 2 Device: rrqm/s wrqm/s r/s w/s rMB/s wMB/s avgrq-sz await r_await w_await svctm %util sda 0.00 128.57 285.71 42.86 4.48 0.69 34.22 25.33 12.45 89.14 3.04 99.80这份输出就像磁盘的体检报告每个指标都在诉说不同的故事%util 99.8%磁盘已经满负荷运转await 25.33ms平均I/O响应时间超标SSD通常应5msw_await 89.14ms写入延迟异常高暗示可能的写入风暴rMB/s 4.48读取吞吐量并不算高排除大数据扫描可能实战经验当%util70%且await显著高于设备基准值时就该考虑优化I/O路径了4. 真凶指认iotop的精准抓捕现在我们知道磁盘在受苦但还不知道是哪个进程在施虐。这时就需要iotop这个进程级I/O监控神器iotop -oP Total DISK READ: 4.38 M/s | Total DISK WRITE: 0.68 M/s PID PRIO USER DISK READ DISK WRITE SWAPIN IO COMMAND 4567 be/4 mysql 4.23 M/s 0.12 M/s 0.00 % 85.21 % mysqld~innodb 8912 be/4 backup 0.15 M/s 0.56 M/s 0.00 % 12.43 % pg_dump真相大白MySQL进程占用了85.21%的I/O时间结合之前的w_await异常基本可以判定是InnoDB在疯狂刷脏页。而pg_dump这个备份程序的出现解释了为什么问题会在这个时间点突然爆发。5. 案件收尾lsof的物证固定作为最后的证据固定我们用lsof查看MySQL具体在操作哪些文件lsof -p 4567 | grep -E \.ibd|\.ibdata COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME mysqld 4567 mysql mem REG 253,0 120401 /var/lib/mysql/ibdata1 mysqld 4567 mysql mem REG 253,0 120403 /var/lib/mysql/ib_logfile0发现大量.ibd文件InnoDB表空间被频繁访问后解决方案就清晰了临时调整innodb_io_capacity参数限制写入速度检查是否有未优化的全表扫描查询重新规划备份时间避免业务高峰那次事件后我在服务器机柜旁贴了张便签当风扇开始咆哮时记住这个排查链条uptime → top wa → iostat await → iotop → lsof。这套方法后来帮团队快速解决了至少七次类似的I/O风暴每次平均节省2小时故障时间。