如何检查每个进程的磁盘 I/O 利用率?

Ava*_*vra 57 linux storage io

我在使用 Linux 系统时遇到问题,我发现sysstatsar报告了磁盘 I/O、平均服务时间以及平均等待时间的巨大峰值。

下次发生这些峰值时,我如何确定哪个过程导致了这些峰值?

有可能sar吗?我可以从已经录制的sar文件中找到这些信息吗?

的输出sar -d,系统停顿发生在下午 12.58-13.01 左右。

12:40:01          DEV       tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util
12:40:01       dev8-0     11.57      0.11    710.08     61.36      0.01      0.97      0.37      0.43
12:45:01       dev8-0     13.36      0.00    972.93     72.82      0.01      1.00      0.32      0.43
12:50:01       dev8-0     13.55      0.03    616.56     45.49      0.01      0.70      0.35      0.47
12:55:01       dev8-0     13.99      0.08    917.00     65.55      0.01      0.86      0.37      0.52
13:01:02       dev8-0      6.28      0.00    400.53     63.81      0.89    141.87    141.12     88.59
13:05:01       dev8-0     22.75      0.03    932.13     40.97      0.01      0.65      0.27      0.62
13:10:01       dev8-0     13.11      0.00    634.55     48.42      0.01      0.71      0.38      0.50
Run Code Online (Sandbox Code Playgroud)

对于我昨天开始的另一个线程,我也有这个后续问题:

hal*_*alp 54

如果您有幸赶上下一个使用高峰期,您可以使用iotop 以交互方式研究每个进程的 I/O 统计信息。

  • 太棒了,“iotop -n 1 -b -o”正好提供了我需要的输出。谢谢! (2认同)

小智 41

您可以使用pidstat使用以下命令每 20 秒打印每个进程的累积 io 统计信息:

# pidstat -dl 20
Run Code Online (Sandbox Code Playgroud)

每行将有以下列:

  • PID - 进程 ID
  • kB_rd/s - 任务导致每秒从磁盘读取的千字节数。
  • kB_wr/s - 任务造成或将导致每秒写入磁盘的千字节数。
  • kB_ccwr/s - 任务已取消写入磁盘的千字节数。当任务截断一些脏页面缓存时可能会发生这种情况。在这种情况下,其他任务已被考虑的某些 IO 将不会发生。
  • 命令 - 任务的命令名称。

输出如下所示:

05:57:12 PM       PID   kB_rd/s   kB_wr/s kB_ccwr/s  Command
05:57:32 PM       202      0.00      2.40      0.00  jbd2/sda1-8
05:57:32 PM      3000      0.00      0.20      0.00  kdeinit4: plasma-desktop [kdeinit]              

05:57:32 PM       PID   kB_rd/s   kB_wr/s kB_ccwr/s  Command
05:57:52 PM       202      0.00      0.80      0.00  jbd2/sda1-8
05:57:52 PM       411      0.00      1.20      0.00  jbd2/sda3-8
05:57:52 PM      2791      0.00     37.80      1.00  kdeinit4: kdeinit4 Running...                   
05:57:52 PM      5156      0.00      0.80      0.00  /usr/lib64/chromium/chromium --password-store=kwallet --enable-threaded-compositing 
05:57:52 PM      8651     98.20      0.00      0.00  bash 

05:57:52 PM       PID   kB_rd/s   kB_wr/s kB_ccwr/s  Command
05:58:12 PM       202      0.00      0.20      0.00  jbd2/sda1-8
05:58:12 PM      3000      0.00      0.80      0.00  kdeinit4: plasma-desktop [kdeinit]              
Run Code Online (Sandbox Code Playgroud)


mr.*_*tic 18

没有什么比持续监控更好的了,您根本无法在事件发生后取回对时间敏感的数据......

然而,有几件事你可以检查以暗示或消除——/proc是你的朋友。

sort -n -k 10 /proc/diskstats
sort -n -k 11 /proc/diskstats
Run Code Online (Sandbox Code Playgroud)

字段 10、11 是累积写入扇区和累积时间(ms)写入。这将显示您的热文件系统分区。

cut -d" " -f 1,2,42 /proc/[0-9]*/stat | sort -n -k +3
Run Code Online (Sandbox Code Playgroud)

这些字段是 PID、命令和累积 IO 等待滴答。这将显示您的热进程,但前提是它们仍在运行。(您可能想忽略文件系统日志线程。)

上述内容的有用性取决于正常运行时间、长时间运行的进程的性质以及文件系统的使用方式。

注意事项:不适用于 2.6 之前的内核,如果不确定,请查看您的文档。

(现在去帮你未来的自己一个忙,安装 Munin/Nagios/Cacti/任何 ;-)


小智 12

使用atop. ( http://www.atoptool.nl/ )

将数据写入压缩文件,atop稍后可以以交互方式读取。每 10 秒读取一次读数 (delta)。做 1080 次(3 小时;所以如果你忘记了它,输出文件不会让你用完磁盘):

$ atop -a -w historical_everything.atop 10 1080 &
Run Code Online (Sandbox Code Playgroud)

坏事再次发生后:

(即使它仍在后台运行,它也只是每 10 秒追加一次)

% atop -r historical_everything.atop
Run Code Online (Sandbox Code Playgroud)

既然你说 IO,我就按 3 个键:tdD

t - move forward to the next data gathering (10 seconds)
d - show the disk io oriented information per process
D - sort the processes based on disk activity
T - go backwards 1 data point (10 seconds probably)
h - bring up help
b - jump to a time (nearest prior datapoint) - e.g. b12:00 - only jumps forward
1 - display per second instead of delta since last datapiont in the upper half of the display
Run Code Online (Sandbox Code Playgroud)


Jan*_*nen 6

使用btrace. 例如,它很容易使用btrace /dev/sda。如果该命令不可用,它可能在blktrace包中可用。

编辑:由于内核中未启用 debugfs,您可以尝试date >>/tmp/wtf && ps -eo "cmd,pid,min_flt,maj_flt" >>/tmp/wtf或类似的方法。记录页面错误当然与使用 btrace 完全不同,但如果你很幸运,它可能会给你一些关于最需要磁盘的进程的提示。我刚刚尝试了我最 I/O 密集型服务器之一,并列出了我知道消耗大量 I/O 的进程。