나는 Linux 커널에 추적을 허용하는 기능이 있다고 확신합니다.모두애플리케이션의 읽기 및 쓰기(IO)모두그러나 나는 그것을 계산하고 보여줄 수 있는 유틸리티를 본 적이 없습니다.
예를 들어 CPU 시간의 경우 간단히 time
CPU 사용 정보를 사용하고 얻을 수 있습니다.
$ 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 배포판에서만 테스트했습니다.
~]$ cat /etc/systemd/system/user\@1000.service.d/override.conf
[Service]
Delegate=pids memory io
권한이 없는 사용자로 이를 사용하려면 io 컨트롤러를 "사용자 시스템 하위 트리"에 "위임"해야 하는 것 같습니다(특정 위치를 지정할 수는 없습니다. 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
그런 다음 프로세스를 실행할 수 있도록 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.