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

PHPWebアプリケーションパフォーマンスチューニングの勘所〜なぜアプリケーションは...

shiro seike
October 02, 2021

PHPWebアプリケーションパフォーマンスチューニングの勘所〜なぜアプリケーションは速くなるのか〜 / Why PHP Applications are Faster

shiro seike

October 02, 2021
Tweet

More Decks by shiro seike

Other Decks in Technology

Transcript

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


    - Work at
 - 株式会社 Fusic (フュージック) 
 技術開発本部/技術開発第一部門 
 - チームリーダー/エバンジェリスト 
 プリンシパルエンジニア
 - Skill
 - PHP/Go/AWS
 - Community
 - Fukuoka.php Organizer 
 - PHPカンファレンス2018 - 2021 
 3

  2. ボトルネックの原因
 10
 アプリケーションが速くなる方法を知る
 →何故遅いのかを知る、ボトルネックについて知る
 - ネットワークI/O 
 - ディスクI/O
 -

    メモリ使用率超過(Swapの利用)
 - CPU使用率超過(load average過多)
 - ソフトウェアリミット
 ボトルネックがどこにあると不味いのか

  3. メモリ使用量、CPU使用率
 17
 95%使っている事は悪なのかというとそういう訳ではない
 100%に近付ければ近付けるほど効率的に利用できている
 • メモリ
 ◦ 使用率 ≒ 100%


    ▪ 100%を超えた瞬間Swapが発生するので注意
 • CPU
 ◦ 最大負荷時、コア数 ≒ load averageが理想
 いかに効率的に利用するか

  4. ISUCON5 予選
 22
 ISUCON(iikanjini speed up contest)とはお題となるWebサービスを、 
 決められたレギュレーションの中で限界まで高速化を図るチューニングバトル。 


    
 今回はその第5回予選の問題を利用して、チューニングの様子をお話致します。 
 問題にはパフォーマンスが上がらないようなボトルネックが多数用意されており、 
 チューニングトレーニングに最適です。 

  5. Xdebug x Webgrind
 32
 Xdebugにてプロファイルを取得して 
 プロファイル解析が可能なWebgrindを利用し、Graphvizを介して可視化します。 
 具体的な利用方法はFusic Tech

    Blogをご参照ください。
 「PHP8のプロファイリングにXdebug3とWebgrindを使う」
 
 右図の用に図が生成出来ます。 
 - どの関数から呼び出されているか 
 - 処理を専有している関数
 - 繰り返し実行されている回数
 N+1問題等を発見して解消していきます 

  6. Flame Graphを取る
 35
 改善を続けると1プロセス毎の処理を追うだけでは サーバー全体に負荷をかけている処理が分かりづらくなる GoのpprofにてFlame Graphを取れるのは知っていたが、 PHPで取る方法は知らなかった そんな話を@hanhan1978さんの Yokohama

    North AMでしてた所 PHPにてFlame Graphを取る方法を教えてもらった perf-tools を使ってPHPソースレベルの Flamegraph を作る そのPodcastを聞いてくれていた @sji_ch さんが phpspyというものがあることを教えてくれた
  7. # cd /usr/local/src # wget https://www.php.net/distributions/php-8.0.6.tar.gz # tar zxf php-8.0.6.tar.gz

    # cd php-8.0.6 # ./configure --enable-fpm --with-mysqli --enable-mbstring --with-pdo-mysql=mysqlnd # make -j2 # make install Installing shared extensions: /usr/local/lib/php/extensions/no-debug-non-zts-20200930/ Installing PHP CLI binary: /usr/local/bin/ Installing PHP CLI man page: /usr/local/php/man/man1/ Installing PHP FPM binary: /usr/local/sbin/ Installing PHP FPM defconfig: /usr/local/etc/ Installing PHP FPM man page: /usr/local/php/man/man8/ Installing PHP FPM status page: /usr/local/php/php/fpm/ ~省略〜 Installing PDO headers: /usr/local/include/php/ext/pdo/ # php -v PHP 8.0.6 (cli) (built: May 29 2021 06:49:02) ( NTS ) Copyright (c) The PHP Group Zend Engine v4.0.6, Copyright (c) Zend Technologies OPCahceが読み込まれてないので読み込ませる PHP8のインストール
 57

  8. # php -i | grep ini Configuration File (php.ini) Path

    => /usr/local/lib # vim /usr/local/lib/php.ini OPcacheの有効化
 58
 # php -v PHP 8.0.6 (cli) (built: May 29 2021 06:49:02) ( NTS ) Copyright (c) The PHP Group Zend Engine v4.0.6, Copyright (c) Zend Technologies with Zend OPcache v8.0.6, Copyright (c), by Zend Technologies
  9. # vim /etc/systemd/system/isuxi.php.service PHP-FPMの入れ替え
 59
 # systemctl restart isuxi.php.service Warning:

    isuxi.php.service changed on disk. Run 'systemctl daemon-reload' to reload units. # systemctl daemon-reload # systemctl restart isuxi.php.service
  10. # cd /usr/local/src # wget https://xdebug.org/files/xdebug-3.0.4.tgz # tar zxf xdebug-3.0.4.tgz

    # cd xdebug-3.0.4 # phpize # ./configure --enable-xdebug # make -j2 # make install ~ 省略 ~ | NOTE: Please disregard the message | You should add "extension=xdebug.so" to php.ini | that is emitted by the PECL installer. This does not work for | Xdebug. | +----------------------------------------------------------------------+ Xdebugのインストール
 64

  11. プロファイリング用ベンチマーク
 65
 スコアが「5497.8」→「3322.2」 
 
 プロファイリング情報を収集しながら動作するのと、 
 100k 〜 1Mサイズのプロファイリングファイルの

    
 書き出しを行うので動作としてはかなり影響が出ます 
 
 運用時はXdebugを切ることを忘れないように 
 気をつける必要があります。 

  12. ▪描画用ツール # apt-get install graphviz ▪webgrind # cd /usr/local/src #

    git clone https://github.com/jokkedk/webgrind.git # php -S 0.0.0.0:8080 index.php PHP 8.0.6 Development Server (http://0.0.0.0:8080) started webgrindの設定
 66

  13. Nginxパラメータチューニング
 69
 Webサーバーはいかにリクエストを受け付けるのかが鍵
 メモリの消費に直結するのでサーバーリソースと相談しながらソフトウェアリミットを解除
 - worker_processes
 - 受け付けるNginxのプロセス数を決める。auto = CPU数がオススメ


    - worker_connections
 - ひとつのワーカーが開けるConnection数
 - worker_rlimit_nofile
 - 開けるファイルディスクリプタの上限値
 - Unix ドメインソケット(ソフトウェアリミット解除ではなく、I/O改善)
 - Unixドメインソケットを利用する事で接続時のオーバーヘッドを減らす

  14. PHP-FPM パラメータチューニング
 70
 PHP-FPMも合わせてサーバーリソースと相談しながらソフトウェアリミットを解除 
 - pm.max_children
 - 同時に処理するプロセスの最大数
 -

    pm.start_servers
 - 起動時に生成されるプロセス数
 - pm.min_spare_servers
 - 待ち状態の子プロセス最小数
 - pm.max_spare_servers
 - 待ち状態の子プロセス最大数
 サーバーのリソースとmemory_limitの上限に相談して、
 プロセスを増やすことで処理性能を上げる事が出来ます。

  15. メモリ・ファイルキャッシュ
 72
 ◎PHP以降の処理が重い
 HTMLやCSSをWebサーバーにキャッシュしてしまうのも手です。 
 PHPでSSRをする場合、結果が変わらない場合はWebサーバー側で 
 PHPのレンダリング結果をメモリ上にキャッシュしてしまい、 
 PHPへのRequestを減らすことで、低負荷で高速に結果を返すことが可能です。

    
 
 但しキャッシュクリアのタイミングを失敗すると想定している結果を返せず、 
 手動でキャッシュをクリアするなど障害が発生してしまう可能性があります。 
 
 同じ用にDBのSELECT結果をRedisなどでキャッシュすることも出来ます。 

  16. まとめ
 Point 3
 PHPには様々なプロファイリング方法があり、ぜひ手を動かして確かめましょう。 
 74
 パフォーマンスチューニングの鍵はボトルネックの解消
 Point 1
 Point

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