相关疑难解决方法(0)

如何计算进程id的执行指令数,包括所有未来的子线程

前段时间,我问了以下问题“如何计算进程 id 的执行指令数(包括子进程)”,@M-Iduoad 好心提供了一个解决方案来pgrep捕获所有子 PID 并将其与 perf stat 中的 -p 一起使用。效果很好!

\n

然而,我遇到的一个问题是多线程应用程序以及当生成新线程时。由于我不是算命先生(太糟糕了!),我不知道tid新生成的线程,因此我无法将它们添加到perf stat-p 或 -t 参数中。

\n

举个例子,假设我有一个多线程 Nodejs 服务器(作为容器部署在 Kubernetes 之上),具有以下内容pstree

\n
root@node2:/home/m# pstree -p 4037791\nnode(4037791)\xe2\x94\x80\xe2\x94\xac\xe2\x94\x80sh(4037824)\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80node(4037825)\xe2\x94\x80\xe2\x94\xac\xe2\x94\x80{node}(4037826)\n              \xe2\x94\x82                             \xe2\x94\x9c\xe2\x94\x80{node}(4037827)\n              \xe2\x94\x82                             \xe2\x94\x9c\xe2\x94\x80{node}(4037828)\n              \xe2\x94\x82                             \xe2\x94\x9c\xe2\x94\x80{node}(4037829)\n              \xe2\x94\x82                             \xe2\x94\x9c\xe2\x94\x80{node}(4037830)\n              \xe2\x94\x82                             \xe2\x94\x94\xe2\x94\x80{node}(4037831)\n              \xe2\x94\x9c\xe2\x94\x80{node}(4037805)\n              \xe2\x94\x9c\xe2\x94\x80{node}(4037806)\n              \xe2\x94\x9c\xe2\x94\x80{node}(4037807)\n              \xe2\x94\x9c\xe2\x94\x80{node}(4037808)\n              \xe2\x94\x9c\xe2\x94\x80{node}(4037809)\n              \xe2\x94\x9c\xe2\x94\x80{node}(4037810)\n              \xe2\x94\x9c\xe2\x94\x80{node}(4037811)\n              \xe2\x94\x9c\xe2\x94\x80{node}(4037812)\n              \xe2\x94\x9c\xe2\x94\x80{node}(4037813)\n              \xe2\x94\x94\xe2\x94\x80{node}(4037814) \n
Run Code Online (Sandbox Code Playgroud)\n

当然,我可以使用以下perf stat命令来观察其线程:

\n
perf stat --per-thread -e instructions,cycles,task-clock,cpu-clock,cpu-migrations,context-switches,cache-misses,duration_time -p $(pgrep --ns 4037791 | paste -s -d ",")\n
Run Code Online (Sandbox Code Playgroud)\n …

linux performance profiling performance-testing perf

3
推荐指数
1
解决办法
851
查看次数