天天看點

erlang/elxir 監控工具 obvserver_cli

(寫在前面的話:對于erlang的開發者來說,observer_cli 不算是個新的項目,[email protected]:zhongwencool/observer_cli(感謝文哥開源),十分好用的,簡單整理個文檔) 

1) 簡介

observer_cli是一個針對erlangVM,基于recon和observer的實時監控系統名額的工具。因為生産環境一般都是linux系統,而observer是不支援linux系統(需要安裝wx),

有了observer_cli就可以在linux環境下更直覺的觀察環境,及早發現問題。

工具的好處:

線上可視化,資料的實時性,操作簡潔,幫助發現和定位問題.

特點:

Visualize Erlang/Elixir Nodes On The Command Line base on recon. (基于recon在指令行上可視化Erlang/Elixir節點)

Provide a high-performance tool usable both in development and production settings. (提供在開發和生産環境中都可用的高性能工具)

Focus on important and detailed information about real-time running system. (關注實時運作系統的重要和詳細資訊)

Keep minimal consumption. (盡量減少消耗)

2)安裝

observer_cli支援rebar建構,如果項目用的是rebar,隻需要将observer加入到對應項目的配置中.deps目錄中

{deps, [

{observer_cli, ".*", {git,"[email protected]:zhongwencool/observer_cli.git","7f80ae49570612b3732094b76494c0fbb073aa2b"}}

]}.

若用rebar3也可以構件引入該依賴項,另外Elixir也可以使用, 建構方式直接參照項目的ReadMe.

3)基礎用法

在./xxxx  debug的shell下, 使用 observer_cli:start(). 

來啟動本地的observer_cli程式,可以填入一個時間作為重新整理間隔,機關為毫秒,預設為1000

>observer_cli不僅可以檢視本地節點,也可以檢視遠端節點

>observer_cli:start('[email protected]').

>observer_cli:start('[email protected]',Cookie).

>observer_cli:start('[email protected]',[{cookie,Cookie}],{interval,1000}). 

以上三種方式都可以啟動,如果沒有指定cookie的時候就需要自己保證目前node和目标node的cookie一緻,當然遠端調用的時候還是可以指定重新整理間隔.

本地節點和遠端節點都必須将observer_cli的庫加進來,自定義插件部分的環境變量設定部分必須在檢視的節點上確定,而檢視的目标節點必須能确實能完成自定義插件配置的功能,

目标節點自定義插件的環境變量的設定不是必須的.

4)主界面介紹

erlang/elxir 監控工具 obvserver_cli

observer_cli提供的功能和observer非常像,而且依靠recon還完成了更細緻的記憶體配置設定資料,例如記憶體的使用率等

标題依次為

  • 首頁Home(H):提供概覽資訊,記憶體配置設定,程序數量,虛拟機基礎配置,cpu使用率,還有模仿etop的程序清單,可以使用關鍵字完成排序
  • 網絡Network(N):提供目前虛拟機已經打開的端口綜述,會列出目前已經打開的端口,同樣可以使用關鍵字完成排序,這部分内容大多依賴recon完成
  • 系統System(S):提供目前系統的概覽,這裡可以看到目前虛拟機記憶體配置設定的詳細情況。
  • ETS(E):提供ETS表的檢視,和observer功能類似,不過不能直接檢視内容。
  • Mnesia(M):Mnesia資料表的檢視
  • App(A):檢視目前虛拟機已經啟動的application,不過不能像observer那種直接以結構樹的形式展示,畢竟是指令行下,如果熟悉架構,這種平鋪清單的内容已經可以滿足解決問題的目的
  • Doc(D):幫助文檔,提供基礎指令的說明
  • Plugin(P):最新版本新增的支援自定義插件界面

關于記憶體和網絡端口詳細資料介紹可以檢視recon,

observer_cli做了介紹observer_cli文檔

主界面上展示的程序可以進入二級菜單針對單個進行進行詳細的檢視

erlang/elxir 監控工具 obvserver_cli

在Home頁面輸入目前程序的編号(最左邊的數字)即可,程序較多時可以使用F/B程序翻頁,重新整理較快時使用p暫停頁面操作

5)自帶插件功能擴充

需要自定義功能可開發自行擴充

6) erlang Shell下的recon操作舉例:

 比如:使用總的積累結果,查詢哪個port對應的在吃帶寬最多.

