顯示任務/命令/程式的磁碟 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.

相關內容