# 本番の Workers をその場でプロファイル！フレームグラフで CPU もメモリも丸見えだよ

やっほー、しぃちゃんだよ！今日は Workers の開発者さんがずっと待っていたかもしれない機能が来たよ。本番で動いている Worker を、その場でプロファイルできるの！

## なにが発表されたの？

Cloudflare の Blog で、Workers と Durable Objects のオンデマンド CPU・メモリプロファイリングが発表されたよ。

実行中の Worker のプロファイルを本番で取って、インタラクティブなフレームグラフで見られるの。プロファイルファイルはダウンロードして、さらに分析もできるよ。見るのは Workers Observability のページからだよ。

## 今までどうだったの？

記事の説明からは、メモリリークや性能のボトルネックを本番で追うのは大変、という課題がある、という位置づけだよ。今回の機能は、それを本番の実行そのものから直接つかめるようにするものなの。

## これで何が変わるの？

フレームグラフの見方はこうだよ。

- 1 つ 1 つの四角が関数呼び出し
- 幅が、その関数に割り当てられた CPU 時間またはメモリの大きさ
- クリックでその関数にフォーカス、ホバーで詳細
- 表形式のビューではサンプル数順に並べられ、目立ちにくいホットスポットも見つけやすい

Cloudflare 自身の使用例も載っていたよ。

- CPU (R2 バインディングを使う Worker): `genericR2JsonReplacer` が CPU の 5% 超を使っていた。再帰的な走査が `JSON.stringify` と重複していて、ネストした値がレベルごとに処理されていたの。重複を除いたら、この関数は 2.7 倍速くなった。ほかに約 1% の CPU を使っていた `metrics` の繰り返し呼び出しも、結果を 1 回だけ保存して減らした
- メモリ: ある Worker の P999 が約 133 MB で、上限 128 MB を超えて「Exceeded Memory」で退避されていた。ヒーププロファイルで、無効のはずだった Prometheus の計装が割り当ての約 66.7% を占めていると判明。取り除いて P999 は 118 MB、P50 は 70 MB から 54 MB に下がった

## 深く潜ってみよう

使い方は 3 通りあるよ。

- CLI: `cf` パッケージを入れて、最新バージョンの 5 秒間の CPU プロファイルを取る例がこれだよ

```
cf workers versions profile latest --worker-id "$WORKER_ID_OR_NAME" --duration-ms 5000 --profile-type cpu > worker-cpu.pprof
```

- API: アカウントの Workers versions エンドポイントで `latest` バージョンの `/profile` パスにリクエストし、JSON ボディに `duration_ms` と `profile_type` を指定する
- ダッシュボード: Build → Compute → Workers & Pages で Worker を選び、Observability タブのドロップダウンから「Flamegraph」を選ぶ。CPU かメモリ、時間、バージョンを選んで Capture Profile を押す

TypeScript の Worker は、source map を有効にしないと関数名が難読化されて見えることがあるよ。プロファイルを何回か取って、幅の広い関数を比べるのがおすすめだって。

仕組みの面では、次のような点があるよ。

- リクエストは、対象バージョン、そのバージョンが最近動いたデータセンター、isolate がまだ読み込まれているか、アカウント専用の isolate か、を解決する
- Durable Objects は、オブジェクト名で、生きているオブジェクトを持つ物理サーバーへルーティングされる
- 新しい isolate は起動せず、本番の実際の実行を観測する。なのでトラフィックが少ない Worker はプロファイルしにくいことがある
- CPU プロファイルでは、isolate のロックを持つのはセットアップと後片付けのときだけ。リクエストが動き続ける間 1 ms 間隔でサンプリングして、結果のシリアライズはロックの外で行う

制限事項もあるよ。

- 手動で開始する必要があるので、キャプチャ時間外に起きる断続的な問題は見逃すことがある
- メモリプロファイラは、キャプチャ期間中の割り当てだけが見える。起動時の割り当ては見えない
- 選んだバージョンに十分なトラフィックが必要
- 自動でサンプルを取る継続的プロファイリングは開発中とのこと

料金については、記事では触れられていないよ。

## まとめ

- Workers と Durable Objects で、本番の CPU・メモリのオンデマンドプロファイルが取れる
- フレームグラフで見られて、プロファイルのダウンロードもできる
- ダッシュボード、CLI、API の 3 通りで使える
- 手動開始、起動時の割り当ては見えない、トラフィックが必要、といった制限がある
- 継続的プロファイリングは開発中

Workers の遅さやメモリ上限超えに悩んでいる人は、週明けにすぐ試したくなる機能だよ！
