Ich bin ziemlich sicher, dass der Linux-Kernel eine Funktion hat, die es ermöglicht,alledie Lese- und Schreibvorgänge (IO) einer Anwendung undalleseine untergeordneten Elemente, ich habe jedoch keine Dienstprogramme gesehen, die es berechnen und anzeigen können.
Für die CPU-Zeit können Sie beispielsweise einfach Folgendes verwenden time
und erhalten präzise Informationen zur CPU-Auslastung:
$ time cat --version > /dev/null
real 0m0.001s
user 0m0.001s
sys 0m0.000s
Ich suche etwas ähnliches im Bereich IO, zB
$ calc_io task
Bytes read: 123456
Bytes written: 0
Natürlich haben wir eine /proc/$PID/io
Datei, die Laufzeitinformationen enthält, aber sie für Anwendungen zu verfolgen, die dynamisch untergeordnete Elemente erzeugen und zerstören, z. B. Webbrowser, scheint eine gewaltige Aufgabe zu sein. Ich schätze, wenn Sie sie ausführen, strace -fF firefox
überwachen Sie alle untergeordneten Elemente, die erzeugt werden, und versuchen Sie, sie in Echtzeit zu verfolgen /proc/$PID/io
– nein, das scheint zu schwierig zu implementieren zu sein, und wie oft werden Sie diese Datei dann nach Informationen abfragen? Untergeordnete Elemente können für den Bruchteil einer Sekunde existieren.
Eine andere Idee ist, sie zu verwenden cgroups
, aber was ist, wenn ich sie nicht verwenden möchte? Ich habe auch nachgesehen /sys/fs/cgroup
und sehe keine relevanten Statistiken.
Antwort1
Ich bin auf diesen Beitrag gestoßen und fand ihn sehr interessant. Ich dachte, dieses Problem sei nicht so schwierig, da die Frage, die Sie stellen, schließlich ganz natürlich ist.
Ich konnte nur eine unvollkommene und unvollständige Lösung finden. Ich habe mich trotzdem entschieden, sie zu posten, da die Frage noch nicht beantwortet wurde. Dies erfordert ein System mit systemd und cgroups2 (ich habe gelesen, was Sie dazu gesagt haben, aber es könnte interessant sein, diese Lösung zu sehen). Ich habe über beides gelernt, beherrsche sie aber nicht.
Ich habe nur auf einer Arch-basierten Linux-Distribution getestet.
~]$ cat /etc/systemd/system/user\@1000.service.d/override.conf
[Service]
Delegate=pids memory io
Es scheint, dass Sie den E/A-Controller an Ihren „Benutzer-Systemd-Unterbaum“ „delegieren“ müssen, um diesen als nicht privilegierter Benutzer zu verwenden (ich kann keine bestimmte Stelle angeben. 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
Erstellen Sie dann einen Slice mit aktiviertem IOAccounting, in dem Sie Ihre Prozesse ausführen können.
Neustart
~]$ 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.