VitestとCircleCIでのメモリ不足を解消する
最近、奈良県民になったほっしゃん(https://github.com/hotsum92)です!!!
VitestをCircleCI上で動作させる上でメモリ不足でテストが落ちることに遭遇したので、記事にしてみました。
問題
VitestのCircleCIで時折、テスト失敗し、動作が不安定になっていました。
具体的には…
-
Nodeで
JavaScript heap out of memory
が発生。
-
Worker exited unexpectedly
でテストの実行が失敗する。
検証
CircleCI: How-To-Record-a-Job-s-Memory-Usage を参考に、circleciの設定ファイルにメモリの使用量計測のためのコードを追加してみました。
メモリ計測のために追加したコード(.circleci/config.yml)
- run:
command: cat /sys/fs/cgroup/memory/memory.max_usage_in_bytes
when: always
このとき、circleciのリソースクラスをLargeで実行されていたのですが、そのメモリの8GBを超える値が記録されていました。
計測されたメモリの使用量
ためしに、vitest run --poolOptions.forks.minForks=1 --poolOptions.forks.maxForks=4
のようにテストの並列実行数を減らしてみると、メモリの使用量が減っていることが確認できました。
maxForks | メモリ | 実行時間 |
---|---|---|
抑制なし | 8.5G | - |
--no-file-parallelism | 3.3G | 6m40s |
2 | 4.3G | 3m29s |
3 | 4.9G | 2m12s |
4 | 5.3G | 1m49s |
5 | 5.4G | 1m50s |
maxforks のデフォルト値は、利用できるCPUの数と等しいはずですが、CircleCI:Docker-Executor-returning-Total-Host-CPU-Cores をみてみると、circleciのリソースクラスのCPUではなく、ホストの物理的なCPUの数で動作しているようです。
結論
今回利用しているcircleciのリソースクラスは、LargeでそのCPUの数は4なので、その値と同じ数に設定することで(vitest run --poolOptions.forks.minForks=1 --poolOptions.forks.maxForks=4
)、様子をみてみることにしました。
Discussion