Github Action에서 Out of Memory 해결
JavaScript heap out of memory
  • Github

시작하기

Github Action을 실행하다보면 (특히 TypeScript) 가끔 out of memory 에러를 볼 수 있다.

내용은 다음과 같다.

<--- Last few GCs --->

[3062:0x4cba330]   376275 ms: Scavenge 1711.4 (2076.8) -> 1707.2 (2079.2) MB, 15.6 / 0.4 ms  (average mu = 0.320, current mu = 0.394) allocation failure 
[3062:0x4cba330]   376382 ms: Scavenge 1716.0 (2079.8) -> 1711.8 (2086.0) MB, 23.1 / 0.1 ms  (average mu = 0.320, current mu = 0.394) allocation failure 
[3062:0x4cba330]   378067 ms: Mark-sweep 1725.0 (2087.4) -> 1697.3 (2081.2) MB, 1564.9 / 1.0 ms  (average mu = 0.368, current mu = 0.410) allocation failure scavenge might not succeed


<--- JS stacktrace --->

FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory
 1: 0xb090e0 node::Abort() [/opt/hostedtoolcache/node/16.20.1/x64/bin/node]
 2: 0xa1b70e  [/opt/hostedtoolcache/node/16.20.1/x64/bin/node]
 3: 0xce1a20 v8::Utils::ReportOOMFailure(v8::internal::Isolate*, char const*, bool) [/opt/hostedtoolcache/node/16.20.1/x64/bin/node]
 4: 0xce1dc7 v8::internal::V8::FatalProcessOutOfMemory(v8::internal::Isolate*, char const*, bool) [/opt/hostedtoolcache/node/16.20.1/x64/bin/node]
 5: 0xe99435  [/opt/hostedtoolcache/node/16.20.1/x64/bin/node]
 6: 0xe99f16  [/opt/hostedtoolcache/node/16.20.1/x64/bin/node]
 7: 0xea843e  [/opt/hostedtoolcache/node/16.20.1/x64/bin/node]
 8: 0xea8e80 v8::internal::Heap::CollectGarbage(v8::internal::AllocationSpace, v8::internal::GarbageCollectionReason, v8::GCCallbackFlags) [/opt/hostedtoolcache/node/16.20.1/x64/bin/node]
 9: 0xf0c324 v8::internal::ScavengeJob::Task::RunInternal() [/opt/hostedtoolcache/node/16.20.1/x64/bin/node]
10: 0xd9f9db non-virtual thunk to v8::internal::CancelableTask::Run() [/opt/hostedtoolcache/node/16.20.1/x64/bin/node]
11: 0xb720d4  [/opt/hostedtoolcache/node/16.20.1/x64/bin/node]
12: 0xb756b7 node::PerIsolatePlatformData::FlushForegroundTasksInternal() [/opt/hostedtoolcache/node/16.20.1/x64/bin/node]
13: 0x154c706  [/opt/hostedtoolcache/node/16.20.1/x64/bin/node]
14: 0x155ee34  [/opt/hostedtoolcache/node/16.20.1/x64/bin/node]
15: 0x154d058 uv_run [/opt/hostedtoolcache/node/16.20.1/x64/bin/node]
16: 0xa43975 node::SpinEventLoop(node::Environment*) [/opt/hostedtoolcache/node/16.20.1/x64/bin/node]
17: 0xb4b146 node::NodeMainInstance::Run() [/opt/hostedtoolcache/node/16.20.1/x64/bin/node]
18: 0xaccbcc node::Start(int, char**) [/opt/hostedtoolcache/node/16.20.1/x64/bin/node]
19: 0x7f19af26dd90  [/lib/x86_64-linux-gnu/libc.so.6]
20: 0x7f19af26de40 __libc_start_main [/lib/x86_64-linux-gnu/libc.so.6]
21: 0xa408ec  [/opt/hostedtoolcache/node/16.20.1/x64/bin/node]
Aborted (core dumped)

해결

ci 실행될 때 env 설정을 통해 max size 를 설정할 수 있다.

NODE_OPTIONS: --max_old_space_size=4096

yml 파일 전체에서 보면

- name: ci test
  run: |
    yarn test
  env:
    NODE_OPTIONS: --max_old_space_size=4096

이렇게 넣어준다.

정리

이게 완벽한 해결법일까? 아니다. ram 사이즈를 늘리는건 일시적인 방법이다.
일시적으로 action에서 사용할 수 있는 heap 사이즈를 늘려서 해결할 수 는 있지만, 결국 언젠가 다시 메모리가 꽉 차는 시점이 온다.

사용하는 module 을 잘 관리해야한다. (필요하지 않은 모듈은 제거하는 등)

그리고 필요시 github action이 아닌 다른 것으로 갈아타는것도 방법이다.

참고