Erlang應用系統內部狀態監控

2021-06-22 10:13:16 字數 1790 閱讀 8209

開發乙個基於erlang/otp的應用系統,實際上是構建了乙個由幾十萬甚至上百萬的erlang程序構成的乙個actor系統。

系統的內部健康狀態完全可以由內部的程序狀態來體現。

一般關心的程序狀態有:記憶體占用、訊息佇列大小、執行歸約數reduction等等。

attach到乙個啟動的erlang節點的命令:

erl -sname node_1 -remsh node_2@other_host

這樣就直接接入了node_2節點的內部了,想看啥就看啥。

etop工具:

etop類似linux的top工具,可以看到系統內部的一些狀態情況。etop是掃瞄erlang系統內部所有程序的狀態。

詳見:簡單示例:

圖中可以看到按照歸約數排序的程序狀態情況。也可以現在其他排序:

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

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

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

sort: value: runtime | reductions | memory | msg_q 

一般根據訊息佇列、程序歸約數、記憶體占用等排序情況就可以找到資源消耗較大的程序,然後重點關注。

需要指出的是,etop是乙個單程序的掃瞄,即產生乙個任務程序,其掃瞄所有的系統中的程序,然後進行排序。

如果系統中有幾十萬,甚至上百萬的程序,則這樣的etop掃瞄程序會直接拖掛整體系統。

因為erlang是公平排程系統,如果乙個程序的任務太重會強佔其他程序的歸約數,導致其他程序被連累,形成惡性迴圈。

因此需要將etop改造成多程序的方式來掃瞄整體系統,**如下:

sort(list) ->

sublist = lists:sublist(list, 20000),

case length(sublist) > 0 of

false ->

exit(normal);

true ->

spawn(fun() ->

sort = fun(, ) ->

sa > sb

end,

r = lists:sort(sort, sublist),

io:format("\n~p,sort:~p\n", [self(), lists:sublist(r, 4)]),

exit(normal)

end)

end,

case length(list) > 20000 of

true ->

sort(lists:nthtail(20001, list));

false ->

okend.

sort_memory() ->

pids = [ || p

sort(pids),

io:format("pid:~p", [self()]).

sort_reduction() ->

pids = [ || p

sort(pids),

io:format("pid:~p", [self()]).

sort_msg_queue() ->

pids = [ || p

sort(pids),

io:format("pid:~p", [self()]).

erlang 內部監控工具的方法

系統級別perf top,dstat tam,vtune 都能很好分析beam 瓶頸,本文主要erlang 級別排查 1.反編譯 確認線上執行 是否正確,reltools沒掌握好,公升級偶爾出現問題 decompile mod beam lib chunks code which mod abstr...

Erlang系統執行

1,啟動系統 erl erl 解釋執行從命令列方式輸入的一到幾行引數 init get argument key 或者init get arguments 獲得系統啟動引數 erlang也能夠訪問從命令列執行命令所產生的變數的數值 如 erl sky aa bb cc 那麼 通過init get a...

內部類 匿名內部類及應用

public class anonymousinner 多次呼叫匿名內部類的話把匿名內部類物件賦值給引用變數 animal cat new animal p.feed cat 匿名內部類物件可以呼叫自身的方法,下面的 除了實現父類animal的eat方法,還擁有自己的show方法,在建立了之後,就可...