2017-02-15 43 views
3

我目前正在調查Erlang大型應用程序中的性能問題。應用程序的CPU負載大於預期。要首先掌握系統的哪些部分負載負載,我想按照this answer中所述執行callstack抽樣。Erlang中的Callstack抽樣

重複調用erlang:process_info(Pid, backtrace)是否有更好的方法來做到這一點,並從輸出中清除函數?

請注意,系統太大而無法使用fprof,而且etop也沒有指出我正確的方向。因爲我現在還不可能使用fprof,因爲現在只有部分系統是可能的,因爲我首先需要指出性能問題的一般位置。

+0

我不知道厄蘭,但我知道這種技術。你可以在調試器下運行你的程序,手動暫停它,並檢查調用堆棧嗎?我不擔心首先發現性能問題的大致位置,因爲如果它佔用了很大的時間百分比,那麼您可能會看到它的概率,並且如果它佔用很小的百分比,那麼您可能不會懷疑其他問題需要很大的百分比。 –

+0

@MikeDunlavey謝謝你的建議(我剛剛學會了如何在Erlang中暫停和恢復進程,因爲它)。儘管Erlang允許掛起進程,但我還沒有看到簡化callstack採樣的方法。使用'erlang:process_info(Pid,backtrace)',我可以在運行時檢索堆棧跟蹤,並且不需要自行掛起進程。但是,我只剩下解析那個輸出。 – evnu

+0

重要*不要*將採樣放入代碼中。從程序的角度來看,它必須發生在不可預知的時刻。另一點是你不需要大量的樣本(與廣泛的假設相反)。你只需要兩次看到一個問題,知道它值得修復,並且需要的平均樣本數是2/size_of_problem。因此,如果問題花費30%的時間,則需要兩次看到它的平均樣本數爲2/0.30 = 6.67個樣本。 –

回答

1

一個簡單的方法來獲得堆棧的實際大小是process_info(Pid, stack_size)。雖然這隻能以字的形式返回堆棧的大小,但它是一種查看哪些進程有大堆棧的非常簡單高效的方法。

+0

不會「減少」是確定大負荷起源的更好措施嗎?我期望在系統上施加很多負擔的過程將顯示一貫的大量「減少」。 'stack_size'的初步測試是不確定的(或者我誤解了數字) – evnu

+1

是的,「減少」會是一個更好的測量,但這是一個評論,原始問題是關於「backtrace」的替代方案。 – rvirding