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이 아닌 다른 것으로 갈아타는것도 방법이다.