会社でテックブログをやっているのですが、急に重くなり、全くアクセスができない状態になってるので、原因を調査してみました。
環境はCentOS6.7 + WordPress Nginx + php-fpmです。
■ボトルネックを探す
1 | $ htop |
php-fpmの待ちプロセスがぱない。何個あるのよってかんじ。(画像は例です)
■ボトルネック = php-fpm、アタック
きっとphp-fpmのチューニングがうまくいってない模様。なのでログと設定ファイル確認しましょう。
1 2 3 | # more /var/log/php-fpm/error.log WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 8 children, there are 4 idle, and 27 total children |
> poolしてるコネクションを使い切ってるぜ。pm系の値増やしてくれ。頼んだぜ。
1 2 | # more /var/log/nginx/error.log [error] 31747#0: *15900 recv() failed (104: Connection reset by peer) while reading response header from upstream |
どうやらBginxとphp-fpmはDBの接続をpoolしてアクセスがあると空きができるまで待たせられます。
■www.confの変更
1 | # vim /etc/php-fpm.d/www.conf |
- static
プロセスの起動に伴うオーバーヘッドがないという利点があります。最大同時接続可能数を上げようとすればするほど常に多くメモリを必要とするようになるという短所もあります。メモリに対してCPUの処理能力が低いサーバであれば向いています。
- dynamic
同時接続数が増えてプロセス数が足りなくなった時だけ設定した範囲でプロセスが追加で起動されます。つまり通常時のメモリ消費を抑えつつ、ピーク性能を向上させることができるという点で優れています。
一般的にプロセスの動的な起動に伴うオーバーヘッドがない static
を選択するほうが良いみたいなので変更してみました。
- 環境
・CPU 2core
・Memory 2GB
1 | pm = static |
・作成される子プロセスの最大数(max cliant)
1 | pm.max_children = 50 |
・起動時に作成される子プロセス数。
1 | pm.start_servers = 50 |
・アイドル状態のサーバプロセス数の最小値。
1 | pm.min_spare_servers = 50 |
・アイドル状態のサーバプロセス数の最大値。(pm.start_servers + pm.min_spare_servers)
1 2 | pm.max_spare_servers = 50 pm.process_idle_timeout = 10s; |
・各子プロセスが再起動するまでに実行するリクエスト数。 (メモリリーク対策)
1 | pm.max_requests = 100 |
・phpのメモリ利用制限
1 | php_admin_value[memory_limit] = 256M |
・タイムアウトの設定
1 | request_terminate_timeout = 180 |
■再起動
1 | # /etc/init.d/php-fpm restart |
■まとめ
とりあえずこれでCPU負荷、メモリ消費、ロアベが抑えられサイトもアクセスできるようになった。あんまりチューニングしすぎると今度は502が出てしまうので、適宜調整していきましょう。
参考:http://blog.offline-net.com/2015/05/09/centos-65-nginx-php-fp%EF%BD%8D-memory-tunables/
0件のコメント