erlang 故障排查工具

2022-02-12 18:38:23 字數 4013 閱讀 2958

系統級別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),

.

MongoDB 常用故障排查工具

1.profileprofiling levels 0,關閉profile 1,只抓取slow查詢 2,抓取所有資料。啟動profile並且設定profile級別 可以通過mongo shell啟動,也可以通過驅動中的profile命令啟動,啟動後記錄會被儲存在system.profile coll...

MongoDB 常用故障排查工具

1.profile profiling levels 0,關閉profile 1,只抓取slow查詢 2,抓取所有資料。啟動profile並且設定profile級別 可以通過mongo shell啟動,也可以通過驅動中的profile命令啟動,啟動後記錄會被儲存在system.profile col...

dig 優秀網域名稱故障排查工具

dig是不錯的排查網域名稱解析錯誤的工具,centos下安裝方法 yum install bind utils y 一般所關心的就幾個字段,question section 查詢資料 answer section 應答資料流程 server dns伺服器 一般使用的命令就這兩條 dig www.ag...