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

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

我在使用 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

我昨天在另一篇帖子中也提出了一个后续问题:

答案1

如果你足够幸运,赶上了下一个峰值利用率时期,你可以使用以下方式以交互方式研究每个进程的 I/O 统计数据:iotop

答案2

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

# pidstat -dl 20

每行将包含以下列:

  • 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]              

答案3

没有什么比持续监控更好,事件发生后你根本无法找回时间敏感的数据……

有几件事你可能能够检查牵连或者消除——/proc是你的朋友。

sort -n -k 10 /proc/diskstats
sort -n -k 11 /proc/diskstats

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

cut -d" " -f 1,2,42 /proc/[0-9]*/stat | sort -n -k +3

这些字段是 PID、命令和累计 IO 等待时间。这将显示您的热进程,尽管只有如果他们还在运行. (您可能想要忽略文件系统日志线程。)

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

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

(现在去为未来的自己做点好事,安装 Munin/Nagios/Cacti/whatever ;-)

答案4

使用btrace。它很容易使用,例如btrace /dev/sda。如果命令不可用,则可能在包中可用黑踪

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

相关内容