我目前正在調查Erlang大型應用程序中的性能問題。應用程序的CPU負載大於預期。要首先掌握系統的哪些部分負載負載,我想按照this answer中所述執行callstack抽樣。Erlang中的Callstack抽樣
重複調用erlang:process_info(Pid, backtrace)
是否有更好的方法來做到這一點,並從輸出中清除函數?
請注意,系統太大而無法使用fprof
,而且etop
也沒有指出我正確的方向。因爲我現在還不可能使用fprof
,因爲現在只有部分系統是可能的,因爲我首先需要指出性能問題的一般位置。
我不知道厄蘭,但我知道這種技術。你可以在調試器下運行你的程序,手動暫停它,並檢查調用堆棧嗎?我不擔心首先發現性能問題的大致位置,因爲如果它佔用了很大的時間百分比,那麼您可能會看到它的概率,並且如果它佔用很小的百分比,那麼您可能不會懷疑其他問題需要很大的百分比。 –
@MikeDunlavey謝謝你的建議(我剛剛學會了如何在Erlang中暫停和恢復進程,因爲它)。儘管Erlang允許掛起進程,但我還沒有看到簡化callstack採樣的方法。使用'erlang:process_info(Pid,backtrace)',我可以在運行時檢索堆棧跟蹤,並且不需要自行掛起進程。但是,我只剩下解析那個輸出。 – evnu
重要*不要*將採樣放入代碼中。從程序的角度來看,它必須發生在不可預知的時刻。另一點是你不需要大量的樣本(與廣泛的假設相反)。你只需要兩次看到一個問題,知道它值得修復,並且需要的平均樣本數是2/size_of_problem。因此,如果問題花費30%的時間,則需要兩次看到它的平均樣本數爲2/0.30 = 6.67個樣本。 –