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

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

坂田晃平
September 28, 2021

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

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

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

坂田晃平

September 28, 2021
Tweet

More Decks by 坂田晃平

Other Decks in Programming

Transcript

  1. PHP でプロファイリングしてみた
    2021年09月28日 PHP TechCafe

    株式会社ラクス 坂田
    1

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

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

    こういうとき便利
    6

    View Slide

  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

    View Slide

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

    View Slide

  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

    View Slide

  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

    View Slide

  11. やってみた - 3. 結果の確認
    見やすく表示してくれるツールを使う
    Xdebug のホームページでは KCacheGrind が紹介されていた

    (グラフィカルに表示してくれる)
    PhpStorm でも可能

    (すでに使っているのならこれが手軽)
    https://kcachegrind.github.io/html/Home.html

    http://bashalog.c-brains.jp/12/11/08-095736.php
    11

    View Slide

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

    View Slide

  13. 13

    View Slide

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

    実行に 30 秒かかる

    やばい
    14

    View Slide

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

    View Slide