gpt4 book ai didi

linux - 使用/proc/*/stat 进行分析

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:21:27 25 4
gpt4 key购买 nike

在 Linux 上,进程(主线程)的最后一个程序计数器值显示在 /proc/$PID/stat 中。这似乎是一种非常简单易行的方法,可以进行一些采样分析,而无需以任何方式检测程序。

不过,我想知道这在采样质量方面是否有任何注意事项。我假设只要进程用完它的时间片就会更新这个值,这应该在程序代码中以完全随机的间隔发生,并且在超过时间片长度时采集的样本应该是一致的根据程序实际花费时间的地方随机分布。但这只是一个假设,我意识到它在很多方面都可能是错误的。

有人知道吗?

最佳答案

为什么不试试像 perf ( https://perf.wiki.kernel.org/index.php/Main_Page ) 这样的现代内置 linux 工具?

它具有可调频率的记录模式(-F100 为 100 Hz),具有许多事件,例如,在软件事件 task-clock 不使用硬件性能计数器(使用 Ctrl-C 停止 perf 或在右侧添加 sleep 10 以采样 10 秒):

 perf record -p $PID -e task-clock -o perf.output.file

Perf 适用于所有线程,无需任何检测(重新编译或代码编辑),并且不会干扰程序执行(仅对定时器中断进行了轻微修改)。 (也有一些支持使用 -g 选项的堆栈跟踪采样。)

可以使用perf report 离线解析输出(只有这个命令会尝试解析二进制和共享库)

 perf report -i perf.output.file

或使用 perf script -i perf.output.file 转换为原始 PC (EIP) 样本。

PS:官方 linux 手册页 5 proc http://man7.org/linux/man-pages/man5/proc.5.html 中提到了/proc/$pid/stat 文件中的 EIP 指针as kstkeip - “当前 EIP(指令指针)。”在 fs/proc/array.c:do_task_stat 阅读eip = KSTK_EIP(task);,但我不确定它何时何地被填充。它可以写在任务切换上(当 taskslice 结束时是非自愿的,当任务执行类似 sched_yield 的事情时是自愿的)或阻塞系统调用,因此它可能不是采样源的最佳选择。

关于linux - 使用/proc/*/stat 进行分析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42234296/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com