系統級別perf top, dstat -tam, vtune 都能很好分析beam 瓶頸,本文主要erlang 級別排查:
1. 反編譯
確認線上執行**是否正確,reltools沒掌握好,公升級偶爾出現問題
decompile(mod) ->2. 程序棧}]}} = beam_lib:chunks(code:which(mod), [abstract_code]),
io:format("~s~n", [erl_prettypr:format(erl_syntax:form_list(ac))]).
類似於jstack,發現大量程序掛起,程序數過高,執行慢,hang住等問題用到
pstack(reg) when is_atom(reg) ->3. etopcase whereis(reg) of
undefined -> undefined;
pid -> pstack(pid)
end;
pstack(pid) ->
io:format("~s~n", [element(2, process_info(pid, backtrace))]).
分析記憶體、cpu占用程序,即使數十w程序node 也能正常使用
%程序cpu占用排名4. gc alletop() ->
spawn(fun() -> etop:start([, , , ]) end).
%程序mem占用排名
etop_mem() ->
spawn(fun() -> etop:start([, , , ]) end).
%停止etop
etop_stop() ->
etop:stop().
程序記憶體過高時,來一發,看看是記憶體洩露還是gc不過來
% 對所有process做gc5. fprofgc_all() ->
[erlang:garbage_collect(pid) || pid <- processes()].
% 對mfa 執行分析,會嚴重減緩執行,建議只對小量業務執行6. eprof% 結果:
% fprof 結果比較詳細,能夠輸出熱點呼叫路徑
fprof(m, f, a) ->
fprof:start(),
fprof:profile(),
fprof:analyse(),
fprof:stop().
% 對整個節點內所有程序執行eprof, eprof 對線上業務有一定影響,慎用!7. scheduler usage% 建議timeoutsec<10s,且程序數< 1000,否則可能導致節點crash
% 結果:
% 輸出每個方法實際執行時間(不會累計方法內其他mod呼叫執行時間)
% 只能得到mod - fun 執行次數 執行耗時
eprof_all(timeoutsec) ->
eprof(processes() -- [whereis(eprof)], timeoutsec).
eprof(pids, timeoutsec) ->
eprof:start(),
eprof:start_profiling(pids),
timer:sleep(timeoutsec),
eprof:stop_profiling(),
eprof:analyze(total),
eprof:stop().
% 統計下1s每個排程器cpu的實際利用率(因為有spin wait、排程工作, 可能usage 比top顯示低很多)8. 程序排程scheduler_usage() ->
scheduler_usage(1000).
scheduler_usage(runms) ->
erlang:system_flag(scheduler_wall_time, true),
ts0 = lists:sort(erlang:statistics(scheduler_wall_time)),
timer:sleep(runms),
ts1 = lists:sort(erlang:statistics(scheduler_wall_time)),
erlang:system_flag(scheduler_wall_time, false),
cores = lists:map(fun(, }) ->
end, lists:zip(ts0, ts1)),
= lists:foldl(fun(, }, ) ->
end, , lists:zip(ts0, ts1)),
total = a/t,
io:format("~p~n", [[ | cores]]).
% 統計下1s內排程程序數量(含義:第乙個數字執行程序數量,第二個數字遷移程序數量)9. trace 日誌scheduler_stat() ->
scheduler_stat(1000).
scheduler_stat(runms) ->
erlang:system_flag(scheduling_statistics, enable),
ts0 = erlang:system_info(total_scheduling_statistics),
timer:sleep(runms),
ts1 = erlang:system_info(total_scheduling_statistics),
erlang:system_flag(scheduling_statistics, disable),
lists:map(fun(, }) ->
end, lists:zip(ts0, ts1)).
會把mod 每次呼叫詳細mfa log 下來,args 太大就不好看了
%trace mod 所有方法的呼叫10. 記憶體高oom 排查工具trace(mod) ->
dbg:tracer(),
dbg:tpl(mod, '_', ),
dbg:p(all, c).
%trace node上指定 mod 所有方法的呼叫, 結果將輸出到本地shell
trace(node, mod) ->
dbg:tracer(),
dbg:n(node),
dbg:tpl(mod, '_', ),
dbg:p(all, c).
%停止trace
trace_stop() ->
dbg:stop_clear().
etop 無法應對10w+ 程序節點, 下面**就沒問題了;找到可疑proc後通過pstack、message_queu_len 排查原因
proc_mem_all(sizelimitkb) ->procs = [ || pid<- erlang:processes()],
proc_mem(procs, sizelimitkb).
proc_mem(sizelimitkb) ->
procs = [ || <- release_handler_1:get_supervised_procs(),
is_process_alive(pid)],
proc_mem(procs, sizelimitkb).
proc_mem(procs, sizelimitkb) ->
sizelimit = sizelimitkb * 1024,
= lists:foldl(fun(, ) ->
case erlang:process_info(pid, total_heap_size) of
->
size = size0*8,
case size > sizelimit of
true -> | acc], totalsize+size};
false ->
end;
_ ->
endend, , procs),
r1 = lists:keysort(3, r),
.
Erlang應用系統內部狀態監控
開發乙個基於erlang otp的應用系統,實際上是構建了乙個由幾十萬甚至上百萬的erlang程序構成的乙個actor系統。系統的內部健康狀態完全可以由內部的程序狀態來體現。一般關心的程序狀態有 記憶體占用 訊息佇列大小 執行歸約數reduction等等。attach到乙個啟動的erlang節點的命...
erlang的打包工具rebar
以發布ping為例 1.獲取原始碼 deps,並且完成編譯 2生成配置檔案 cd mkdir rel cd rel rebar create node nodeid ping 該選項需要列出需要的erlang lib庫 該選項預設erlang lib庫,不需要自己寫 4.生成系統 cd rel re...
erlang 的安裝方法 Centos
因為安裝rabbitmq,必須依賴erlang。其實官網已經寫的很清楚了,在這裡留下筆記。step 1 wget rpm uvh erlang solutions 1.0 1.noarch.rpm step 2 rpm import主要新增了 etc yum.repo.d erlang soluti...