Zenn
📑

VitestとCircleCIでのメモリ不足を解消する

2025/02/28に公開

最近、奈良県民になったほっしゃん(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)、様子をみてみることにしました。

Social PLUS Tech Blog

Discussion

ログインするとコメントできます