本文へスキップ
MameTechNews
バックエンド

Cloudflare、WorkersとDurable Objectsの本番プロファイリングを追加

## POINTS

  • 本番の既存アイソレートを測るため、トラフィックがあるバージョンを選ばないとフレームグラフが取れない。
  • TypeScriptプロジェクトはソースマップがないと関数名が読めない。計測前に生成を有効にする。
  • メモリ結果は計測中の割り当てだけである。起動時の確保は別の手段で見る必要がある。

Cloudflareは10月9日、WorkersとDurable ObjectsのオンデマンドなCPU・メモリプロファイリングを公開した。ダッシュボードのObservabilityからフレームグラフを取得するか、CLIのcf workers versions profileでpprof形式のファイルを書き出せる。計測は新しいアイソレートを起こすのではなく、すでに本番でリクエストを処理しているアイソレートを対象にする。流量が少ないバージョンは計測しにくい。TypeScriptではソースマップを有効にしないと、関数名が難読化されたままになる。

CPUプロファイルは、アイソレートのロックを取ってV8のプロファイラを開始し、1ミリ秒間隔で採取したあとロックを解放する。採取中もJavaScriptの実行は続く。Durable Objectsは名前を指定でき、そのオブジェクトを持つマシンへ計測要求がルーティングされる。

同社が公開した内部例では、R2バインディングのWorkerでgenericR2JsonReplacerがCPU時間の5%超を占め、JSONの各ノードで自分自身も木を歩いていた。重複を除くとこの関数は2.7倍速くなった。別のWorkerではP999のメモリが133MBで、上限128MBを超えて退避が起きていた。ヒーププロファイルでは、無効化したつもりだったPrometheusのコードが割り当ての約66.7%を占めていた。経路を完全に外すと、P50は70MBから54MB、P999は133MBから118MBになり、上限の下に約10MBの余裕ができた。

制限もある。セッションは自分で開始するため、障害の瞬間を取り逃す。メモリプロファイラが見せるのは計測窓の中の割り当てだけで、起動時の割り当ては入らない。継続的な採取は今後の予定だ。本番のCPU上限やメモリ上限に近づいているWorkerから試し、最も広い関数と、無効化したつもりで残っている計測コードを先に見るのが実用的である。