Upgrade to Pro — share decks privately, control downloads, hide ads and more …

PHP でプロファイリングしてみた

97a42cc1630ebdfdaaa8d50078a9fd3d?s=47 坂田晃平
September 28, 2021

PHP でプロファイリングしてみた

2021-09-28 PHPUnit の始め方について語りあう PHP TechCafe での LT スライド

https://rakus.connpass.com/event/223536/presentation/

97a42cc1630ebdfdaaa8d50078a9fd3d?s=128

坂田晃平

September 28, 2021
Tweet

More Decks by 坂田晃平

Other Decks in Programming

Transcript

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

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

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

    https://ja.wikipedia.org/wiki/性能解析 3
  4. PHP でやってみた 1. Xdebug の設定 2. プログラムを実行 3. 結果の確認 4

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

  7. サンプルプログラム 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
  8. やってみた - 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
  9. やってみた - 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
  10. 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
  11. やってみた - 3. 結果の確認 見やすく表示してくれるツールを使う Xdebug のホームページでは KCacheGrind が紹介されていた (グラフィカルに表示してくれる)

    PhpStorm でも可能 (すでに使っているのならこれが手軽) https://kcachegrind.github.io/html/Home.html http://bashalog.c-brains.jp/12/11/08-095736.php 11
  12. やってみた - 3. 結果の確認 1. サーバーから出力ファイルをダウンロード 2. PhpStorm で開く Tools

    > Analyze Xdebug Profiler Snapshot... 12
  13. 13

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

    1 回呼び出され、 実行に 30 秒かかる やばい 14
  15. まとめ PHP プログラムのプロファイリングの道具はすでにそろっている プロファイルを取るとパフォーマンスチューニングができる 環境情報 PHP 8.0.8 Xdebug v3.0.4 Laravel

    8.54 PhpStorm 2020.3.3 15