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

标签 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 > /dev/null &
    done <tmp

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

最佳答案

以这种速率读取性能计数器在开销方面有点牵强。这正是 perf stat 具有 10 ms 周期下限的原因。它运行用户空间任务以读取这些时间间隔内的计数器。

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

请注意,有一个 mechanism in the kernel这将试图防止 perf 造成过多的开销。按照您要求的速率,您很可能会命中。

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

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

你得到一个结果文件,你可以根据pid进行处理。 性能脚本。除了文本输出,perf script 还允许您使用 python 或 perl 处理事件(参见 man perf-script-pythonman perf-script- perl).

关于linux - 每 1 毫秒从 PMU 收集特定进程的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49762198/

相关文章:

python - 即使在其中的命令退出后继续 for 循环

linux - 在文本文件中查找并删除包含多个单词的行

scripting - 如何将 Linux shell 脚本编译为独立的可执行文件*二进制*(即不仅仅是 chmod 755)?

powershell - 在 PowerShell 1.0 版中解析模拟 "grep -C 2"

linux - Bash 脚本中的多个 SSH 命令

bash - 比较文件以获取特殊字符之前的字符串

在终端上找不到 Python 模块,但在 Python shell、Linux 上找到

linux - 如何监控大文件的哪一部分发生了变化

c - 通过 netlink 将结构从内核发送到用户空间

linux - 如何使用 sed 通过灵活的键和值更改我的配置文件?