Erlang中的调用堆栈采样

Erlang中的调用堆栈采样,erlang,profiling,Erlang,Profiling,我目前正在调查一个大型Erlang应用程序中的性能问题。应用程序的CPU负载比预期的要大。为了首先了解系统的哪些部分负责加载,我想执行调用堆栈采样,如中所述 有没有比反复调用erlang:process\u info(Pid,backtrace)并从该输出中对函数进行灰色化更好的方法 请注意,系统太大,无法使用fprof,而且etop也没有将我指向正确的方向。现在也不可能只对系统的一部分使用fprof,因为我首先需要确定性能问题的一般位置。获取堆栈实际大小的简单方法是进程信息(Pid,堆栈大小)

我目前正在调查一个大型Erlang应用程序中的性能问题。应用程序的CPU负载比预期的要大。为了首先了解系统的哪些部分负责加载,我想执行调用堆栈采样,如中所述

有没有比反复调用
erlang:process\u info(Pid,backtrace)
并从该输出中对函数进行灰色化更好的方法


请注意,系统太大,无法使用
fprof
,而且
etop
也没有将我指向正确的方向。现在也不可能只对系统的一部分使用
fprof
,因为我首先需要确定性能问题的一般位置。

获取堆栈实际大小的简单方法是
进程信息(Pid,堆栈大小)
。虽然这只返回堆栈的大小(以文字表示),但这是一种非常简单有效的方法,可以查看哪些进程具有大堆栈。

我不知道Erlang,但我知道这种技术。您能否在调试器下运行程序,手动暂停程序,并检查调用堆栈?我不担心首先找到性能问题的大致位置,因为如果它花费了很大的时间,那么你就有可能看到它,如果它花费了很小的时间,那么很有可能是其他一些你没有怀疑的事情,它花费了很大的时间。@MikeDunlavey感谢你的建议(正因为如此,我才学会了如何在Erlang中挂起和恢复进程)。尽管Erlang允许挂起进程,但我还没有找到简化调用堆栈采样的方法。使用
Erlang:process_info(Pid,backtrace)
,我可以在运行时检索堆栈跟踪,不需要自己挂起进程。但是,我只需要解析输出。不要将采样放入代码中,这一点很重要。它必须发生在程序无法预测的时间。另一点是,您不需要太多的采样(与普遍的假设相反)。你只需要看两次问题就知道它值得修复,而这一问题所需的平均样本数是问题的2/size\u。因此,如果问题花费30%的时间,那么看两次问题所需的平均样本数是2/0.30=6.67个样本。
减少
不是确定大负载来源的更好措施吗?我希望对系统施加大量负载的过程将显示持续大量的
减少量
。使用
堆栈大小
进行的初步测试没有结果(或者我误解了数字)是的,
reduces
将是一个更好的衡量标准,但这是一个注释,最初的问题是关于
backtrace
的替代方案。