2017-02-10 22 views
0

У меня есть Elixir/Phoenix, работающий на производстве, и через некоторое время один из процессов beam.smp переходит на 100% загрузку процессора (иногда более одного процесса). Я не знаю ни одного триггера, вызывающего это. Как я могу узнать, что происходит?Производство Elixir/Phoenix app hogs CPU

EDIT:

Я бегала Iex на сервере и подключается к узлу Phoenix. Чем я побежал 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

Вы посмотрели функцию, указанную в выходном потоке, как «Текущая функция»? Начало имени модуля имеет префикс «MyApp», поэтому я предполагаю, что это ваш код. Скорее всего, это функция, в которой произошла ошибка. – michalmuskala

 Смежные вопросы

  • Нет связанных вопросов^_^