Linux云服务器磁盘I/O负载高怎么办?
问题描述
- 出现系统运行卡顿、文件读写变慢、应用性能下降或内部服务响应慢等问题。
- 通过ECS控制台查看实例磁盘I/O负载监控时,发现磁盘I/O负载过高(参考值:当前I/O读写≥该云盘I/O性能指标的80%,可认为I/O负载过高)。
- 收到了磁盘I/O负载超过设定阈值的告警信息。
排查步骤
本文相关操作命令以CentOS 7.9 64位操作系统为例。其它版本的Linux操作系统命令可能有所差异,具体情况请参阅相应操作系统的官方文档。
- 使用iostat查看整体磁盘I/O负载。
iostat是一款Linux系统中监控I/O性能的工具,可以查看磁盘整体I/O负载情况。
- 登录弹性云服务器,具体操作,请参见Linux ECS登录方法概述。
- 执行如下命令,查看系统I/O负载情况。
如遇到“iostat: command not found”说明命令未安装,需要先执行sudo yum install sysstat –y安装。
- -d:仅显示设备统计信息,不显示CPU使用情况。
- -m:以MB为单位显示。
- -x:显示扩展信息。
- -y:省略自系统启动以来的第一个统计报告。
- 3:统计时间间隔。
- 5:统计次数。
图1 操作结果回显结果中各项参数说明如下。更多参数说明,请运行man iostat查看。
重点关注以下统计值:
- Device:磁盘设备名称。
- r/s:每秒读操作次数。
- w/s:每秒写操作次数。
- rMB/s:磁盘读速率,单位MB。
- wMB/s:磁盘写速率,单位MB。
- r_await、w_await:磁盘读、写时延,单位为毫秒ms。
- %util:io利用率,代表磁盘的繁忙程度。
云盘性能规格详见云硬盘类型及性能介绍。
- 使用iotop查看进程的磁盘IO负载。
iotop是一个用来监视磁盘I/O使用状况的工具,可以查看单个进程的磁盘IO负载。
- 执行如下命令,安装iotop。
HCE / CentOS / Euler:yum install -y iotop
Ubuntu / Debian:apt install iotop
- 执行如下命令,查看磁盘I/O负载。
- -P:显示PID。
- -k:以KB为单位显示。
回显结果示例如下。输出结果默认按IO列排序,可以使用按键的左右方向键切换排序。如需退出程序,请按q键。
图2 操作结果关于回显结果的参数说明如下
- PID:进程ID。
- DISK READ:进程读操作的I/O速度。
- DISK WRITE:进程写操作的I/O速度。
- SWAPIN:进程等待从交换空间(Swap Space)换入(Swap In)内存页面所占用的 CPU 时间百分比。
- IO:进程因 I/O 等待所占用的 CPU 时间百分比(包括 Swap 换入和磁盘 I/O 等待)。
- COMMAND:进程的命令名称。
- 执行如下命令,安装iotop。
- 处理磁盘I/O负载高的问题。
表1 磁盘I/O负载高问题原因及解决方案 问题现象
原因
解决方案
异常用户程序或进程长时间占用大量磁盘I/O资源。
该程序为异常程序或进程,运行时占用过多磁盘I/O资源。
通过在iotop工具定位到占用磁盘I/O资源较多的程序的PID,并通过sudo kill -9 <PID>来结束该进程。
注意:在您结束进程前,请务必确保您了解该进程的相关信息,避免因误操作导致您的业务中断。
如果怀疑进程为恶意程序,您可以对其进行查杀,相关操作请参见病毒查杀。
正常用户程序或进程长时间占用大量磁盘I/O资源。
该程序为正常业务程序或进程,运行时占用过多磁盘I/O资源。
如果云盘出现磁盘I/O性能瓶颈,您可以根据实际情况选择对应的处理方案:
- 变更云盘类型:当使用SSD云盘出现磁盘I/O瓶颈时,您可以选择更换云盘类型为ESSD,以提升云盘性能。相关操作,请参见变更云盘类型。
- 通过LVM提升云盘性能:详见如何提升云硬盘的性能。
收到磁盘I/O使用率高的告警,iostat查看%util值很高(>90%)。但磁盘的iops或者吞吐量不高。
iostat自身统计问题
查看磁盘时延await指标,如果await不高(<1ms)则无需处理。由于磁盘支持并发IO,%util仅代表磁盘的繁忙程度,无法反应磁盘是否到达IO瓶颈。
云盘性能规格详见云硬盘类型及性能介绍。
磁盘IO读写高,iotop输出显示jbd2进程IO列占比最高。
jbd2(Journaling Block Device 2)是ext3/ext4文件系统的日志管理进程,负责元数据操作的原子性和崩溃恢复。jbd2高I/O占用源于频繁的日志提交,在大量小文件写入、大量直接IO或元数据变更时触发
jbd2进程不是引起高IO问题的元凶,需要找到实际产生高IO的进程,查看iotop的DISK READ和DISK WRITE列。