显示任务/命令/程序的磁盘 IO 读/写摘要的实用程序

显示任务/命令/程序的磁盘 IO 读/写摘要的实用程序

我很确定 Linux 内核有一个允许跟踪的功能全部应用程序的读取和写入 (IO) 以及全部它的孩子,但是我还没有看到任何可以计算并显示它的实用程序。

例如,对于 CPU 时间,您可以简单地使用time并获得简洁的 CPU 使用信息:

$ time cat --version > /dev/null

real    0m0.001s
user    0m0.001s
sys 0m0.000s

我正在寻找有关 IO 的类似内容,例如

$ calc_io task
Bytes read: 123456
Bytes written: 0

当然,我们有/proc/$PID/io包含运行时信息的内容,但跟踪动态生成和销毁子项的应用程序(例如网络浏览器)似乎是一项艰巨的任务。我想如果你运行strace -fF firefox然后监视所有生成的子进程并尝试实时跟踪/proc/$PID/io- 不,似乎太难实现,那么你多久会轮询此文件以获取信息?孩子可能只存在一瞬间。

另一个想法是使用cgroups,但是如果我不想使用它们怎么办?我也查了一下/sys/fs/cgroup,没有看到任何相关的统计数据。

答案1

我看到这篇文章并发现它非常有趣。我认为这个问题并不难,因为你问的问题毕竟是很自然的。

我只能找到一个不完美且不完整的解决方案。无论如何,我决定发布它,因为问题尚未得到解答。这需要一个带有 systemd 和 cgroups2 的系统(我读了你所说的内容,但看到这个解决方案可能会很有趣)。两者我都学过,但我不掌握它们。
我仅在基于 arch 的 Linux 发行版上进行了测试。

~]$ cat /etc/systemd/system/user\@1000.service.d/override.conf 
[Service]
Delegate=pids memory io

看来您需要将 io 控制器“委托”到您的“用户 systemd 子树”才能将其用作非特权用户(我无法指出一个特定位置。man systemd.resource-control。https://systemd.io/CGROUP_DELEGATIONhttps://wiki.archlinux.org/title/cgroups#As_unprivileged_user

~]$ cat ~/.config/systemd/user/my.slice 
[Slice]
IOAccounting=true

然后创建一个启用 IOAccounting 的切片来运行您的进程。

重启

~]$ cat foo.sh 
#!/bin/sh 

dd if=/dev/random of=/home/yarl/bar bs=1M count=7
dd if=/dev/random of=/home/yarl/bar bs=1M count=3

~]$ systemd-run --user --slice=my.slice /home/yarl/foo.sh

~]$ systemctl --user status my.slice
● my.slice - Slice /my
     Loaded: loaded (/home/yarl/.config/systemd/user/my.slice; static)
     Active: active since Sun 2021-11-07 20:25:20 CET; 12s ago
         IO: 100.0K read, 10.0M written
      Tasks: 0
     Memory: 3.2M
        CPU: 162ms
     CGroup: /user.slice/user-1000.slice/[email protected]/my.slice

nov. 07 20:25:20 pbpro systemd[1229]: Created slice Slice /my.

相关内容