Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥

PHP Web Application Performance Tuning

PHP Web Application Performance Tuning

shiro seike

March 27, 2021
Tweet

More Decks by shiro seike

Other Decks in Programming

Transcript

  1. 自己紹介
 清家 史郎
 @seike460
 - ID
 - GitHub:seike460 
 -

    Twitter:@seike460 
 - Work at
 - 株式会社 Fusic (フュージック) 
 技術開発本部/技術開発第一部門 
 - チームリーダー/エバンジェリスト/プリンシパルエンジニア 
 - Skill
 - PHP/Go/AWS 
 - Personal
 - PHPカンファレンス福岡2020 幻の実行委員長 
 - Fukuoka.php Organizer 
 - 46fm パーソナリティ 
 3

  2. ボトルネック
 11
 パフォーマンスを下げる原因となる処理能力が低いポイント 
 様々なボトルネックがあります
 - Webサーバパラメータ
 - PHPコードの問題
 -

    DB設計ミス
 経験を積んでいくと「この現象はこれっしょ」という推測が立つようになる 
 この長年の勘に頼ることは再現性がなく不確実 

  3. Xdebug x Webgrind
 23
 Xdebugにてプロファイルを取得して 
 プロファイル解析が可能なWebgrindを利用し、Graphvizを介して可視化します。 
 具体的な利用方法はこちらの記事をご確認ください。
 


    すると右図の用に図が生成出来ます。 
 - どの関数から呼び出されているか 
 - 処理を専有している関数
 - 繰り返し実行されている回数
 
 N+1問題等を発見して解消していきます 

  4. 実行計画①
 28
 ◎あるSELECT SQLの実行が遅い場合
 EXPLAIN(ANALYZE)をSELECTの前に付けて、実行計画を取ります。
 - Seq Scan … 全レコード探索
 - Index

    Scan … Indexとテーブルに交互にアクセスして探索
 - Bitmap Scan … メモリ上に展開されたBitmapを使ってAndOrの探索
 - Index Only Scan … Indexのみからデータを探索(条件有)
 意図したIndexが利用できているかを確認します。

  5. 実行計画②
 29
 テーブル結合にも注目します。
 Nested Loop … 外部テーブルをスキャンして、内部テーブルに結合 
 Indexの概念があるので、意図したIndexが効いてるかを考慮 
 Merge Join … 外部テーブル、内部テーブルのキーをソートして結合

    
 Indexがないテーブルではコストが大きい 
 Hash Join … メモリ上にハッシュテーブルを作成してハッシュを比べて結合 
 メモリ上にハッシュテーブルが収まれば高速に結合 

  6. パラメータチューニング
 31
 ◎DBサーバのリソースが有向活用出来ていない場合 
 CPUの使用率は高いが、メモリの使用率が低い場合などは、 
 RDBにメモリを十分に与える事で解決する可能性があります。 
 
 メモリを利用するソートやジョインが高速化され、

    
 不必要なディスクI/Oを発生させずに結果を返すことが出来ます。 
 ディスクにデータを書き込むタイミングを調節することで、 
 ディスクI/Oを減らす事が出来ます。 
 
 RDBパラメータチューニングの内容はここでは話しきれないので、 
 Appendixを是非ご覧ください

  7. PHP
 38
 ◎Webサーバーからのリクエストを受けきれない 
 フォークするプロセス数を増やす事で受け取るリクエスト数を増加させます。 
 - pm.max_children:同時に処理するプロセスの最大数 
 -

    pm.start_servers:起動時に生成されるプロセス数 
 - pm.min_spare_servers:待ち状態の子プロセス最小数 
 - pm.max_spare_servers:待ち状態の子プロセス最大数 
 サーバーのリソースとmemory_limitの上限に相談して、 
 プロセスを増やすことで処理性能を上げる事が出来ます。 
 Apache + mod_phpの場合はMaxClientの設定に相当します。 
 パラメータチューニングの詳細は Appendixをご覧ください。

  8. まとめ
 Point 3
 ボトルネックを解消する方法は様々な方法があります。知識を蓄え適切に対処しましょう。 
 44
 推測するな、計測せよ。再現性のある対策を行いましょう。
 Point 1
 Point

    4
 話せないことがたくさんあった、Appendix見ていってください 
 
 リソースを正しく把握して、ボトルネックを特定しましょう。ディスクアクセスは遅い。
 Point 2

  9. Nginxパラメータチューニング
 47
 Webサーバーはいかにリクエストを受け付けるのかが鍵 
 ※メモリの消費に直結するのでサーバーリソースと相談しながら 
 - worker_processes
 - 受け付けるNginxのプロセス数を決める。auto

    = CPU数がオススメ 
 - worker_connections 
 - ひとつのワーカーが開けるConnection数 
 - worker_rlimit_nofile 
 - 開けるファイルディスクリプタの上限値 

  10. PHPパラメータチューニング
 48
 Nginxからプロキシされたリクエストを受け切る必要がある 
 僕はパフォーマンスを追い求める時(ISUCON時など) 
 サーバがリソース許せばプロセスフォークする負荷を発生させない為に、 
 待機プロセスを最大化しておく(1プロセスがmemory_limit分メモリを使うのに注意) 


    max_children * memory_limit ≒ サーバーメモリ + OS稼働分 + 余白 
 FastCGI Process Manager (FPM):設定 
 pm.max_children、pm.start_servers:起動、最大のプロセスを制御 
 pm.min_spare_server、pm.max_spare_server:フォーク後に待ち受けるプロセスを制御 
 ※mod_phpの場合はMaxClientsなどが対応します。 

  11. RDBパラメータチューニング
 49
 詳しい内容は下記から得た知識になります。 
 ◎僕が心の拠り所にしているQiita MySQLパフォーマンスチューニング -my.cnfの見直し- 
 ◎@mamy1326 さん作成の元ネタ


    初めてのMySQLサーバーチューニング -データベースは怖くない!- 
 こちらを見て是非理解を深めてください。 
 
 次のページからはPostgreSQLの設定をいくつかご紹介します 

  12. フロントエンド
 56
 本筋とはズレますが、フロントエンドのチューニングもあります。 
 - Rendering
 - CSS(CSSOMツリー)
 - HTML(DOMツリー)


    - Scripting
 - JavaScript
 - Painting
 - 2Dグラフィックエンジン、ピクセル描画など 
 私が解説出来るほど収めておらず次の本をオススメします。 
 Webフロントエンド ハイパフォーマンス チューニング 
 (著:久保田 光則)にて詳しく解説されています。 
 ここでも開発者ツールのパフォーマンスタブを利用した 
 「推測するな、計測せよ」という思想について触れられています。