wa很高之排查

现象:设备按照当前空闲情况是不存在频繁读写磁盘的操作的,但是wa很高又证明在频繁读写

主要判断指标:

%us 过高,则可以在对应服务的线程ID查看具体详情,是否存在死循环,或者长时间的阻塞调用。
%sy 过高,则先使用 strace 定位具体的系统调用,再定位是哪里的应用代码导致的。
%si 过高,则可能是网络问题导致软中断频率飙高。
%wa 过高,则是频繁读写磁盘导致的,可以通过iostat,iotop。

 排查:

  1. 找出具体读写的是哪个磁盘

出现io很高,通过iostat 命令查看io状态信息

iostat只要用于输出CPPU和磁盘IO的相关的统计信息

   格式: iostat 选项 时间间隔 次数

     -c 单独输出Device的信息不包括CPU信息

     -k/m:输出结果以kb或者是mb为单位,而不是以扇区数量为单位

  -x:输出更详细的磁盘io的信息

输出结果的重点参数:

    iowait%:表示CPU等待的是io时间占用整个cpu周期的百分比。

    avgqu-sz表示的是磁盘io的队列长度,即io的等待个数

    await:表示的是io请求时间,等待时间和处理时间

    svctm:表示的是每次请求的处理的时间

    %util表示的是磁盘的忙碌情况,如果>80%就是磁盘可能处于忙碌状态

 

 其中-x知指明输出更加详细的信息。2 5表示间隔2秒统计一次总共输出5次。第一行结果是自系统启动以来的统计值,通常排查突发的I/O异常时可忽略。重点看%util列,表示进程使用I/O的比例

2、找出引起高io的进程

简单的是iotop命令,比如

1
2
3
4
Total DISK READ: 404.95 K/s | Total DISK WRITE: 9.91 M/s
  TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN     IO>    COMMAND                                                                                               
 3153 be/3 root        0.00 B/s    3.78 K/s  0.00 %  6.23 % [jbd2/sda5-8]
10287 be/4 mysql     253.57 K/s 1858.24 K/s  0.00 %  3.73 % mysqld --defaults-file=/etc/my.cnf --basedir=/opt/my~--pid-file

 

iotop命令确实是一个很好用的工具,但是很多Linux发行版中默认并没有安装。如果系统里没有这个命令,又不想安装时,怎么办?有没有更简单的方式?

能够实现iotop类型功能的ps命令

首先看下进程状态编码

1
2
3
4
5
6
7
8
PROCESS STATE CODES
 D uninterruptible sleep (usually IO)
 R running or runnable (on run queue)
 S interruptible sleep (waiting for an event to complete)
 T stopped, either by a job control signal or because it is being traced.
 W paging (not valid since the 2.6.xx kernel)
 X dead (should never be seen)
 Z defunct ("zombie") process, terminated but not reaped by its parent.

 

注意到,如果进程正在等待I/O,进行的状态码经常为D。通过这个信息,我们可以大概估算出哪些进程在I/O等待中,比如

1
2
3
4
5
6
7
8
9
10
11
12
[root@myos ~]# for x in `seq 1 1 10`; do ps -eo state,pid,cmd | grep "^D"; echo "----"; sleep 5; done
----
----
----
D 27456 php-fpm: pool www
----
----
----

这里就发现进行 27456 可能有问题。但等待I/O也不一定说明它在疯狂读写磁盘。为了确定它确实读写很多,可以用/proc目录下的信息来定位,比如

1
2
3
4
5
6
7
8
[root@myos ~]# cat /proc/27456/io
rchar: 42857442
wchar: 35657666
syscr: 44932
syscw: 9744
read_bytes: 1530859520
write_bytes: 13824000
cancelled_write_bytes: 1249280

3、查看进程频繁读写哪个文件

 

1
2
3
4
5
6
7
8

lsof是一个列出当前系统打开文件的工具,在Linux下,任何事物都以文件的形式存在,通过文件不仅可以访问数据,还以访问网络连接和硬件。
lsof 选项 参数
-a 列出打开文件存在的进程
-c 列出指定进程打开的文件
-p 列出指定进程打开的文件
-u 列出uid号进程详细
+D 递归列出目录下被打开的文件
-d 列出占用该文件的进程
——————————————

 

引用大佬:https://www.cnblogs.com/wyf0518/p/12213790.html

posted @   luckyRun  阅读(431)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
点击右上角即可分享
微信分享提示