最近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)是一个较好的方向?