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 time
e 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/io
which 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, cgroups
mas e se eu não quiser usar? Também verifiquei /sys/fs/cgroup
e 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.