Slide 1

Slide 1 text

PHP でプロファイリングしてみた 2021年09月28日 PHP TechCafe 株式会社ラクス 坂田 1

Slide 2

Slide 2 text

自己紹介 名前:坂田晃平 所属:株式会社ラクス 仕事:チャットディーラーの開発 Laravel 使ってます 型宣言はきっちり書きたい派 2

Slide 3

Slide 3 text

プログラムのプロファイリング 性能分析ともいう プログラム実行時の各種情報を収集 関数呼び出しの頻度 関数評価にかかる時間 そのためのツールをプロファイラという PHP では Xdebug をプロファイラとして使える https://ja.wikipedia.org/wiki/性能解析 3

Slide 4

Slide 4 text

PHP でやってみた 1. Xdebug の設定 2. プログラムを実行 3. 結果の確認 4

Slide 5

Slide 5 text

やってみた - 1. Xdebug の設定 php.ini [Zend] zend_extension=/path/to/xdebug.so xdebug.mode=profile xdebug.output_dir=/tmp/xdebug # default: /tmp https://xdebug.org/docs/profiler https://www.keicode.com/cgi/profile-with-xdebug.php 5

Slide 6

Slide 6 text

やってみた - 2. プログラムを実行 ブラウザからリクエストを送って実行 コマンドライン実行 どちらでも可能だが、今回やってみたのは後者 コマンドラインから処理を呼び出せるようにしておくと、 こういうとき便利 6

Slide 7

Slide 7 text

サンプルプログラム class RunSample extends \Illuminate\Console\Command { protected $signature = 'sample:run'; protected $description = "Laravel の Artisan コマンドで Service クラスの処理を実行できるようにしたもの"; public function handle(\App\Services\SampleService $service): int { $this->line('start light process'); $service->lightProcess(); $this->line('start heavy process'); $service->heavyProcess(); return 0; } } 7

Slide 8

Slide 8 text

やってみた - 2. プログラムを実行 [user@host sample]$ php artisan sample:run start light process start heavy process xdebug.output_dir で指定したディレクトリにファイルができる [user@host sample]$ ls /tmp/xdebug/ cachegrind.out.209021 8

Slide 9

Slide 9 text

やってみた - 3. 結果の確認 プロファイラの出力はそのままでは読めない version: 1 creator: xdebug 3.0.4 (PHP 8.0.8) cmd: /home/user/sample/artisan part: 1 positions: line events: Time_(10ns) Memory_(bytes) fl=(1) php:internal fn=(1) php::microtime 9

Slide 10

Slide 10 text

cfl=(75) cfn=(230) calls=1 0 0 37 119242 107888 cfl=(60) cfn=(3784) calls=1 0 0 37 3518754656 14415552 cfl=(60) cfn=(3786) calls=1 0 0 51 1047 0 summary: 3520990750 18356232 333,982 行あった 10

Slide 11

Slide 11 text

やってみた - 3. 結果の確認 見やすく表示してくれるツールを使う Xdebug のホームページでは KCacheGrind が紹介されていた (グラフィカルに表示してくれる) PhpStorm でも可能 (すでに使っているのならこれが手軽) https://kcachegrind.github.io/html/Home.html http://bashalog.c-brains.jp/12/11/08-095736.php 11

Slide 12

Slide 12 text

やってみた - 3. 結果の確認 1. サーバーから出力ファイルをダウンロード 2. PhpStorm で開く Tools > Analyze Xdebug Profiler Snapshot... 12

Slide 13

Slide 13 text

13

Slide 14

Slide 14 text

やってみた - 3. 結果の確認 関数呼び出しの頻度と総所要時間がわかる ⇒ 性能のボトルネック箇所がわかる e.g, SampleService::heavyProcess はコマンド実行で 1 回呼び出され、 実行に 30 秒かかる やばい 14

Slide 15

Slide 15 text

まとめ PHP プログラムのプロファイリングの道具はすでにそろっている プロファイルを取るとパフォーマンスチューニングができる 環境情報 PHP 8.0.8 Xdebug v3.0.4 Laravel 8.54 PhpStorm 2020.3.3 15