Как подсчитать количество выполненных инструкций идентификатора процесса, включая дочерние процессы - PullRequest
5 голосов
/ 11 июля 2020

У меня есть приложение nodejs (как сервер), развернутое как контейнер Docker, и я хочу подсчитать количество выполненных инструкций, когда я вызываю в нем функцию.

Вот как я нахожу PID контейнера:

$ pstree -p | grep node | grep npm
           |                 |-containerd-shim(114397)-+-npm(114414)-+-sh(114540)---node(114541)-+-{node}(114542)

Затем мне нужно знать Docker ID:

$ docker ps | grep workload
root@node3:/home/m# docker ps | grep workload | grep npm
c7457f74536b        michelgokan/synthetic-workload-generator                   "npm start"              55 minutes ago      Up 55 minutes                           k8s_whatever_workload-5697bb48f9-gg8j5_default_896e5938-55f2-4875-bf6c-2bff2acbe0c6_0

Теперь я знаю, что родительский PID - 114397. Итак, я запускаю следующее perf command:

$ perf stat -p 114397 -e instructions,cycles,task-clock docker exec -it c7457f74536b curl 127.0.0.1:30005/workload/cpu
1000 CHKSM AND DIFFIEHELLMAN 60 OK!
 Performance counter stats for process id '114397':

         170057460      instructions              #    1.02  insn per cycle         
         166389574      cycles                    #    1.575 GHz                    
            105.67 msec task-clock                #    0.570 CPUs utilized          

       0.185362408 seconds time elapsed

Кажется, это не включает инструкции, выполняемые дочерними процессами. Поэтому я попробовал следующее:

$ perf stat -p 1,722,114397,114414,114540,114541,114542 -e instructions,cycles,task-clock docker exec -it c7457f74536b curl 127.0.0.1:30005/workload/cpu
1000 CHKSM AND DIFFIEHELLMAN 60 OK!
 Performance counter stats for process id '1,722,114397,114414,114540,114541,114542':

         249803992      instructions              #    1.05  insn per cycle         
         236979702      cycles                    #    1.575 GHz                    
            150.47 msec task-clock                #    0.832 CPUs utilized          

       0.180848729 seconds time elapsed

В котором 1 - это systemd, а 722 - родительский PID контейнера.

Вопросы:

  1. Есть ли любым способом, которым я могу предоставить родительский PID, и он подсчитывает количество выполненных инструкций всех процессов?
  2. Имеет ли смысл мой подход? Я имею в виду способ, которым я предоставил все PID в формате, разделенном запятыми.

1 Ответ

2 голосов
/ 25 августа 2020

Вы можете получить PID одного из ваших процессов (родительский) и вывести другие, используя pgrep.

pgrep имеет отличную функцию --ns, которая позволит вам запустить все процессы в том же пространстве имен PID, что и данный PID.

Имея это, вы можете получить все дочерние процессы и преобразовать их в значения, разделенные запятыми, и передать их в perf

$ perf stat -p $(pgrep --ns <pid> | paste -s -d ",") -e instructions,cycles,task-clock docker exec -it c7457f74536b curl 127.0.0.1:30005/workload/cpu

pgrep --ns получит вам pid, а paste -s -d "," преобразует их.

...