查看系统磁盘整体 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 写入 300m
lsof -p 18940
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
Java 18940 root cwd DIR 0,50 4096 1549389 /
…
Java 18940 root 2u CHR 136,0 0t0 3 /dev/pts/0
Java 18940 root 3w REG 8,1 117944320 303 /tmp/logtest.txt
----
FD 表示文件描述符号,TYPE 表示文件类型,NODE NAME 表示文件路径
lsof 也可以看出进程 18940 以每次 300MB 的速度往 /tmp/logtest.txt 写入