![查找在特定驱动器上产生大量 IO 负载的进程](https://linux22.com/image/767195/%E6%9F%A5%E6%89%BE%E5%9C%A8%E7%89%B9%E5%AE%9A%E9%A9%B1%E5%8A%A8%E5%99%A8%E4%B8%8A%E4%BA%A7%E7%94%9F%E5%A4%A7%E9%87%8F%20IO%20%E8%B4%9F%E8%BD%BD%E7%9A%84%E8%BF%9B%E7%A8%8B.png)
我们的一个基于 Debian 的 Proxmox 虚拟机管理程序在 Raid1 HDD 阵列上存在高 IO 负载问题,该阵列主要用于在其上运行的 Linux VM 的根文件系统和主文件系统。
我们有基于 CollectD 的图表,可以清楚地看到几天前读取操作的数量发生了巨大变化。但是,这些图表并不能看出哪个过程导致了负载。
是否有类似 iotop 或 dstat 的工具可以显示产生最大负载的进程,但仅限于特定驱动器?由于服务器还具有高负载的 SSD 阵列,因此这些工具的所有结果都完全无用。
答案1
有一个工具可以显示对给定块设备生成块设备访问的进程。然后,您可以利用结果数据找出导致最大 I/O 负载的原因:blktrace
和它的同伴blkparse
. 手册页中有几个示例。
例如:
% blktrace -d /dev/sda -o - | blkparse -i -
或者简单地使用btrace
包装器:
% btrace /dev/sda
将显示实时活动/dev/sda
,包括具有 PID 和名称的用户进程,以及内核线程(例如:dmcrypt 线程),以及停止时的一些统计信息(不包括任何进程)。
标准模式是先blktrace
记录,然后再blkparse
进行解释。
通过改变过滤面罩在blktrace
和输出格式然后blkparse
应该向管道中的另一个工具提供适当的信息,该工具负责对相关结果进行排序并将其与其他来源(如流程会计或其他日志)关联。