调用栈和Frame Pointer

Posted by Fei Wu on March 27, 2024

最近Brendan Gregg写了篇博客,The Return of the Frame Pointers。主要出发点是因为没有frame pointer, 调试工具可能采集不到完整的调用栈,如下示例:

总结如下:

  • frame pointer在现阶段是必要的,否则profiler等工具可能出现上面所说采集不到完整调用栈的问题
  • 并不是所有工具都需要frame pointer才能拿到完整调用栈,比如通过dwarf信息同样可以,但是对profiler这种性能要求较高的场景不适合
  • 通过frame pointer可以快速遍历整个调用栈,但是save/restore引入了额外的指令,一般情况下在1%-2%之间,某些极端的micro benchmark会到10%
  • frame pointer给性能调优带来的好处绝大多数情况下远远超过了自己带来的overhead
  • 在通用寄存器较少的cpu比如i386上,释放fp作为通用寄存器会带来较大的性能优化,但是对于现在大部分cpu都有较多通用寄存器,增加一个并没有显著区别
  • Fedora/Ubuntu现在默认在编译libc等library的时候,已经打开frame pointer支持
  • Java也有XX:+PreserveFramePointer option
  • frame pointer可能不是最终方案,毕竟还是存在overhead,看起来ORC(Oops Rewind Capability)/SFrames(Stack Frames)是一个较好的方向?