メモリのプロファイリング
ワーカーのメモリ使用量を理解することで、パフォーマンスを最適化し、ワーカーのメモリ制限に達した際のアウトオブメモリー(OOM)エラーを回避し、メモリリークを修正することができます。
DevToolsを使用してメモリ使用量をスナップショットでプロファイリングできます。メモリスナップショットを使用すると、メモリ使用量の概要を表示し、異なるデータタイプに割り当てられたメモリ量を確認し、メモリ内の特定のオブジェクトの詳細を取得できます。
メモリスナップショットを生成するには:
wrangler devを実行してワーカーを起動します- ターミナルからdを押してDevToolsを開きます
- 「メモリ」タブをクリックします
- ワーカーにリクエストを送信してメモリの割り当てを開始します
- 必要に応じてデバッガを含めて、適切なタイミングで実行を一時停止できるようにします
スナップショットを取得をクリックします
これでワーカーのメモリを検査できます。
メモリスナップショットの読み方を学ぶために、例を見てみましょう。次のワーカーがあると仮定します:
let responseText = "Hello world!";
export default { async fetch(request, env, ctx) { let now = new Date().toISOString(); responseText = responseText + ` (Requested at: ${now})`; return new Response(responseText.slice(0, 53)); },};このコードは最初はうまく動作しましたが、時間が経つにつれて応答が遅くなり、アウトオブメモリーエラーが発生することに気付きます。DevToolsを使用して、これがメモリリークであるかどうかを確認できます。
まず、上記のように、wrangler devを実行した後にdを押してDevToolsを開きます。
次に、「メモリ」タブに移動します。
次に、リクエストを送信してワーカーに大量のトラフィックを生成します。curlを使用するか、ブラウザを繰り返しリロードすることでこれを行うことができます。他のワーカーでは、メモリリークを再現するためにより具体的なリクエストが必要な場合があります。
その後、「スナップショットを取得」ボタンをクリックして結果を表示します。
まず、ドロップダウンの「統計」に移動して、メモリを占有しているものの一般的な感覚を得ます。

これらの統計を見ると、67 kBの文字列に多くのメモリが割り当てられていることがわかります。これはおそらくメモリリークの原因です。さらにリクエストを行い、別のスナップショットを取得すると、この数値が増加するのが見えるでしょう。

メモリサマリーは、メモリを占有しているデータタイプをリストします。「(string)」をクリックすると、他のものよりもはるかに大きな文字列が表示されます。テキストは、「Requested at」と日付を繰り返し追加していることを示しており、グローバル変数をますます大きな文字列で上書きしてしまっています:
responseText = responseText + ` (Requested at: ${now})`;DevToolsのメモリスナップショットを使用して、メモリリークを引き起こしているオブジェクトとコードの行を特定しました。 これで、小さなコード変更で修正できます。
メモリスナップショットの使用方法について詳しくは、Googleのメモリヒープスナップショットに関するドキュメント ↗を参照してください。
CPU使用量に関する洞察を得るためにDevToolsを使用する方法については、CPUプロファイリングドキュメントを参照してください。