Утилита для отображения сводки операций чтения/записи на диске для задачи/команды/программы

Утилита для отображения сводки операций чтения/записи на диске для задачи/команды/программы

Я почти уверен, что в ядре 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.

Связанный контент