Как использовать инструмент для перфорирования с docker работает стресс-нг? - PullRequest
1 голос
/ 27 апреля 2020

Я использую стресс-нг docker изображение из https://hub.docker.com/r/polinux/stress-ng/dockerfile для стресса моей системы. Я хочу использовать инструмент perf для мониторинга показателей.

perf stat -- stress-ng --cpu 2 --timeout 10 запускает стресс-нг в течение 10 секунд и возвращает показатели производительности. Я попытался сделать то же самое с изображением docker, используя perf stat -- docker run -ti --rm polinux/stress-ng --cpu 2 --timeout 10. Это возвращает метрики, но не метрики стресс-нг.

Вывод, который я получил при использовании 'perf stat' для стресс-нг:

Performance counter stats for 'stress-ng --cpu 2 --timeout 10':

  19975.863889      task-clock (msec)         #    1.992 CPUs utilized          
         2,057      context-switches          #    0.103 K/sec                  
             7      cpu-migrations            #    0.000 K/sec                  
         8,783      page-faults               #    0.440 K/sec                  
52,568,560,651      cycles                    #    2.632 GHz                    
89,424,109,426      instructions              #    1.70  insn per cycle         
17,496,929,762      branches                  #  875.904 M/sec                  
    97,910,697      branch-misses             #    0.56% of all branches        

  10.025825765 seconds time elapsed

Вывод, который я получил при использовании перф инструмент на docker изображение:

Performance counter stats for 'docker run -ti --rm polinux/stress-ng --cpu 2 --timeout 10':

    154.613610      task-clock (msec)         #    0.014 CPUs utilized          
           858      context-switches          #    0.006 M/sec                  
           113      cpu-migrations            #    0.731 K/sec                  
         4,989      page-faults               #    0.032 M/sec                  
   252,242,504      cycles                    #    1.631 GHz                    
   375,927,959      instructions              #    1.49  insn per cycle         
    84,847,109      branches                  #  548.769 M/sec                  
     1,127,634      branch-misses             #    1.33% of all branches        

  10.704752134 seconds time elapsed

Может кто-нибудь, пожалуйста, помогите мне с тем, как получить метрики стресса при запуске с помощью docker?

1 Ответ

2 голосов
/ 03 мая 2020

Продолжение комментариев @ 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. Вы можете прочитать этот ответ здесь .
...