一篇学会 IO 问题排查
一 背景
IO性能排查,只要工具齐全,按照套路排查,相对来说还是比较容易查的。
二 一般步骤
2.1 预览io性能是否有问题
先通过top命令,检查wa的cpu是否占用高,如果高,那就需要排查哪个进程引起的IO问题了,是否合理。
一般来说还习惯先用df -h 和df -ih排查下磁盘空间是否占满,inode节点是否占满。
iostat 进行普遍的磁盘性能观测,如下:
[root@localhost ~]# iostat -x -d 1Linux 4.18.0-348.2.1.el8_5.x86_64 (localhost.localdomain) 2021年12月07日 _x86_64_ (8 CPU)Device r/s w/s rkB/s wkB/s rrqm/s wrqm/s %rrqm %wrqm r_await w_await aqu-sz rareq-sz wareq-sz svctm %util sda 5.81 1.22 309.14 101.03 0.08 0.37 1.39 23.45 19.39 3.88 0.12 53.21 82.55 4.62 3.25scd0 0.03 0.00 0.70 0.00 0.00 0.00 0.00 0.00 9.97 0.00 0.00 26.24 0.00 10.15 0.03scd1 0.01 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.22 0.00 0.00 0.17 0.00 0.89 0.00dm-0 5.56 1.53 290.23 77.20 0.00 0.00 0.00 0.00 19.87 1.72 0.11 52.16 50.33 4.51 3.20dm-1 0.07 0.00 1.49 0.00 0.00 0.00 0.00 0.00 0.88 0.00 0.00 22.65 0.00 0.89 0.011.2.3.4.5.6.7.8.
解释:
r/s : 每秒发送给此磁盘的合并后读请求数量。 w/s : 每秒发送给此磁盘的合并后写请求数量。 rkB/s : 每秒从磁盘读取的数据量,单位是KB。 wkB/s: 每秒向此磁盘写入的数据量,单位是KB。 rrqm/s : 每秒合并的读请求数;加上%标识合并的读请求的百分比。 wrqm/s : 每秒合并的写请求数;加上%标识合并的写请求的百分比。 r_await:平均每个读请求处理的平均时长,单位为ms,包括排队时间和实际磁盘处理时间。 w_await: 平均每个写请求处理的平均时长,单位为ms,包括排队时间和实际磁盘处理时间。 aqu-sz: 平均请求队列的长度 rareq-sz :平均读请求大小,单位为KB。 wareq-sz: 平均写请求大小,单位为KB。 svctm:处理IO请求的平均时间,不包括等待时间,不可信尴尬。%util : 向设备发出I/O请求所占用的时间百分比(设备的带宽利用率)。当该值为时,设备饱和,串行服务的设备,接近100%,对于并行请求,并不能反应磁盘设备极限。1.2.3.4.5.6.7.8.9.10.11.12.13.
其实man iostat 看的就比较清楚了,写下来,只是为了记忆一遍,加深点印象。 说明:
-
r/s+ w/s ,就是 IOPS;
-
%util ,就是我们前面提到的磁盘 I/O 使用率;
-
rkB/s+wkB/s ,就是吞吐量;
-
r_await+w_await ,就是响应时间。
2.2 定位具体的IO大的任务
iostat 看整体性能是否达到了瓶颈,我们要排查具体哪个程序占用IO比较大,采用pidstat命令:
[root@localhost ~]# pidstat -d 1Linux 4.18.0-305.3.1.el8.x86_64 (localhost.localdomain) 12/07/2021 _x86_64_ (56 CPU)09:46:06 PM UID PID kB_rd/s kB_wr/s kB_ccwr/s iodelay Command09:46:07 PM 0 4597 0.00 1502.91 0.00 0 xxxx1.2.3.4.5.
解释:
UID : 用户ID PID : 进程ID kB_rd/s : 每秒读取的数据大小 单位是 KB。 kB_wr/s: 每秒写的数据大小 单位是KB。 kB_ccwr/s: 每秒取消写请求数量大小,单位是KB。 iodelay :块IO延迟,包括同步块IO和换入块时间,单位为时钟周期1.2.3.4.5.6.
还可以通过iotop查看IO使用的排行,非常方便:
08:59:08 Total DISK READ : 0.00 B/s | Total DISK WRITE : 0.00 B/s08:59:08 Actual DISK READ: 0.00 B/s | Actual DISK WRITE: 0.00 B/s TIME TID PRIO USER DISK READ DISK WRITE SWAPIN IO COMMAND b'08:59:08 1 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % systemd --switched-root --system --deserialize 18'b'08:59:08 2 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kthreadd]'1.2.3.4.5.
centos有的版本需要单独安装:
yum install iotop1.
2.3 strace进行追踪
strace是跟踪用户空间的进程的系统调用和信号传递的,非常给力。
# 比较简单的方式,-f会追踪fork,或其线程。 strace -pf pid # 更给力的 strace -tt -T -v -f -e trace=file -o /data/log/strace.log -s 1024 -p 23489-tt 显示毫秒时间-T 显示每次调用的花费-v 把调用环境变量也打印出来,-f 跟踪目标进程包括所有子进程-e 控制跟踪的事件和行为 file文件行为,process跟踪进程和进程管理相关的系统调用,ipc跟踪ipc通信的系统调用;network 跟踪网络相关系统调用;signal 跟踪信号处理相关系统调用;desc 跟踪文件描述符相关系统调用-o 输出到文件-s 参数最长字符串,10241.2.3.4.5.6.7.8.9.10.11.
2.4 给力的filetop
linux 内核在4.1以上版本的内核支持bcc工具集合,这个工具集非常有用,比如这个filetop,查看具体文件的IO大小,如下:
[root@localhost tools]# ./filetop -C Tracing... Output every 1 secs. Hit Ctrl-C to end09:39:02 loadavg: 0.07 0.06 0.01 1/280 10779TID COMM READS WRITES R_Kb W_Kb T FILE10779 filetop 2 0 15 0 R loadavg10779 filetop 1 0 4 0 R type10779 filetop 1 0 4 0 R retprobe10779 filetop 2 0 0 0 R _bootlocale.cpython-36.pyc1.2.3.4.5.6.7.8.
分别对应:tid线程id,comm 线程命令行, READS WRITES 读写次数, R_Kb W_Kb 读写大小,T文件类型 FILE: 文件名。
centos安装:
yum install bcc-tools export PATH=$PATH:/usr/share/bcc/tools1.2.3.
三 额外bcc工具
3.1 execsnoop
这个也是bcc工具集合里面的工具,通过 ftrace 实时监控进程的 exec() 行为,并输出短时进程的基本信息,对于一些奇怪的短时进程的查找非常有帮助。
[root@localhost tools]# ./execsnoop PCOMM PID PPID RET ARGS dmsetup 11391 1787 0 /usr/sbin/dmsetup status --target thin-poolpmie_check 11406 1 0 /usr/libexec/pcp/bin/pmie_check -C sed 11408 11407 0 /usr/bin/sed -e s/"//g /etc/pcp.confawk 11409 11407 0 /usr/bin/awk -F= \n/^PCP_/ && NF == 2 {\n exports=exports" "$1\n printf "%s=${%s:-\"%s\"}\n", $1, $1, $2\n }\nEND { print "export", exports }1.2.3.4.5.6.
3.2 opensnoop
opensnoop通过追踪open()系统调用显示企图打开文件的进程,可以用于定位配置文件或日志文件,有些场合用起来还是挺顺手的。
[root@localhost tools]# ./opensnoop PID COMM FD ERR PATH1075 tuned 21 0 /proc/11378/cmdline1075 tuned 21 0 /proc/11378/stat1023 irqbalance 6 0 /proc/interrupts1023 irqbalance 6 0 /proc/stat1023 irqbalance 6 0 /proc/irq/15/smp_affinity1023 irqbalance 6 0 /proc/irq/15/smp_affinity1685 pmdaproc 7 0 /proc1685 pmdaproc 7 0 /proc/11375/cmdline
我有话说: