磁盘IO高排查方法

查看系统磁盘整体 I/O:

iostat -x -k -d 1 1
Linux 3.10.0-1160.118.1.el7.x86_64 (localhost.localdomain)      2024年06月29日  _x86_64_        (1 CPU)

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.00     0.03    1.34    0.68    29.34     7.49    36.56     0.00    0.56    0.35    0.96   0.29   0.06
scd0              0.00     0.00    0.00    0.00     0.26     0.00   114.22     0.00    1.72    1.72    0.00   1.33   0.00
dm-0              0.00     0.00    1.21    0.71    26.27     6.97    34.63     0.00    0.63    0.36    1.09   0.28   0.05
dm-1              0.00     0.00    0.02    0.00     0.57     0.00    50.09     0.00    0.20    0.20    0.00   0.10   0.00

# -x: 显示扩展的磁盘统计信息
# -k: 以KB为单位显示数据(而不是默认的块数)
# -d: 只显示磁盘统计信息(不显示CPU统计)
# 1 1: 第一个1表示每秒刷新一次,第二个1表示只显示一次报告

# rrqm/s:   每秒对该设备的读请求被合并次数,文件系统会对读取同块(block)的请求进行合并
# wrqm/s:   每秒对该设备的写请求被合并次数
# r/s:      每秒完成的读次数
# w/s:      每秒完成的写次数
# rkB/s:    每秒读数据量(kB为单位)
# wkB/s:    每秒写数据量(kB为单位)
# avgrq-sz: 平均每次IO操作的数据量(扇区数为单位)
# avgqu-sz: 平均等待处理的IO请求队列长度
# await:    平均每次IO请求等待时间(包括等待时间和处理时间,毫秒为单位)
# svctm:    平均每次IO请求的处理时间(毫秒为单位)
# %util:    采用周期内用于IO操作的时间比率,即IO队列非空的时间比率

查看进程级别 I/O:

pidstat -d 1 # 每1秒刷新一次进程I/O数据
Linux 3.10.0-1160.118.1.el7.x86_64 (localhost.localdomain)      2024年06月29日  _x86_64_        (1 CPU)

15时43分27秒   UID       PID   kB_rd/s   kB_wr/s kB_ccwr/s  Command
15时43分27秒     0         1     10.95      0.04      0.00  systemd
15时43分27秒     0       483      0.25      0.00      0.00  systemd-journal
15时43分27秒     0       508      3.44      0.00      0.00  systemd-udevd
15时43分27秒     0       509      0.02      0.00      0.00  lvmetad
15时43分27秒     0       627      0.02      3.82      0.00  auditd
15时43分27秒    81       650      0.28      0.00      0.00  dbus-daemon
15时43分27秒     0       652      0.16      0.00      0.00  systemd-logind
15时43分27秒     0       653      1.26      0.00      0.00  VGAuthService
15时43分27秒     0       654      0.83      0.00      0.00  vmtoolsd
15时43分27秒   999       655      1.51      0.00      0.00  polkitd
15时43分27秒     0       657      1.48      0.01      0.00  NetworkManager

# kB_rd/s   每秒从磁盘读取的KB
# kB_wr/s   每秒写入磁盘KB
# kB_ccwr/s 任务取消的写入磁盘的KB。当任务截断脏的pagecache的时候会发生
# Command   进程执行命令

当使用 pidstat -d 定位到哪个应用服务时,接下来则需要使用 strace 和 lsof 定位是那些代码在读写磁盘里的哪些文件,导致 IO 高的原因:

strace -p 18940
strace: Process 18940 attached
...
mmap(NULL, 314576896, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f0f7aee9000
mmap(NULL, 314576896, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f0f682e8000
write(3, "2018-12-05 15:23:01,709 - __main"..., 314572844
) = 314572844
munmap(0x7f0f682e8000, 314576896)       = 0
write(3, "\n", 1)                       = 1
munmap(0x7f0f7aee9000, 314576896)       = 0
close(3)                                = 0
stat("/tmp/logtest.txt.1", {st_mode=S_IFREG|0644, st_size=943718535, ...}) = 0

strace 命令输出可以看到进程 18940 正在大量往文件 /tmp/logtest.txt.1 写入

posted @ 2025-08-12 21:29  阿峰博客站  阅读(15)  评论(0)    收藏  举报