顯示任務/命令/程序的磁碟 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
,我沒有看到任何相關的統計數據。
我偶然發現了這篇文章,發現它非常有趣。我認為這個問題並不難,因為你問的問題畢竟是很自然的。
我只能找到一個不完美和不完整的解決方案。我還是決定發布它,因為問題還沒有回答。這需要一個帶有 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/user@1000.service/my.slice nov. 07 20:25:20 pbpro systemd[1229]: Created slice Slice /my.