linux - 如何计算进程 id 的执行指令数,包括子进程

标签 linux performance docker cpu-architecture perf

我将 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命令:
$ 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
容器。
问题:
  • 有什么方法可以提供父PID并计算所有进程的执行指令数?
  • 我的方法有意义吗?我的意思是我以逗号分隔的格式提供所有 PID 的方式。
  • 最佳答案

    您可以获取其中一个进程(父进程)的 PI​​D 并使用 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 ","将转换它们。

    关于linux - 如何计算进程 id 的执行指令数,包括子进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62851367/

    相关文章:

    docker - Docker Kitematic连接ETIMEDOUT错误

    mysql - 如何使用 linux 命令行对远程数据库执行 "INSERT INTO"查询?

    c# - 字符串插值与 String.Format

    r - Linux 环境中默认的 .RData 工作空间保存在哪里?

    c# - TPL 和内存管理

    java - 文件中超过 50 个字段的类 VS HashMap

    deployment - 是否可以将 Docker 镜像直接部署到 AWS?

    mysql - 尝试从 docker 容器连接到本地 mysql 数据库时连接被拒绝

    linux - 使用 shell 脚本从主机名或 FQDN 获取 IP

    linux - Git Pull 无需输入私钥密码