Utilitário para mostrar o resumo de leitura/gravação de IO do disco para uma tarefa/comando/programa

Utilitário para mostrar o resumo de leitura/gravação de IO do disco para uma tarefa/comando/programa

Tenho quase certeza de que o kernel do Linux possui um recurso que permite rastreartodosas leituras e gravações (IO) de um aplicativo etodosseus filhos, no entanto, não vi nenhum utilitário que possa calculá-lo e mostrá-lo.

Por exemplo, para o tempo de CPU, você pode simplesmente usar timee obter informações claras sobre o uso da CPU:

$ time cat --version > /dev/null

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

Estou procurando algo semelhante em relação ao IO, por exemplo

$ calc_io task
Bytes read: 123456
Bytes written: 0

É claro que temos /proc/$PID/iowhich contém informações de tempo de execução, mas rastreá-las para aplicativos que geram e destroem filhos dinamicamente, por exemplo, navegadores da web, parece uma tarefa difícil. Eu acho que se você executar strace -fF firefox, monitore todas as crianças sendo geradas e tente rastrear em tempo real /proc/$PID/io- nah, parece muito difícil de implementar e com que frequência você pesquisará esse arquivo para obter informações? As crianças podem existir por uma fração de segundo.

Outra ideia é usar, cgroupsmas e se eu não quiser usar? Também verifiquei /sys/fs/cgroupe não vejo nenhuma estatística relevante.

Responder1

Me deparei com esse post e achei muito interessante. Achei que esse problema não era tão difícil, já que a pergunta que você está fazendo é bastante natural, afinal.

Só consegui encontrar uma solução imperfeita e incompleta. Resolvi postar mesmo assim, pois a pergunta ainda não foi respondida. Isso requer um sistema com systemd e cgroups2 (li o que você disse sobre isso, mas pode ser interessante ver esta solução). Aprendi sobre ambos, não os domino.
Testei apenas em uma distribuição Linux baseada em arch.

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

Parece que você precisa "delegar" o controlador io à sua "subárvore do usuário systemd" para usá-lo como um usuário sem privilégios (não consigo apontar um local 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

Em seguida, crie uma fatia com IOAccounting habilitado para executar seus processos.

reinício

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

informação relacionada