每 1 毫秒从 PMU 收集特定进程的数据

2023-12-01

我想每 1 毫秒访问一次特定 PID 的硬件性能计数器,并将输出保存到文本文件中。

下面的代码收集系统中并行运行的所有进程在一定时间内的数据,然后将其输出到文本文件。

    #!/bin/sh 
    #set -x 
    ps -ef | awk '{printf($2)"\n";}' > out.txt 
    sed '1d' out.txt > tmp 
    IFS=$'\n'
    while read tmp 
    do  
    3>results-$tmp perf stat -p $tmp --log-fd 3 sleep 5 > /dev/null &
    done <tmp

为了收集进程每 1 毫秒的统计信息,应该如何编写循环?


以这种速度读取性能计数器的开销有点大。这正是原因perf stat下限为10 ms期间。它运行一个用户空间任务来读取这些时间间隔内的计数器。

另一方面,perf record将设置性能事件,以便内核本身在计数器溢出时记录它们。优点是开销较小,但事件不一定会定期记录time间隔。如果你设置perf record --frequency 1000, the kernel将调整计数器的溢出率trying达到所要求的 1 毫秒间隔。除非您的事件率确实稳定,否则生成的时间间隔不会恒定。如果事件发生率变化很大,时间间隔也会变化。

请注意,有一个内核中的机制这将试图防止 perf 造成过多的开销。按照您要求的价格,您可能会达到目标。

另外,您不应该为过多的 pid 设置记录,而是设置系统范围的记录,例如:

perf record --all-cpus --timestamp --freq 1000 

您将获得一个结果文件,您可以根据 pid 对其进行处理。perf script。除了文本输出之外,perf script允许您在 python 或 perl 中处理事件(请参阅man perf-script-python, man perf-script-perl).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

每 1 毫秒从 PMU 收集特定进程的数据 的相关文章

随机推荐