Я почти уверен, что в ядре Linux есть функция, которая позволяет отслеживатьвсеоперации чтения и записи (IO) приложения ивсеего потомков, однако я не видел никаких утилит, которые могли бы это вычислить и показать.
Например, для времени ЦП вы можете просто использовать time
и получить точную информацию об использовании ЦП:
$ time cat --version > /dev/null
real 0m0.001s
user 0m0.001s
sys 0m0.000s
Я ищу что-то похожее в отношении IO, например
$ calc_io task
Bytes read: 123456
Bytes written: 0
Конечно, у нас есть , /proc/$PID/io
который содержит информацию времени выполнения, но отслеживание ее для приложений, которые динамически порождают и уничтожают дочерние элементы, например, веб-браузеры, кажется сложной задачей. Я думаю, если вы запустите, strace -fF firefox
то отслеживайте всех порождаемых дочерних элементов и пытайтесь отслеживать в реальном времени /proc/$PID/io
- нет, кажется слишком сложным для реализации, и как часто вы будете опрашивать этот файл для получения информации? Дочерние элементы могут существовать долю секунды.
Другая идея - использовать, cgroups
но что делать, если я не хочу их использовать? Я тоже проверил /sys/fs/cgroup
и не вижу никакой релевантной статистики.
решение1
Я наткнулся на этот пост и нашел его очень интересным. Я думал, что эта проблема не такая уж сложная, поскольку вопрос, который вы задаете, в конце концов, вполне естественен.
Я смог найти только несовершенное и неполное решение. Я решил все равно его опубликовать, так как на вопрос еще не ответили. Для этого нужна система с systemd и cgroups2 (я читал, что вы об этом сказали, но может быть интересно увидеть это решение). Я узнал об обоих, но не владею ими.
Я тестировал только на дистрибутиве Linux на базе Arch.
~]$ cat /etc/systemd/system/user\@1000.service.d/override.conf
[Service]
Delegate=pids memory io
Похоже, вам нужно «делегировать» контроллер ввода-вывода в «user systemd sub tree», чтобы использовать его как непривилегированный пользователь (я не могу указать конкретное место. man systemd.resource-control.https://systemd.io/CGROUP_DELEGATION.https://wiki.archlinux.org/title/cgroups#Как_непривилегированный_пользователь)
~]$ cat ~/.config/systemd/user/my.slice
[Slice]
IOAccounting=true
Затем создайте срез с включенным IOAccounting для запуска ваших процессов.
перезагрузить
~]$ 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.