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
実行時情報を含む はありますが、Web ブラウザーなど、子プロセスを動的に生成および破棄するアプリケーションでそれを追跡するのは困難な作業のように思えます。実行して、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.