即使我的程序处于睡眠状态也要获取Linux prof示例吗?

时间:2018-12-18 10:33:42

标签: perf

对于没有sleep function的程序,perf可以很好地收集调用图样本。

void main()
{
    while(true)
    {
        printf(...);
    }
}

例如,一秒钟内有超过1,000个样本。

我以此收集了性能报告:

sudo perf report -p <process_id> -g

但是,当我使用带有睡眠功能的程序来完成此操作时,perf不能很好地收集调用图样本:在一秒钟之内只有几个样本。

void main()
{
    while(true)
    {
        sleep(1);
        printf(...);
    }
}

即使我的程序处于睡眠状态,我也想收集通话图样本。设备时间。在具有VSPerf的Windows中,还可以很好地收集具有睡眠状态的调用表。

需要收集用于睡眠状态的调用图,以便不仅在CPU时间而且在设备时间(例如访问数据库)中查找性能瓶颈。

我想即使我的程序处于睡眠状态,也可能有一个perf选项来收集样本,因为不仅我而且许多其他程序员都可能想要它。

即使我的程序处于睡眠状态,如何获得教授样本?


发布此问题后,我们发现perf -c 1每秒捕获约10个样本。如果没有-c 1,则perf每秒捕获0.3个样本。目前,每秒10个样本要好得多,但仍然比每秒1000个样本少得多。

还有更好的方法吗?

2 个答案:

答案 0 :(得分:2)

当您的进程处于睡眠状态时,CPU样本几乎没有用,但是您可以通过使用记录睡眠syscall的开始和结束(捕获堆栈)的事件来模仿此行为,然后添加“睡眠堆栈可通过将条目堆栈复制多次(与每次睡眠的持续时间一致)来“进行后处理”。

毕竟,堆栈不会改变。

答案 1 :(得分:0)

指定概要分析目标时,perf仅考虑该目标所生成的事件。很自然,sleep定位目标不会产生很多性能事件。

如果您希望在调用图报告中查看其他进程(例如数据库?),请尝试在系统范围内进行采样:

    -a, --all-cpus
       System-wide collection from all CPUs (default if no target is specified).

(来自性能手册页)

此外,如果您打算花费大量时间实际查看报告,那么我无法推荐您一个工具:FlameGraphs。这种可视化可以为您节省大量的精力。