Dienstprogramm zum Anzeigen einer Zusammenfassung der Lese-/Schreibvorgänge auf der Festplatte für eine Aufgabe/einen Befehl/ein Programm

Dienstprogramm zum Anzeigen einer Zusammenfassung der Lese-/Schreibvorgänge auf der Festplatte für eine Aufgabe/einen Befehl/ein Programm

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 timeund 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/ioDatei, 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/cgroupund 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.

verwandte Informationen