ChromiumのV8プロファイリング
V8のCPU & ヒーププロファイラーは、V8のシェルでは簡単に使用できますが、Chromiumで使用する方法は少し混乱するかもしれません。このページでは、その方法を説明します。
なぜV8シェルと異なり、ChromiumでV8のプロファイラーを使用するのが異なるのか?
Chromiumは複雑なアプリケーションであり、V8シェルとは異なります。以下はプロファイラーの使用に影響を与えるChromiumの特徴のリストです:
- 各レンダラーが個別のプロセスとして動作する(厳密には各プロセスではありませんが、この詳細は省略します)、そのため同じログファイルを共有することはできません。
- レンダラープロセスに組み込まれるサンドボックスにより、プロセスがディスクに書き込むことが制限されます。
- 開発者ツールは独自の目的でプロファイラーを設定します。
- V8のログコードには、ログ状態チェックを簡略化するための最適化が含まれています。
CPUプロファイルを取得するためのChromiumの実行方法
プロセスの開始時からCPUプロファイルを取得するためには、以下のようにChromiumを実行します:
./Chromium --no-sandbox --user-data-dir=`mktemp -d` --incognito --js-flags='--prof'
開発者ツールでプロファイルは表示されませんのでご注意ください。すべてのデータはファイルにログされ、開発者ツールにはログされません。
フラグ説明
--no-sandbox
はレンダラーサンドボックスを無効にし、Chromeがログファイルに書き込めるようにします。
--user-data-dir
は新しいプロファイルを作成するために使用され、キャッシュの回避やインストール済みの拡張機能からの影響を防ぐために使用します(任意)。
--incognito
はさらに結果の汚染を防ぐために使用します(任意)。
--js-flags
にはV8に渡されるフラグが含まれています。
--logfile=%t.log
はログファイルの名前パターンを指定します。%t
は現在の時間(ミリ秒単位)に展開されるため、各プロセスが独自のログファイルを取得します。プレフィックスやサフィックスを使用する場合は以下のように記述できます:prefix-%t-suffix.log
。デフォルトでは、各アイソレートが別々のログファイルを取得します。--prof
はV8に統計的プロファイリング情報をログファイルに書き込むよう指示します。
Android
Android上のChromeはプロファイリングを少し複雑にするいくつかの特有のポイントがあります。
- コマンドラインはChromeをデバイス上で開始する前に
adb
を介して記述する必要があります。その結果、コマンドラインの引用符が失われることがあり、空白や引用符を使用するよりも、--js-flags
内の引数をカンマで区切るのが最適です。 - ログファイルのパスはAndroidのファイルシステム上で書き込み可能な絶対パスとして指定する必要があります。
- Androidで使用されるレンダラープロセスのサンドボックスにより、
--no-sandbox
を使用しても、レンダラープロセスがファイルシステム上のファイルに書き込むことはできません。そのため、ブラウザプロセスと同じプロセスでレンダラーを実行するために--single-process
を渡す必要があります。 .so
はChromeのAPKに埋め込まれているため、シンボライゼーションにはAPKメモリアドレスをビルド内のストリップされていない.so
ファイルに変換する必要があります。
以下のコマンドはAndroid上でのプロファイリングを有効にします:
./build/android/adb_chrome_public_command_line --no-sandbox --single-process --js-flags='--logfile=/storage/emulated/0/Download/%t.log,--prof'
<Androidデバイス上でChromeを閉じて再起動>
adb pull /storage/emulated/0/Download/<logfile>
./src/v8/tools/linux-tick-processor --apk-embedded-library=out/Release/lib.unstripped/libchrome.so --preprocess <logfile>
注意事項
Windowsでは、chrome.dll
の.MAP
ファイル作成を有効にしてください。ただし、chrome.exe
では有効にしないでください。