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 time
y 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/io
informació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 cgroups
pero ¿y si no quiero usarlos? También lo he comprobado /sys/fs/cgroup
y 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.