我很確定 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.