2017-02-10 44 views
0

我有一個Elixir/Phoenix在生產中運行,過了一段時間,其中一個beam.smp進程達到100%的CPU負載(有時超過一個進程)。我不知道有任何觸發器造成這種情況。我如何知道發生了什麼?Production Elixir/Phoenix應用程序中的CPU CPU

編輯:

我在服務器上運行iex並連接到鳳凰節點。比我跑ETOP和得到這個輸出:

Load: cpu  100    Memory: total  69429 binary  10568 
     procs  303      processes 16656 code  20194 
     runq  1      atom   727 ets   7205 
Pid   Name or Initial Func Time Reds Memory MsgQ Current Function 
---------------------------------------------------------------------------------------- 
<19947.645.0> cowboy_protocol:init  '-'90164000 88736  0 'Elixir.MyApp.Error 
<19947.902.0> cowboy_protocol:init  '-'88696000 88744  0 'Elixir.MyApp.Error 
<19947.242.0> 'Elixir.Redix.Connec  '-' 11697 24704  0 gen_server:loop/6 
<19947.240.0> Elixir.Exq    '-' 10284 24664  0 gen_server:loop/6 
<19947.236.0> Elixir.Exq.Redis.Cli  '-' 9597 34520  0 gen_server:loop/6 
<19947.1695.0> etop_txt:init/1   '-' 6258 230504  0 etop:update/1 
<19947.245.0> Elixir.Exq.Scheduler  '-' 4831 24664  0 gen_server:loop/6 
<19947.241.0> 'Elixir.Redix.Connec  '-' 2339 8856  0 gen_server:loop/6 
<19947.426.0> Elixir.MyApp.Presen  '-'  262 143160  0 gen_server:loop/6 
<19947.238.0> Elixir.Exq.Stats   '-'  105 42344  0 gen_server:loop/6 
======================================================================================== 

這兩個cowboy_protocol:init條目引起的問題。但是爲什麼......以及如何停止/防止/調試它?

回答

3

cowboy_protocol:init開頭的進程是處理HTTP請求的進程。高減少計數表明它們陷入某種無限循環 - 兩個進程似乎都在執行相同的功能 - 這個功能出錯的機率非常高。

尾部位置的無限循環不消耗任何額外的內存 - 只有CPU。這是一個非常重要的功能--GenServer的工作原理 - 尾部無限循環,因此編譯器(或運行時)無法區分使用此模式的錯誤代碼和正確代碼。

這也是Erlang/Elixir所稱讚的「容錯」功能 - 儘管程序的一個分支中存在無限循環,其餘功能完全正常,並及時響應請求。很少有平臺能夠做到這一點。

+0

我找到了原因。我有一個模板,其中有一個帶有url的圖像標籤,不再存在的圖像,我忘了更新標籤。但是這怎麼會導致這樣的事情?! –

+0

它看起來像對不存在的圖像的每個請求都會導致這種情況。這不可能是正常的... –

+0

您是否將etop輸出中列出的功能看作「當前功能」?模塊名稱的開頭以「MyApp」作爲前綴,所以我認爲它是您的代碼。這很可能是發生錯誤的功能。 – michalmuskala