2014-10-26 3 views
3

Мне нужна ваша помощь в исследовании проблемы с потреблением памяти Erlang. Как типично, не так ли?Erlang сбор мусора

У нас есть две различные схемы развертывания.

  • В первой схеме мы работаем много одинаковых узлов на небольших виртуальных машинах (в Amazon AWS), один узла на каждую машину. Каждая машина имеет 4 ГБ ОЗУ.
  • В другой схеме развертывания мы запускаем эти узлы на больших baremetal машинах (с 64 ГБ ОЗУ), с множеством узлов на машину. В этом развертывании узлы изолированы в контейнерах докеров (с ограничением памяти до 4 Гб).

Я заметил, что куча процессов в докерезированных узлах выворачивает в 3 раза больше ОЗУ, чем кучи в незакрепленных узлах с одинаковой нагрузкой. Я подозреваю, что сбор мусора в неблокированных узлах более агрессивный. К сожалению, у меня нет статистики сбора мусора, но я хотел бы получить ее как можно скорее.

Чтобы предоставить дополнительную информацию, я должен сказать, что мы используем HiPE R17.1 на Ubuntu 14.04 с ядром запаса. В обеих схемах мы запускаем 8 планировщиков на узел и используем флаг по умолчанию fullsweep_after.

Мое слепое предложение заключается в том, что сборка мусора по умолчанию Erlang полагается (как-то) на /proc/meminfo (что не является фактическим в докерезованной среде). Я не C-guy и не знаком с внутренними эмуляторами, так что может кто-то указать мне места в источниках Erlang, которые отвечают за сбор мусора и некоторые параметры эмулятора, которые я могу использовать для настройки этого поведения?

+0

Эрланг сообщество довольно тонкий на этом сайте (те, кто знает здесь внутренности * знают * внутренностей, хотя). Возможно, вы захотите также разместить это в списке рассылки; * много * людей там знают много о внутренностях. – zxq9

+0

Также расскажите, как вы получаете эту цифру потребления памяти. Если это из служебной программы ОС, такой как top или/proc/meminfo, причина, по которой вы видите это, вероятно, очень отличается от того, что вы получаете цифру памяти из 'erlang: memory/0'. – zxq9

+0

Я собираю статистику непосредственно на узле erlang, используя несколько способов. Particulary, я использую 'erlang: memory/0' и вижу, что' erlang: memory (процессы) 'ненормально. Кроме того, у меня есть статистика по кучам процессов под некоторыми определенными супервизорами (я получаю их через «erlang: process_info (Pid, total_heal_size)» для каждого процесса под супервизором. –

ответ

1

Первое, что нужно знать, заключается в том, что сбор мусора i Erlang основан на процессе. Каждый процесс является GC в свое время и независимо друг от друга. Таким образом сбор мусора в вашей системе зависит только от данных в ваших процессах, а не от самой операционной системы.

При этом может существовать разница между потреблением памяти с точки зрения Eralang и системной точкой зрения. Вот почему сравнение erlang:memory с тем, что говорит ваша система, всегда является хорошей идеей (это может показать вам некоторые бинарные утечки или другие проблемы с памятью).

Если вы хотите, чтобы понять немного больше о Erlang внутренностей я рекомендовал бы эти два доклада:

https://www.youtube.com/watch?v=QbzH0L_0pxI

https://www.youtube.com/watch?v=YuPaX11vZyI

И от немного лучше отладки вашего управления памятью я мог РеКомендУем начиная с http://ferd.github.io/recon/

+1

Спасибо за ссылки! Я уже использую 'recon' как можно дальше У меня есть хорошая статистика о том, что говорит «erlang: memory/0» и то, что я вижу на хосте. Также я искал утечки bin, но использование двоичного кода не заставляет меня страдать. Есть только одна странная вещь - ненормальная (см. «erlang: memory (процессы)» или «erlang: process_info (total_heap_size)». –

+1

Разве вы не используете 'erlang: memory (процессы_used)' для вычисления фактического размера кучи процессов? – mpm

+0

Ах, да, я забыл об этом. «Erlang: memory (процессы)» означает выделенную память, а «erlang: memory (processes_used)» означает память, которая фактически используется, правильно ли я? Также у меня есть отдельная статистика по каждому эрланговому распределителю (включая 'eheap_alloc'). Вся эта метрика (процессы, процессы_used и eheap_alloc) почти идентична (плюс-минус несколько мегабайт на каждый Gb). –