系統級別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做gcgc_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...