Linux 每1毫秒从PMU收集partiulcar进程的数据

Linux 每1毫秒从PMU收集partiulcar进程的数据,linux,bash,scripting,perf,Linux,Bash,Scripting,Perf,我希望每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

我希望每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
下面的代码收集系统中并行运行一定时间的所有进程的数据,然后将其输出到文本文件

    #!/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
#/垃圾箱/垃圾箱
#集合x
ps-ef | awk'{printf($2)“\n”;}>out.txt
sed'1d'out.txt>tmp
IFS=$'\n'
读tmp时
做
3> 结果-$tmp perf stat-p$tmp--log fd 3 sleep 5>/dev/null&

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

另一方面,
perf record
将设置perf事件,以便内核本身在计数器溢出时记录这些事件。其优点是开销较小,但事件不一定以固定的时间间隔记录。如果设置
perf record--frequency 1000
,内核将调整计数器的溢出率,以达到请求的1毫秒间隔。除非您的事件发生率确实稳定,否则结果时间间隔将不会恒定。如果您的事件发生率变化很大,那么时间间隔也会发生变化

请注意,有一种方法将尝试防止perf造成过多的开销。按你要求的速度,你可能会成功

此外,您不应为过多的PID设置录制,而应设置系统范围的录制,例如:

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

您将得到一个结果文件,可以根据pid进行处理<代码>性能脚本
。除了文本输出外,
perf script
允许您用python或perl处理事件(请参见
manperf script python
manperf script perl
)。

除了perf,是否有任何其他方法可以每1毫秒监视一次详细信息?请使用
perf stat--interval print msecs-p$tmp
,这样您就不会试图每毫秒fork+执行一个新的
perf
进程。手册上说最小间隔是10毫秒,但是你可以建立一个自定义版本。默认的时间片通常为10ms,因此您可能需要对内核进行不同的配置,如果Linux仍然使用HZ,则可能使用HZ=1000。(我最近没有注意调度器滴答声分辨率与无滴答声内核的比较。)
perf-record——timestamp将记录事件的时间戳
。手册上说“您可以使用
perf report-D
查看时间戳”。我认为像
perf report
这样的东西可能是记录事情的最佳选择,然后稍后再处理这些数据。如果您需要每隔1ms发生一次,那么您肯定希望避免在记录数据时运行shell循环;这是一个很大的系统负载。使用
perf
的系统范围模式,让
perf
的一个实例从所有数据中收集数据。对于无法通过正常
perf记录了解的系统--所有CPU--时间戳
/
perf报告-D
,您到底想了解哪些信息,或其他监控工具?
perf stat
只能每10毫秒记录一次
perf record——时间戳
以高分辨率时间戳记录所有发生的事件。10ms的限制在任何方面都不适用于
perf record
。哦,太酷了,所以你可以做得比我在评论中建议的更好。同样相关:有关限制采样频率的代码内部链接。@PeterCordes BTW with
perf\u event\u open
您可以为组长设置一组度量和触发样本(例如,具有稳定速率的参考循环)。不幸的是,即使使用组,这似乎对
perf record
也不起作用。因此,现在要了解特定pid的统计信息,比如pid 50,必须运行perf脚本,以便将统计信息输出到文本文件中?例如,我们可以将pid-1的文本文件输出作为output-1.txt吗?使用命令perf record-e cycles--all cpus--freq 1000,以获得所有cpu的cpu周期。它花费了很多时间,却一无所获。我使用的命令或标志有什么问题吗?当您使用ctrl+c覆盖了要监视的时间后,是否停止了录制?