我在使用 Linux 系统时遇到了问题,我发现sysstat
并sar
报告磁盘 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 的进程。