Consumo excessivo de memória devido à pré-compilação de assets

Olá @david,

O uso de memória diminui assim que a tarefa assets:build é concluída?

Não. Investiguei mais a fundo e há algo estranho.

Antes de executar o precompiling:build, esta é a lista de plugins:

/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

Percebi o seguinte comportamento após depurar o código.

/var/www/discourse$ script/rails runner "AssetProcessor.ember_version"
O nome do plugin é 'msgraph-polling', mas o diretório do plugin se chama 'msgraph-poll-discourse-plugin'

# trava aqui para sempre

O AssetProcessor.ember_version corresponde à linha discourse/lib/plugin/js_manager.rb at latest · discourse/discourse · GitHub

Então, fiz algumas modificações neste arquivo (em anexo), basicamente para imprimir onde ele trava durante o processamento e para remover o AssetProcessor.ember_version em discourse/lib/plugin/js_manager.rb at latest · discourse/discourse · GitHub, colocando apenas 5 para continuar a geração do hash hexadecimal.

Em seguida, reduzi o paralelismo para 1 para facilitar as coisas em discourse/lib/plugin/js_manager.rb at latest · discourse/discourse · GitHub (parallel_count = [Etc.nprocessors, 1].min).

Após isso, executei bundle exec rake assets:precompile:build, resultando no seguinte:

/var/www/discourse$ bundle exec rake assets:precompile:build
O nome do plugin é 'msgraph-polling', mas o diretório do plugin se chama 'msgraph-poll-discourse-plugin'
[assemble_ember_build] Reutilizando a build principal do Ember existente. Tudo pronto.
O nome do plugin é 'msgraph-polling', mas o diretório do plugin se chama 'msgraph-poll-discourse-plugin'
[Plugin::JsManager] Compilando 49 plugins...
Compilando automation...
final de files.sort
final de files.sort
        hex_digest 103dc9ebebb80a7065cb8dd41fb3356b30f151f7
########### recursivo

# trava aqui para sempre, consumindo toda a memória

Suspeito que isso possa estar relacionado ao valor de ulimit (que configuramos como unlimited em vez de algo como ulimit -n 1048576;), dado que você está abrindo um grande número de arquivos e armazenando seu conteúdo na memória (por meio de chamadas recursivas).

Avise-me se isso lhe soa familiar ou se você tem alguma outra pista sobre qual pode ser o problema.

Abraços,

Ismael

js_manager.rb.txt (7.7 KB)