Чрезмерное потребление памяти из-за предварительной компиляции ассетов

Привет, @david,

Освобождается ли потребление памяти сразу после завершения задачи assets:build?

Нет. Я покопался глубже, и обнаружил кое-что странное.

До выполнения precompiling:build список плагинов выглядел так:

/var/www/discourse$ ls plugins/
automation           discourse-akismet           discourse-data-explorer  discourse-hcaptcha           discourse-microsoft-auth  discourse-post-voting  discourse-saved-searches       discourse-user-notes           styleguide
chat                 discourse-apple-auth        discourse-details        discourse-lazy-videos        discourse-narrative-bot   discourse-presence     discourse-solved               discourse-zendesk-plugin
checklist            discourse-assign            discourse-docs           discourse-local-dates        discourse-oauth2-basic    discourse-prometheus   discourse-subscriptions        footnote
discourse-adplugin   discourse-cakeday           discourse-gamification   discourse-login-with-amazon  discourse-openid-connect  discourse-reactions    discourse-templates            msgraph-poll-discourse-plugin
discourse-affiliate  discourse-calendar          discourse-github         discourse-lti                discourse-patreon         discourse-rewind       discourse-topic-trade-buttons  poll
discourse-ai         discourse-chat-integration  discourse-graphviz       discourse-math               discourse-policy          discourse-rss-polling  discourse-topic-voting         spoiler-alert

В ходе отладки кода я заметил следующее поведение:

/var/www/discourse$ script/rails runner "AssetProcessor.ember_version"
Имя плагина — 'msgraph-polling', но имя директории плагина — 'msgraph-poll-discourse-plugin'

# здесь зависает навсегда

Вызов AssetProcessor.ember_version соответствует строке discourse/lib/plugin/js_manager.rb at latest · discourse/discourse · GitHub.

Поэтому я внес некоторые изменения в этот файл (прикреплен), в основном для вывода информации о том, где именно происходит задержка при обработке, а также для удаления вызова AssetProcessor.ember_version в строке discourse/lib/plugin/js_manager.rb at latest · discourse/discourse · GitHub, заменив его на 5, чтобы продолжить генерацию hex-значения.

Затем я уменьшил параметр параллелизма до 1 в строке discourse/lib/plugin/js_manager.rb at latest · discourse/discourse · GitHub (parallel_count = [Etc.nprocessors, 1].min), чтобы упростить процесс.

После этого я выполнил команду bundle exec rake assets:precompile:build, что привело к следующему:

/var/www/discourse$ bundle exec rake assets:precompile:build
Имя плагина — 'msgraph-polling', но имя директории плагина — 'msgraph-poll-discourse-plugin'
[assemble_ember_build] Повторное использование существующей сборки core ember. Всё готово.
Имя плагина — 'msgraph-polling', но имя директории плагина — 'msgraph-poll-discourse-plugin'
[Plugin::JsManager] Компиляция 49 плагинов...
Компиляция automation...
конец сортировки файлов
конец сортировки файлов
        hex_digest 103dc9ebebb80a7065cb8dd41fb3356b30f151f7
########### рекурсивно

# зависает здесь навсегда, потребляя всю доступную память

У меня есть подозрение, что проблема может быть связана со значением ulimit (которое у нас установлено в unlimited вместо чего-то вроде ulimit -n 1048576;), учитывая, что открывается довольно большое количество файлов, и их содержимое сохраняется в памяти (благодаря рекурсивным вызовам).

Дайте знать, если это вам что-то говорит, или если у вас есть другие идеи относительно возможной причины проблемы.

С уважением,

Исмаэль

js_manager.rb.txt (7.7 KB)