Может ли кто-нибудь предоставить инструкции по настройке выделения памяти?
Учитывая периодические сообщения ядра об «исчерпании памяти» и дампы памяти, увеличение свопинга в 3 раза и нарастающее ухудшение отклика приложений, похоже, что наше приложение иногда испытывает нехватку памяти. В нашей системе сейчас 8 ГБ оперативной памяти и 2 ГБ своп-файла. Подробности ниже.
Я изучил инструкции по добавлению физической памяти и своп-файла по адресу ("Cannot allocate memory" when upgrading), но не смог найти подробностей о том, как их настроить.
Что касается конфигурации памяти, мы используем все настройки по умолчанию. Система восстанавливается через несколько минут, но с ростом нагрузки мы считаем, что пора разобраться, как улучшить производительность. Однако я не уверен, где и как это настроить: увеличить выделенную память для экземпляра Docker или количество процессов Ruby Unicorn (или и то, и другое)?
Я системный администратор без опыта работы с Ruby и с ограниченным опытом работы с Docker, поэтому указание на файл конфигурации и синтаксис, который нужно использовать, будет очень кстати.
Вы перезапустили discourse-setup после увеличения оперативной памяти? Это позволит автоматически настроить параметры памяти. Также вы можете ознакомиться с комментариями в файле app.yml и при необходимости внести в них изменения.
Привет, Рафаэль и команда, меня зовут Сергей, я работаю с мистером Хэппи Ли, который только что ушел в давно ожидаемый отпуск, поэтому я буду заниматься этой проблемой.
Дополнительно к описанию: сервер изначально был построен с 8 ГБ ОЗУ и 2 ГБ swap-пространства. С тех пор мы его не обновляли.
В системном журнале я вижу свидетельства того, что именно процесс Ruby потребляет всю память и вызывает ошибку OoM ядра:
Killed process 2960 (ruby) total-vm:10031472kB, anon-rss:7438148kB, file-rss:0kB
Я не эксперт в Ruby, поэтому не уверен, как посмотреть, какой именно процесс в Ruby потребляет столько памяти.
наш органазация оплатила разработку этого плагина, поэтому, к сожалению, я не могу опубликовать его исходный код. Кроме того, поскольку плагин работает на других экземплярах без проблем, я думаю, что стоит увеличить ресурсы памяти сервера для этого конкретного случая. Так как машина является виртуальной, я могу легко удвоить объем памяти и проверить, решит ли это проблему.
Мы мало что можем сделать для отладки кода, который не видим на нашей стороне. Возможно, вам стоит настроить плагин экспортера 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+]
Привет, Бенджамин, на других экземплярах тоже запущена версия Ruby 2.3.1-2~ubuntu16.04.14. Я проведу тестовое обновление, чтобы проверить, не сломает ли это нашу настройку Docker.