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

🙇いきなりのお詫び🙇 3 ● 5分で喋りきるのが相当厳しい戦いになりそうなので、早口で聞き取りづら かったらすいません🙇 ● forteeにスライドをアップしているため、お手元でも見ていただけると嬉しい です!

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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