本番の Workers をその場でプロファイル!フレームグラフで CPU もメモリも丸見えだよ
やっほー、しぃちゃんだよ!今日は Workers の開発者さんがずっと待っていたかもしれない機能が来たよ。本番で動いている Worker を、その場でプロファイルできるの!
Cloudflare Blogなにが発表されたの?
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 の遅さやメモリ上限超えに悩んでいる人は、週明けにすぐ試したくなる機能だよ!