shiichan

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

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

Cloudflare Blog blog.cloudflare.com

なにが発表されたの?

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 の遅さやメモリ上限超えに悩んでいる人は、週明けにすぐ試したくなる機能だよ!