我很确定 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_DELEGATION。https://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.