Top View


Author shiro seike / せいけ しろう / 清家 史郎

PHP8のプロファイリングにXdebug3とWebgrindを使う

2020/12/14

Xdebug

Xdebugはご存知の方も多いと思いますが、デバッグと開発を支援するPHPの拡張機能です。

今回はサクッと試したいので phpenvにて試してみます。
phpenvだとデフォルトでxdebugがいい感じに動いてくれます。

phpenvはこちらの記事でも触れてますのであわせて御覧ください。

プロファイリング実行

Profilingのページに書いてますが
以下の設定でプロファイリング出来ます。

xdebug.mode=profile
xdebug.output_dir=/tmp/xdebug

xdebug.mode でKCacheGrindなどのツールを使用して
パフォーマンスのボトルネックを分析できるプロファイリングを有効にします。

xdebug.output_dir でトレース、プロファイリング、ガベージコレクションの統計を
書き込むディレクトリを指定します。
このディレクトリは、PHPを実行しているシステムユーザーが書き込み可能である必要があります。

xdebug.mode=profile の時は xdebug.start_with_request がdefaultでONになり
常にプロファイリングが走ることになり、動作が遅くなります。
Request毎にどうするかを切り替えたい場合は xdebug.start_with_request=trigger にして
$_ENV$_GET$_POST$ _COOKIE のいずれかにXDEBUG_TRIGGERの存在を確認して動作するようです。

この状態でPHPを実行すると cachegrind.out.%p という名前のファイルが出力ディレクトリに吐かれます。
このファイルを分析していくのですが、人が見てもとても理解しづらいので解析ツールを使います。

Webgrind

Webgrindは、PHPのXdebugプロファイリングのWebフロントエンドです。
GitHubからCloneしてきて、index.phpを php -S 0.0.0.0:8080 index.php しちゃうか、 Dockerを使えば良いです。

docker run --rm -v /path/to/xdebug/files:/tmp -p 80:80 jokkedk/webgrind:latest

index.phpをserveする時は、同じディレクトリないにある config.php内に以下のような設定がありますので
2系の設定である xdebug.profiler_output_dirxdebug.output_dir に合わせてしまえば大丈夫です。

    /**
     * Directory to search for trace files
     */
    static function xdebugOutputDir() {
        $dir = ini_get('xdebug.profiler_output_dir');
        if ($dir=='') // Ini value not defined
            return realpath(Webgrind_Config::$profilerDir).'/';
        return realpath($dir).'/';
    }

すると、ServeしているPHPにて対象のプロファイリングの状況が確認出来るようになります。
画像の場合、quicksortにコストが掛かっているのがわかります。

webgrind

図式化

graphvizを入れておけば、よりわかりやすくビジュアライズすることも出来ます。
対象ファイルを選び、graphvizした状態でShow Call Graphを押下するだけです。
次はとても簡単な例ですが、フレームワークなどを利用した際に利用するとわかりやすいかと思います。

graphviz

注意

PHP8のJITを有効化すると、segmentation faultが発生します。 プロファイリング時は素直にOFFにしましょう!

まとめ

今回はPHP8をプロファイリングするツールとして、改めてXdebugと
その描画ツールとしてWebgrindを使ったビジュアライズをご紹介しました。
速度が注目されるPHP8、積極的に速度計測を行ってボトルネックを排除して、
JITで を感じていきたいですね!

明日は タケシ@ インフラエンジニア さんの
【PHP】未経験からエンジニアに転職成功したポートフォリオまとめ【プログラミング初心者向け】です。 お楽しみに!

shiro seike / せいけ しろう / 清家 史郎

shiro seike / せいけ しろう / 清家 史郎

Twitter X

Company:Fusic CO., LTD. Slides:slide.seike460.com blog:blog.seike460.com Program Language:PHP , Go Interest:Full Serverless Architecture

Related Posts


PHP8のJITを有効にして、PHP7と速度比較する
shiro seike / せいけ しろう / 清家 史郎

shiro seike / せいけ しろう / 清家 史郎

2020/11/28


ISUCON10予選にPHPで挑戦しました
shiro seike / せいけ しろう / 清家 史郎

shiro seike / せいけ しろう / 清家 史郎

2020/09/20


sebastianbergmann/phpcpdでコピペコードを撲滅する
shiro seike / せいけ しろう / 清家 史郎

shiro seike / せいけ しろう / 清家 史郎

2019/12/23


AWS Lambda With RDS Proxy Performance
shiro seike / せいけ しろう / 清家 史郎

shiro seike / せいけ しろう / 清家 史郎

2019/12/11