erlang/elxir 監控工具 obvserver_cli

 接下來,可以調用函數 recon:port_info(“#Port<XXXX>”)擷取更詳細的資訊,找到該 socket 的擁有者以及下一步工作需要的資訊

erlang/elxir 監控工具 obvserver_cli

 recon:port_info/1

元資訊

id 端口的内部索引。除了用來區分端口外,沒啥特殊用途。

name 端口的類型——比如像”tcp_inet”、”udp_inet”或者”efile”之類的名字

os_pid 如果端口不是 inet socket,而是代表一個外部的程序或者程式,那麼這個值會包含和外部程式對應的 OS 程序的 pid

信号

connected 每個端口都會有一個控制程序來對其負責,connected 指的就是這個程序的pid。

links 端口可以和程序連結起來,方式和程序間的類似。links 包含的就是所連結程序的清單。

如果端口曾經的 owner 并不多,或者沒有被手工和許多程序連結在一起,這個調用應該是安全的。

monitors 端口(代表外部程式)可以讓外部程式監控 Erlang 程序。這個調用會顯示這些程序。

IO

input 端口讀入的位元組數 output 寫入端口的位元組數

記憶體使用

memory 運作時系統為該端口配置設定的記憶體(機關為位元組)。這個值會偏小,并沒有包含

端口自己配置設定的空間

queue_size 端口程式有一個特殊的隊列,稱為驅動程式隊列。這個調用會傳回隊列大小,機關為位元組。

特定類型

Inet Ports 傳回inet特定的資料,包括統計資料、socket(sockename)的本地位址和端口号以及使用的inet選項。

其他目前除了inet端口外,recon不支援其他類型的端口,會傳回空清單。

再根據recon:info(Pid)查詢具體的程序相關資訊.

erlang/elxir 監控工具 obvserver_cli

 recon:info/1

dictionary 傳回程序字典中的所有資料項。通常可安全使用,因為一般不應該把G位元組的資料存放于此。

group_leader 程序的group_leader決定IO(檔案,io:format的輸出)的去向。

suspended 不管是因為 BIF 調用,還是因為 socket 或端口緩沖滿,作為一種反壓 機制的結果而被挂起,都是此值。僅當端口不忙時,程序才會再次變 成 runnable 的。

links 會報告出程序所連結的所有其他程序以及端口(socket、檔案描述符)清單。一般來說可安全調用,不過對于一些大的 supervisor 要小心使用,因為傳回的清單中會有成千上萬的項。

monitored_by 會傳回所有監控目前程序(通過 erlang:monitor/2)的程序清單。 monitors 和 monitored_by 相反,傳回所有被目前程序監控的程序清單。 trap_exit 如果該程序捕獲 exit,就傳回 true,否則傳回 false。

位置

current_function 以 tuple 的形式({Mod, Fun, Arity})顯示程序的目前運作函數。 current_location 顯示程序在子產品中的位置,顯示格式為:{Mod, Fun, Arity, [{file,FileName},{line, Num}]}

current_stacktrace 上一個選項(current_location)的更詳細版本,會以“current_location”清單的形式顯示目前的堆棧跟蹤資訊。

initial_call 顯示程序 spawn 時運作的函數,形式為:{Mod, Fun, Arity}。該資訊可以用來識别程序建立時執行的函數,

不能識别目前運作的函數。

binary 顯示所有refc binary的引用及其大小。如果此類binary配置設定過多,那麼調用起來就不安全。

garbage_collection 報告程序中有關垃圾回收的資訊。這部分資訊在官方文檔中被聲明為“subject to change”,應當以此為準。這部分内容往往會包括進 程已經執行的垃圾回收的次數,

完整清理(full‐sweep)垃圾回收的 選項,堆大小等等。

heap_size 典型的 Erlang 程序包含有一個“老”堆和一個“新”堆,并會經曆分代型

registered_name 如果程序有名字的話,可以通過這個鍵值擷取。 status 程序在排程器内部的分類。有如下幾種值:

exiting 程序已經結束,但是還未被完全清除

waiting 程序在 receive ... end 中等待

running 運作中

runnable 準備就緒,但是尚未被排程,因為另一個程序正在運作中 garbage_collecting 垃圾(generational)的垃圾回收。這項内容會顯示程序最新代的堆大小,通常也包 括堆棧大小。傳回值的機關是 word。

memory 傳回程序占用記憶體的大小,機關為位元組,包括:調用棧、堆以及作為程序的一 部分由 VM 使用的内部結構。

message_queue_len 顯示程序郵箱中等待的消息個數。

messages 傳回程序郵箱中的所有消息。在生産環境中,這個調用是極度危險的,比如,

如果正在調試某個程序而導緻它被鎖住,那麼其郵箱中會堆積上百萬條消息。 一定要先調用 message_queue_len 以確定安全。

total_heap_size 和 heap_size 類似,不過也會包含所有其他部分的堆,包括老堆。傳回 值的機關是 word

工作量

reductions

Erlang VM 基于 reduction 來進行排程,reduction 是一種規定的工作量機關, 用來保證排程實作的高度可移植性(基于時間的排程很難做到在所有 Erlang 運作的 OS 上都高效)。

程序的 reduction 值越高,表示其(在 CPU 和函數調 用意義上)所做的工作就越多。

如果尋找記憶體占用高的程序,可以把節點中的所有程序都羅列出來,并找到占用最高 的前 N 個。使用前面列出來的屬性以及 recon:proc_count(Attribute, N)函數,可以得到需要的資訊: recon:proc_count(memory,3).

不過,如果大部分程序都是短期的,尤其是生存期短到無法通過工具觀察,或者需要一個移 動的觀察視窗時(比如,現在有哪些程序在消耗記憶體或者運作代碼),就會出現問題。

對于這種情況,Recon 提供了 recon:proc_window(Attribute, Num, Milliseconds)函數.

備注:關于observer_cli的詳細文檔及參數含義等,請參見observer_cli文檔 .   

<<"硝煙中的erlang" (erlang In Anger 中文版)>>