C++ 当进程被阻塞时,Perf或DTrace是否不采样(如执行某些io)?

C++ 当进程被阻塞时,Perf或DTrace是否不采样(如执行某些io)?,c++,clion,perf,dtrace,C++,Clion,Perf,Dtrace,下面是一个分析示例,在macos 10.15.4上,使用clion with,我发现它只输出调用堆栈的一部分 #包括 #包括 #包括 void g(){ std::this_thread::sleep_for(std::chrono::seconds(1)); } 浮球l2sqr(浮球*x,浮球*y,尺寸N){ 浮动ret=0; 对于(size_t i=0;iPerhapsg()已内联?虽然它不能解释为什么l2sqr是100%的父级。@Kentzo是的,我认为这也很奇怪。在ubuntu 1604

下面是一个分析示例,在macos 10.15.4上,使用clion with,我发现它只输出调用堆栈的一部分

#包括
#包括
#包括
void g(){
std::this_thread::sleep_for(std::chrono::seconds(1));
}
浮球l2sqr(浮球*x,浮球*y,尺寸N){
浮动ret=0;

对于(size_t i=0;iPerhaps
g()
已内联?虽然它不能解释为什么
l2sqr
是100%的父级。@Kentzo是的,我认为这也很奇怪。在ubuntu 1604中使用perf,我得到了97.99%的父级IIRC样本,
循环
事件只能在代码使用CPU时间时触发,而不是在它睡眠时触发(包括在I/O上阻塞)。除非
0xd5e258d4c544155
是睡眠函数
g()
调用的地址?我忘记了像
任务时钟
这样的软件事件是否可以在墙上时钟而不是CPU时间中配置,或者perf是否具有其他操作模式。(我通常只需要配置正在调优的热循环。)为了进行比较,您可以在macOS上尝试Instruments.app和Time Profiler模板。它在引擎盖下使用dtrace,只是它的d脚本可能更复杂。@onriv,默认的perf模式不分析休眠或阻塞进程。有一些方法可以使用perf进行非CPU分析,分析休眠进程es,以及On-CPU和Off-CPU可以组合。检查Gregg页面:和“热-冷图”中的组合。可能
g()
内联了吗?虽然它不能解释为什么
l2sqr
是100%的父级。@Kentzo是的,我觉得这也很奇怪。在ubuntu 1604中使用perf,我得到了97.99%的父级IIRC样本,
cycles
事件只能在代码使用CPU时间时触发,而不是在代码睡眠时触发(包括在I/O上被阻塞)。除非
0xd5e258d4c544155
是睡眠函数
g()
调用的地址?我忘记了像
任务时钟
这样的软件事件是否可以在挂钟而不是CPU时间中进行分析,或者perf是否具有其他操作模式。(我通常只需要分析正在调优的热循环。)为了进行比较,您可以在macOS上尝试Instruments.app和Time Profiler模板。它在引擎盖下使用dtrace,只是它的d脚本可能更复杂。@onriv,默认的perf模式不分析休眠或阻塞进程。有一些方法可以使用perf进行非CPU分析,分析休眠进程可以组合使用es、On-CPU和Off-CPU。检查格雷格页面:和“热冷图”中的组合。
g++ test.cpp && sudo perf record -F 999 -g ./a.out && sudo perf report
   - main                                                                                                                                           
      + 99.67% l2sqr                                                                                                                                
        0.08% std::sqrt