에셋 사전 컴파일로 인한 과도한 메모리 사용

@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"
Plugin name is 'msgraph-polling', but plugin directory is named 'msgraph-poll-discourse-plugin'

# 여기서 영원히 멈춥니다

AssetProcessor.ember_versiondiscourse/lib/plugin/js_manager.rb at latest · discourse/discourse · GitHub 에 있는 줄에 해당합니다.

그래서 저는 이 파일(첨부됨)을 수정했는데, 기본적으로 처리 중에 어디에서 막히는지 출력하도록 하고, discourse/lib/plugin/js_manager.rb at latest · discourse/discourse · GitHubAssetProcessor.ember_version을 제거하여 5를 넣어 hex 생성을 계속하도록 했습니다.

그리고 discourse/lib/plugin/js_manager.rb at latest · discourse/discourse · GitHub (parallel_count = [Etc.nprocessors, 1].min) 에서 병렬성을 1로 줄여 상황을 단순화했습니다.

이후 bundle exec rake assets:precompile:build를 실행하니 다음과 같은 결과가 나왔습니다:

/var/www/discourse$ bundle exec rake assets:precompile:build
Plugin name is 'msgraph-polling', but plugin directory is named 'msgraph-poll-discourse-plugin'
[assemble_ember_build] Reusing existing core ember build. All done.
Plugin name is 'msgraph-polling', but plugin directory is named 'msgraph-poll-discourse-plugin'
[Plugin::JsManager] Compiling 49 plugins...
Compiling automation...
end of files.sort
end of files.sort
        hex_digest 103dc9ebebb80a7065cb8dd41fb3356b30f151f7
########### recursive

# 여기서 영원히 멈추며, 전체 메모리를 소모합니다

ulimit 값과 관련이 있을 수 있다고 의심합니다. (우리는 ulimit -n 1048576; 같은 값 대신 unlimited으로 설정해 두었습니다.) 많은 수의 파일을 열고 그 내용을 메모리에 저장하기 때문(재귀 호출을 통해)이라고 생각합니다.

이것이 떠오르는 것이 있거나, 문제의 원인에 대한 다른 단서가 있다면 알려주세요.

감사합니다,

Ismael

js_manager.rb.txt (7.7 KB)