Disk

顯示任務/命令/程序的磁碟 IO 讀/寫摘要的實用程序

  • November 7, 2021

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

引用自:https://unix.stackexchange.com/questions/675235