erlang 內部監控工具的方法

2021-10-01 21:57:24 字數 4087 閱讀 7180

系統級別perf top, dstat -tam, vtune 都能很好分析beam 瓶頸,本文主要erlang 級別排查:

1. 反編譯

確認線上執行**是否正確,reltools沒掌握好,公升級偶爾出現問題

decompile(mod) ->

}]}} = beam_lib:chunks(code:which(mod), [abstract_code]),

io:format("~s~n", [erl_prettypr:format(erl_syntax:form_list(ac))]).

2. 程序棧

類似於jstack,發現大量程序掛起,程序數過高,執行慢,hang住等問題用到

pstack(reg) when is_atom(reg) ->

case whereis(reg) of

undefined -> undefined;

pid -> pstack(pid)

end;

pstack(pid) ->

io:format("~s~n", [element(2, process_info(pid, backtrace))]).

3. etop

分析記憶體、cpu占用程序,即使數十w程序node 也能正常使用

%程序cpu占用排名

etop() ->

spawn(fun() -> etop:start([, , , ]) end).

%程序mem占用排名

etop_mem() ->

spawn(fun() -> etop:start([, , , ]) end).

%停止etop

etop_stop() ->

etop:stop().

4. gc all

程序記憶體過高時,來一發,看看是記憶體洩露還是gc不過來

% 對所有process做gc

gc_all() ->

[erlang:garbage_collect(pid) || pid <- processes()].

5.  fprof

% 對mfa 執行分析,會嚴重減緩執行,建議只對小量業務執行

% 結果:

% fprof 結果比較詳細,能夠輸出熱點呼叫路徑

fprof(m, f, a) ->

fprof:start(),

fprof:profile(),

fprof:analyse(),

fprof:stop().

6. eprof

% 對整個節點內所有程序執行eprof, eprof 對線上業務有一定影響,慎用!

% 建議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().

7. scheduler usage

% 統計下1s每個排程器cpu的實際利用率(因為有spin wait、排程工作, 可能usage 比top顯示低很多)

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]]).

8.  程序排程

% 統計下1s內排程程序數量(含義:第乙個數字執行程序數量,第二個數字遷移程序數量)

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)).

9. trace 日誌

會把mod 每次呼叫詳細mfa log 下來,args 太大就不好看了

%trace mod 所有方法的呼叫

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().

10. 記憶體高oom 排查工具

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...