对于没有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个样本少得多。
还有更好的方法吗?
答案 0 :(得分:2)
当您的进程处于睡眠状态时,CPU样本几乎没有用,但是您可以通过使用记录睡眠syscall的开始和结束(捕获堆栈)的事件来模仿此行为,然后添加“睡眠堆栈可通过将条目堆栈复制多次(与每次睡眠的持续时间一致)来“进行后处理”。
毕竟,堆栈不会改变。
答案 1 :(得分:0)
指定概要分析目标时,perf
仅考虑该目标所生成的事件。很自然,sleep
定位目标不会产生很多性能事件。
如果您希望在调用图报告中查看其他进程(例如数据库?),请尝试在系统范围内进行采样:
-a, --all-cpus
System-wide collection from all CPUs (default if no target is specified).
(来自性能手册页)
此外,如果您打算花费大量时间实际查看报告,那么我无法推荐您一个工具:FlameGraphs。这种可视化可以为您节省大量的精力。