Cloud Profilerを使ってNode.jsのメモリリークの原因を特定する
BRANK

Node.js のサーバーにおいて、メモリリークの原因の特定に Cloud Profiler を使って解決したので経緯などを含めて紹介します。現象Node.js のサーバーで、デプロイ後にメモリ使用量が増えていき、一定を超えると戻るという現象が発生していました。このメモリ使用量が落ちているところのログを確認したところFATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memoryというログとともにプロセスが再起動していることがわかりました。明らかにメモリリークしてそうです。原因をつきとめるまずは現象を再現するために、ローカルやテスト環境に負荷をかけて試してみたんですが、再現できませんでした。そこで本番環境でプロファイルをとって原因を探ろうとしました。Node.jsでは以下のようなコードで heap snapshot を取れます。import { writeHeapSnapshot } from "node:v8"; writeHeapSnapshot(pathToFile); しかし、この v8 モジュールの heap snapshot を取る機能、調べた限り同期 API しかないうえに実行にも数秒〜数十秒かかり、その間すべてのリクエストがブロックされてしまいます。なので本番環境で気軽に実行する…

zenn.dev
Related Topics: Node.js JavaScriptRuntime
2 comments