Ошибки нехватки памяти с кастомным плагином

Может ли кто-нибудь предоставить инструкции по настройке выделения памяти?

Учитывая периодические сообщения ядра об «исчерпании памяти» и дампы памяти, увеличение свопинга в 3 раза и нарастающее ухудшение отклика приложений, похоже, что наше приложение иногда испытывает нехватку памяти. В нашей системе сейчас 8 ГБ оперативной памяти и 2 ГБ своп-файла. Подробности ниже.

Я изучил инструкции по добавлению физической памяти и своп-файла по адресу ("Cannot allocate memory" when upgrading), но не смог найти подробностей о том, как их настроить.

Что касается конфигурации памяти, мы используем все настройки по умолчанию. Система восстанавливается через несколько минут, но с ростом нагрузки мы считаем, что пора разобраться, как улучшить производительность. Однако я не уверен, где и как это настроить: увеличить выделенную память для экземпляра Docker или количество процессов Ruby Unicorn (или и то, и другое)?

Я системный администратор без опыта работы с Ruby и с ограниченным опытом работы с Docker, поэтому указание на файл конфигурации и синтаксис, который нужно использовать, будет очень кстати.

Discourse 2.6.0 beta2
Ruby 2.3.1-2~ubuntu16.04.14
Ubuntu 16.04

Сколько единорогов вы запускаете? Это значение задано в вашем файле /var/discourse/containers/app.yml.

Привет, Рафаэль! В разделе “env” файла app.yml я вижу, что у нас настроено использование 4.

Вы перезапустили discourse-setup после увеличения оперативной памяти? Это позволит автоматически настроить параметры памяти. Также вы можете ознакомиться с комментариями в файле app.yml и при необходимости внести в них изменения.

Получение ошибки OOM всего с 4 воронами — это действительно странно. Это должно занимать около 2 ГБ, оставляя 6 ГБ для PG и Redis.

Вам нужно выяснить, какой процесс потребляет всю память во время события OOM, это не нормально.

Привет, Рафаэль и команда, меня зовут Сергей, я работаю с мистером Хэппи Ли, который только что ушел в давно ожидаемый отпуск, поэтому я буду заниматься этой проблемой.

Дополнительно к описанию: сервер изначально был построен с 8 ГБ ОЗУ и 2 ГБ swap-пространства. С тех пор мы его не обновляли.

В системном журнале я вижу свидетельства того, что именно процесс Ruby потребляет всю память и вызывает ошибку OoM ядра:

Killed process 2960 (ruby) total-vm:10031472kB, anon-rss:7438148kB, file-rss:0kB

Я не эксперт в Ruby, поэтому не уверен, как посмотреть, какой именно процесс в Ruby потребляет столько памяти.

Буду признателен за любые предложения.

Спасибо.

— Сергей

Установлены ли какие-либо плагины в этой установке Discourse?

У нас действительно установлен кастомный плагин Scheduled Digest, однако он также работает на наших двух других установках, и там проблем нет.

Можете ли вы разместить здесь ссылку на репозиторий исходного кода этого плагина?

Привет, Рафаэль,

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

Хорошо, удачи!

Мы мало что можем сделать для отладки кода, который не видим на нашей стороне. Возможно, вам стоит настроить плагин экспортера Prometheus для Discourse, чтобы отслеживать метрики вашего экземпляра.

Запущены ли другие экземпляры также с версией Ruby 2.3.1-2~ubuntu16.04.14?

Возможно, это не имеет отношения к делу, но:

Итак, это была явная ошибка в Ruby. Мы протестировали несколько версий Ruby и выяснили, что утечка наблюдалась только в версиях 2.3.x и 2.4.x (по-видимому, это было исправлено в Ruby 2.5.0****).

А в readme проекта Discourse требуется [Ruby 2.6+] :roll_eyes:

Спасибо! Как только всё уляжется, я опубликую обновление.

Привет, Бенджамин, на других экземплярах тоже запущена версия Ruby 2.3.1-2~ubuntu16.04.14. Я проведу тестовое обновление, чтобы проверить, не сломает ли это нашу настройку Docker.

Версия Ruby здесь не имеет значения

Пока вы используете наш официальный Docker-образ, вы будете использовать правильную поддерживаемую версию Discourse.