2011-07-28 56 views
1

當我跑我的WebSocket的測試,我發現以下有趣的內存使用情況結果:二郎:內存使用情況的差異人物

服務器表示,沒有連接

[{total,573263528}, 
{processes,17375688}, 
{processes_used,17360240}, 
{system,555887840}, 
{atom,472297}, 
{atom_used,451576}, 
{binary,28944}, 
{code,3774097}, 
{ets,271016}] 
44 processes, 
System:705M, 
Erlang Residence:519M 

100K連接

[{total,762564512}, 
{processes,130105104}, 
{processes_used,130089656}, 
{system,632459408}, 
{atom,476337}, 
{atom_used,456484}, 
{binary,50160}, 
{code,3925064}, 
{ets,7589160}] 
100044 processes, 
System: 1814M, 
Erlang Residence: 950M 

200K連接

(重新啓動服務器並從0連接創建,而不是c從殼體2 ontinue)

[{total,952040232}, 
{processes,243161192}, 
{processes_used,243139984}, 
{system,708879040}, 
{atom,476337}, 
{atom_used,456484}, 
{binary,70856}, 
{code,3925064}, 
{ets,14904760}] 
200044 processes, 
System:3383M, 
Erlang: 1837M 

附圖與「系統:」和「二郎:」提供HTOP,其它的是從二郎殼的存儲器輸出()調用。請看一下總的和erlang居民的記憶。當沒有連接時,這兩個大致相同,具有100K連接,駐留內存比總數略大,具有200K連接,駐留內存幾乎是總數的兩倍。

有人可以解釋一下嗎?

+0

內存沒有被虛擬機跟蹤,而是連接的系統句柄? –

+0

我們需要更多信息。來自erlang VM和系統。在OS端運行pmap,並在erlang端運行進程摘要(例如頂端隊列持有者)。 – user425720

回答

4

您的查詢的最可能答案是內存碎片。

分配操作系統內存很貴,因此Erlang會嘗試爲您管理內存。 當Erlang分配內存時,它會創建一個名爲「carrier」的實體,它由許多「塊」組成。 Erlang內存(總計)報告所有塊大小(實際使用的內存)的總和。 OS報告所有載體大小的總和(使用的內存和預分配的總和)。塊大小和載體大小的總和可以從Erlang VM讀取。如果(塊大小)/(載波大小)爲1,則VM比解放載波困難。可能有許多大型運營商只使用了幾個模塊。你可以閱讀它:erlang:system_info({allocator,Type})。但有一個更簡單的方法。您可以使用偵察庫檢查:

http://ferd.github.io/recon/recon_alloc.html

首先檢查:

recon_alloc:fragmentation(current). 

和未來:

recon_alloc:fragmentation(max). 

這應該說明通過二郎山VM並上報總內存之間的區別OS。如果您通過網頁套接字發送很多小消息,您可以通過運行二郎神與2個選項減少碎片:

erl +MBas aobf +MBlmbcs 512 

第一種選擇將改變塊分配策略,從最適合的解決順序最適合的,這將有助於擠壓更多的塊進入第一載波,第二個塊減小最大多載波載波大小,這使得載波更小(這應該使它們更容易)。