Продолжение комментариев @ osgx,
Как уже упоминалось здесь , по умолчанию команда perf stat
будет отслеживать не только все потоки процесса, который нужно отслеживать, но также его дочерние процессы и потоки.
Проблема в этой ситуации заключается в том, что при запуске perf stat
и мониторинге команды docker run stress-ng
вы не отслеживаете фактический процесс stress-ng
. Важно отметить, что процессы, выполняющиеся как часть контейнера, на самом деле будут запускаться не клиентом docker
, а процессом docker-containerd-shim
(который является процессом внука процесса dockerd
).
Если вы запускаете команду docker для запуска stress-ng
внутри контейнера и наблюдаете дерево процессов, это становится очевидным.
docker run -ti --name=stress-ng --rm polinux/stress-ng --cpu 2 --timeout 100
ps -elf | grep docker
0 S ubuntu 26379 114001 0 80 0 - 119787 futex_ 12:33 pts/3 00:00:00 docker run -ti --name=stress-ng --rm polinux/stress-ng --cpu 2 --timeout 10000
4 S root 26431 118477 0 80 0 - 2227 - 12:33 ? 00:00:00 docker-containerd-shim -namespace moby -workdir /var/lib/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/72a8c2787390669ff4eeae6f343ab4f9f60434f39aae66b1a778e78b7e5e45d8 -address /var/run/docker/containerd/docker-containerd.sock -containerd-binary /usr/bin/docker-containerd -runtime-root /var/run/docker/runtime-runc
0 S ubuntu 26610 26592 0 80 0 - 3236 pipe_w 12:34 pts/6 00:00:00 grep --color=auto docker
4 S root 118453 1 3 80 0 - 283916 - May02 ? 01:01:57 /usr/bin/dockerd -H fd://
4 S root 118477 118453 4 80 0 - 457853 - May02 ? 01:14:36 docker-containerd --config /var/run/docker/containerd/containerd.toml
----------------------------------------------------------------------
ps -elf | grep stress-ng
0 S ubuntu 26379 114001 0 80 0 - 119787 futex_ 12:33 pts/3 00:00:00 docker run -ti --name=stress-ng --rm polinux/stress-ng --cpu 2 --timeout 10000
4 S root 26455 26431 0 80 0 - 16621 - 12:33 pts/0 00:00:00 /usr/bin/stress-ng --cpu 2 --timeout 10000
1 R root 26517 26455 99 80 0 - 16781 - 12:33 pts/0 00:01:08 /usr/bin/stress-ng --cpu 2 --timeout 10000
1 R root 26518 26455 99 80 0 - 16781 - 12:33 pts/0 00:01:08 /usr/bin/stress-ng --cpu 2 --timeout 10000
0 S ubuntu 26645 26592 0 80 0 - 3236 pipe_w 12:35 pts/6 00:00:00 grep --color=auto stress-ng
PPID первого процесса stress-ng
- 26431, который является не командой docker run
, а фактически процессом docker-containerd-shim
. Мониторинг команды docker run
никогда не будет отражать правильные значения, поскольку клиент docker
полностью отсоединен от процесса запуска команд stress-ng
.
- Одним из способов решения этой проблемы было бы присоединить команду
perf stat
к идентификаторам PID процессов стресс-нга, которые запускаются во время выполнения docker.
, например, как в приведенном выше случае, когда команда docker run
запустив, вы можете сразу же начать делать это -
perf stat -p 26455,26517,26518
Performance counter stats for process id '26455,26517,26518':
148171.516145 task-clock (msec) # 1.939 CPUs utilized
49 context-switches # 0.000 K/sec
0 cpu-migrations # 0.000 K/sec
67 page-faults # 0.000 K/sec
Вы можете немного увеличить --timeout
, чтобы команда выполнялась дольше, поскольку теперь вы запускаете perf stat
после запуска stress-ng
. Также вы должны учитывать небольшую долю первоначального потерянного времени измерения.
- Другой способ - запустить
perf stat
внутри контейнера docker, что-то вроде docker run perf stat ...
, но для этого вам придется начать предоставлять privileges
вашему контейнеру, поскольку по умолчанию системный вызов perf_event_open
занесен в черный список в docker
. Вы можете прочитать этот ответ здесь .