Мне нужна ваша помощь в исследовании проблемы с потреблением памяти Erlang. Как типично, не так ли?Erlang сбор мусора
У нас есть две различные схемы развертывания.
- В первой схеме мы работаем много одинаковых узлов на небольших виртуальных машинах (в Amazon AWS), один узла на каждую машину. Каждая машина имеет 4 ГБ ОЗУ.
- В другой схеме развертывания мы запускаем эти узлы на больших baremetal машинах (с 64 ГБ ОЗУ), с множеством узлов на машину. В этом развертывании узлы изолированы в контейнерах докеров (с ограничением памяти до 4 Гб).
Я заметил, что куча процессов в докерезированных узлах выворачивает в 3 раза больше ОЗУ, чем кучи в незакрепленных узлах с одинаковой нагрузкой. Я подозреваю, что сбор мусора в неблокированных узлах более агрессивный. К сожалению, у меня нет статистики сбора мусора, но я хотел бы получить ее как можно скорее.
Чтобы предоставить дополнительную информацию, я должен сказать, что мы используем HiPE R17.1 на Ubuntu 14.04 с ядром запаса. В обеих схемах мы запускаем 8 планировщиков на узел и используем флаг по умолчанию fullsweep_after
.
Мое слепое предложение заключается в том, что сборка мусора по умолчанию Erlang полагается (как-то) на /proc/meminfo
(что не является фактическим в докерезованной среде). Я не C-guy и не знаком с внутренними эмуляторами, так что может кто-то указать мне места в источниках Erlang, которые отвечают за сбор мусора и некоторые параметры эмулятора, которые я могу использовать для настройки этого поведения?
Эрланг сообщество довольно тонкий на этом сайте (те, кто знает здесь внутренности * знают * внутренностей, хотя). Возможно, вы захотите также разместить это в списке рассылки; * много * людей там знают много о внутренностях. – zxq9
Также расскажите, как вы получаете эту цифру потребления памяти. Если это из служебной программы ОС, такой как top или/proc/meminfo, причина, по которой вы видите это, вероятно, очень отличается от того, что вы получаете цифру памяти из 'erlang: memory/0'. – zxq9
Я собираю статистику непосредственно на узле erlang, используя несколько способов. Particulary, я использую 'erlang: memory/0' и вижу, что' erlang: memory (процессы) 'ненормально. Кроме того, у меня есть статистика по кучам процессов под некоторыми определенными супервизорами (я получаю их через «erlang: process_info (Pid, total_heal_size)» для каждого процесса под супервизором. –