Slide 1

Slide 1 text

Xdebug Profileによる CIパフォーマンス改善のためのボトルネック解析 山下 祐 2024年12月22日

Slide 2

Slide 2 text

自己紹介 2 ● 名前: 山下 祐 (Yamashita Tasuku) ● 所属: 株式会社kubell(旧Chatwork株式会社) ○ 2019年12月~ PHPエンジニアとして入社 ○ 現在は認証チームでバックエンドを中心に活動中 ● SNS: ○ GitHub: tasuku43 ○ Twitter: task2021 ○ Zenn: https://zenn.dev/tasteck

Slide 3

Slide 3 text

目次 CONTENTS 01 | 解決したい課題 02 | Xdebug Profileとは? 03 | Xdebug Profileの使い方 04 | GitHub Actionsで実行する 05 | まとめ

Slide 4

Slide 4 text

目次 CONTENTS 01 | 解決したい課題 02 | Xdebug Profileとは? 03 | Xdebug Profileの使い方 04 | GitHub Actionsで実行する 05 | まとめ

Slide 5

Slide 5 text

解決したい課題 ● ある日、CIのテストジョブが通常の4分から10分に急激に遅延しました ● テスト結果の詳細を分析したところ、特定のテストケースが遅いわけではな く、全体の約半分がわずかに遅くなっている ことが判明しました 5

Slide 6

Slide 6 text

解決したい課題 6 個々のテストケースの実行結果(時間)を見るだけでは、どこがボトルネックに なっているのか特定することは難しい SetUp処理で呼ばれている? 多くのテストケースが存在する? まだ何もわからないけ ど、これを見つけたい

Slide 7

Slide 7 text

目次 CONTENTS 01 | 解決したい課題 02 | Xdebug Profileとは? 03 | Xdebug Profileの使い方 04 | GitHub Actionsで実行する 05 | まとめ

Slide 8

Slide 8 text

Xdebug Profileとは? 8 ● Xdebugのプロファイラ機能 ○ PHPスクリプトの実行パフォーマンスを分析するための強力なツール ○ スクリプトや関数の実行時間を集計し、プロファイリングデータとして保 存

Slide 9

Slide 9 text

目次 CONTENTS 01 | 解決したい課題 02 | Xdebug Profileとは? 03 | Xdebug Profileの使い方 04 | GitHub Actionsで実行する 05 | まとめ

Slide 10

Slide 10 text

Xdebug Profileの使い方 10 ● PHPUnitを実行するときにプロファイルモードを有効にするだけです ○ Xdebugがインストール済みである必要あり ● ポイント ○ xdebug.modeでプロファイルモードに指定します ○ xdebug.output_dirで出力先を決めます ステップ実行時は debugモードで動かしています

Slide 11

Slide 11 text

プロファイリングから解析までの流れ 11

Slide 12

Slide 12 text

プロファイリングから解析までの流れ 12 プロファイル結果ファイルの出 力先を作成しておきます

Slide 13

Slide 13 text

プロファイリングから解析までの流れ 13 -dオプションは、PHPの設定ディレクティブ (php.iniで定義される設定項目)を一時的に変 更するためのもの

Slide 14

Slide 14 text

プロファイリングから解析までの流れ 14 xdebugのインストール時に、環境にzlibライブラリが有 効な場合は、Zlib圧縮サポートが有効になるため、gz形 式で出力されます。

Slide 15

Slide 15 text

プロファイリングから解析までの流れ 15 ● PhpStorm > Tools > Analyze Xdebug Profiler Snapshot…を選択 ● 出力されたCachegrind形式のプロファイル結果ファイルを選択 ○ gz形式であってもそのまま開くことが可能です

Slide 16

Slide 16 text

プロファイリングから解析までの流れ 16 プロセス全体での呼び出し回数 メソッドや関数単体での 実行時間 PHPプロセス全体での トータル実行時間 と割合

Slide 17

Slide 17 text

プロファイリングから解析までの流れ 17 ポイント①: テストフレームワーク関連のデータは無視する

Slide 18

Slide 18 text

プロファイリングから解析までの流れ 18 ポイント②: プロセス全体の実行時間に対する割合に着目する

Slide 19

Slide 19 text

プロファイリングから解析までの流れ 19 ポイント③: 怪しい処理をどんどんブレークダウンしていく (先ほどチラッと見えていた所 はあえて無視して) ①Timeが大きい処理を選択 すると... ②コールツリーが 表示されます ③さらにその中で割 合の大きいものを探 します

Slide 20

Slide 20 text

プロファイリングから解析までの流れ 20 「無駄に遅い処理」というメソッドの中で「無意味なスリープ」というメソッドを1500 回も呼び出している事が明らかに 核心に迫るまでひた すらブレークダウン おそらく実際は、HTTP通信やDBアクセスなどの外部通信などが見つかる事も 多いのではないかと思います

Slide 21

Slide 21 text

目次 CONTENTS 01 | 解決したい課題 02 | Xdebug Profileとは? 03 | Xdebug Profileの使い方 04 | GitHub Actionsで実行する 05 | まとめ

Slide 22

Slide 22 text

GitHub Actionsで実行する 22 出力先のディレクトリを作成して、実 行 手動で実行できるようにすることで、誰でも同じ環境で テストのプロファイリングを簡単に実行できるように

Slide 23

Slide 23 text

GitHub Actionsで実行する 23 長期的に保存したい場合は、 Artifactでは なく、他のストレージサービス(例えば AWS S3など)の利用をお勧めします

Slide 24

Slide 24 text

独自のDocker Imageで動かしている場合は... 24 出力データ量を抑える為、ZIP拡張が有 効であることを確認してください。コスト削 減に繋がります。

Slide 25

Slide 25 text

目次 CONTENTS 01 | 解決したい課題 02 | Xdebug Profileとは? 03 | Xdebug Profileの使い方 04 | GitHub Actionsで実行する 05 | まとめ

Slide 26

Slide 26 text

まとめ 26 今回はボトルネックの特定をテーマにお話しましたが、現状課題が なくてもプロファイル結果を確認するだけで発見があり面白いの で、ぜひ試してみてください!

Slide 27

Slide 27 text

働くをもっと楽しく、創造的に 27