Utilidad para mostrar el resumen de lectura/escritura de E/S del disco para una tarea/comando/programa

Utilidad para mostrar el resumen de lectura/escritura de E/S del disco para una tarea/comando/programa

Estoy bastante seguro de que el kernel de Linux tiene una característica que permite rastreartodolas lecturas y escrituras (IO) de una aplicación ytodosus hijos, sin embargo, no he visto ninguna utilidad que pueda calcularlo y mostrarlo.

Por ejemplo, para el tiempo de CPU, simplemente puede usar timey obtener información clara sobre el uso de la CPU:

$ time cat --version > /dev/null

real    0m0.001s
user    0m0.001s
sys 0m0.000s

Estoy buscando algo similar con respecto a IO, por ejemplo

$ calc_io task
Bytes read: 123456
Bytes written: 0

Por supuesto, tenemos /proc/$PID/ioinformación sobre el tiempo de ejecución, pero rastrearla para aplicaciones que generan y destruyen niños dinámicamente, por ejemplo, navegadores web, parece una tarea desalentadora. Supongo que si ejecuta strace -fF firefox, monitorea a todos los niños que se generan e intenta realizar un seguimiento en tiempo real /proc/$PID/io; no, parece demasiado difícil de implementar y luego, ¿con qué frecuencia sondeará este archivo para obtener información? Los niños pueden existir por una fracción de segundo.

Otra idea es usarlos cgroupspero ¿y si no quiero usarlos? También lo he comprobado /sys/fs/cgroupy no veo ninguna estadística relevante.

Respuesta1

Me encontré con este post y lo encontré muy interesante. Pensé que este problema no era tan difícil ya que, después de todo, la pregunta que haces es bastante natural.

Sólo pude encontrar una solución imperfecta e incompleta. Decidí publicarlo de todos modos, ya que la pregunta aún no ha sido respondida. Esto requiere un sistema con systemd y cgroups2 (leí lo que dijiste al respecto, pero podría ser interesante ver esta solución). Aprendí sobre ambos, no los domino.
Probé solo en una distribución de Linux basada en Arch.

~]$ cat /etc/systemd/system/user\@1000.service.d/override.conf 
[Service]
Delegate=pids memory io

Parece que necesita "delegar" el controlador io a su "subárbol systemd de usuario" para usarlo como un usuario sin privilegios (no puedo señalar un lugar específico. 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

Luego cree un segmento con IOAccounting habilitado para ejecutar sus procesos.

reiniciar

~]$ 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.

información relacionada