Как настроить лимит памяти Ruby?

Можно ли сделать параметр конфигурации сайта, определяющий, сколько памяти может использоваться? В настоящее время настройка установлена на 2 ГБ (Редактирование: ой, я ошибся, см. ниже), а ранее было 4 ГБ, хотя рекомендуемая конфигурация оборудования — 1 ГБ + файл подкачки. Мне кажется, что узел с 1 ГБ памяти может оказаться в состоянии интенсивной подкачки, если использование памяти Ruby действительно достигнет 2 ГБ.

Из журнала обновления:

Миграция по умолчанию
Инициализация по умолчанию
*** Сборка активов. Это займет некоторое время ***
$ RUBY_GC_MALLOC_LIMIT_MAX=20971520 RUBY_GC_OLDMALLOC_LIMIT_MAX=20971520 RUBY_GC_HEAP_GROWTH_MAX_SLOTS=50000 RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR=0.9  bundle exec rake assets:precompile
Очистка временных файлов
Сборка активов
1 лайк

Не уверен, насколько эти настройки актуальны в современном Ruby, но @sam знает лучше.

1 лайк

Эм, извините, это не 2G, а 20 Мбит/с. Так что ситуация совсем не такая, как я думал. (Редактирование: всё ещё хуже! См. ниже)

1 лайк

Попробуйте 20Г. :wink: :slightly_smiling_face:

1 лайк

У Discourse предсказуемое потребление памяти, поэтому нужным параметром для вас будет количество рабочих процессов Unicorn.

Если у вас сервер с 1 ГБ памяти, по умолчанию будет установлено 2 рабочих процесса, что должно работать нормально при таком ограниченном объеме памяти.

2 лайка

Действительно, пока работает как форум. Но это не то!

При обновлении некоторые задачи указывают эти переменные окружения для Ruby.

1 лайк

Да, во время обновлений мы устанавливаем эти переменные, чтобы обновление не завершалось сбоем из-за нехватки памяти на машинах с очень низкой производительностью.

2 лайка

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

2 лайка

Мы многократно тестировали эту процедуру за годы и можем гарантировать, что она будет работать для небольших сообществ на VPS с 1 ГБ ОЗУ. Она даже завершает дополнительные воркеры Unicorn, чтобы освободить память во время обновления и помочь.

Вы можете прочитать код, который появился в этом коммите:

Если вы сможете воспроизвести сбой на дроплете Digital Ocean, мы с радостью поможем разобраться.

Если это необходимо, вы можете форкнуть плагин и настроить его под свои нужды.

4 лайка

Спасибо, теперь у меня есть представление. (Два очень важных момента: эти настройки сборщика мусора (GC) настроены специально для обновлений, и единицы измерения — байты, поэтому текущий лимит установлен на 20 МБ. В этой предыдущей теме есть полезные и интересные детали [архивная ссылка, так как сейчас она мне недоступна].)

2 лайка

Нам стоит восстановить эту тему, @sam? Она представляет историческую ценность или устарела?

1 лайк

Это, безусловно, устаревшая информация: в последней версии Ruby существует несколько ограничений для malloc. Это интересная тема с исторической ценностью, но наверху обязательно должен быть крупный знак «Устаревшая информация».

Наш процесс обновления уже работает на пределе возможностей; лучшее, что мы можем сделать сверх этого, — это снизить доступность. Если память сильно ограничена, вам придётся мириться с перебоями в работе при обновлении.

5 лайков