CentOS 6.5:nginx,php-fpm環境が「重い」と感じる場合の対応

Webサーバーの高速化を狙い「Apache」から「Nginx」に切り替えてみたもの、予想していた「パフォーマンス」がでない…と感じている場合、「php-fpm」のプロセスがサーバーのメモリを食い潰している可能性があります。特に「VPS」など、使用可能メモリが少なく上限がある環境では、「php-fpm」のチューニングを行うことで、メモリまわりの改善が期待できます。(2015/05/09作成)

WikimediaImages / Pixabay

0.環境

$ nginx -v
nginx version: nginx/1.8.0

$ php-fpm -v | head -n 1
PHP 5.4.33 (fpm-fcgi) (built: Sep 20 2014 16:21:53)

1.確認

プロセス毎のメモリ使用量(単位:kb)

$ ps alx | awk '{printf ("%d\t%s\n", $8,$13)}' | sort -nr | head -10
95584	php-fpm:
94768	php-fpm:
92532	php-fpm:
92048	php-fpm:
88028	php-fpm:
87036	php-fpm:
85952	php-fpm:
85008	php-fpm:
78148	php-fpm:
77956	php-fpm:

2.チューニング

$ sudo vi /etc/php-fpm.d/www.conf

プロセスマネージャが子プロセスの数を制御する方法を選択します。 使用可能な値: static, ondemand, dynamic このオプションは必須です。

< pm = static
---
> pm = dynamic

pm が static の場合は作成される子プロセスの数、 pm が dynamic の場合は作成される子プロセスの最大数。 このオプションは必須です。

< pm.max_children = 50
---
> pm.max_children = 15 

アイドル状態のサーバープロセス数の最大値。 pm が dynamic の場合にのみ使います。 また、この場合には必須となります。

< pm.max_spare_servers = 35
---
> pm.max_spare_servers = 15

各子プロセスが、再起動するまでに実行するリクエスト数。 サードパーティのライブラリにおけるメモリリークの回避策として便利です。 再起動せずにずっとリクエストを処理させる場合は ‘0’ を指定します。 PHP_FCGI_MAX_REQUESTS と同じです。デフォルト値: 0

< ;pm.max_requests = 500
---
> pm.max_requests = 512

3.設定反映

$ sudo /etc/init.d/php-fpm reload
$ sudo /etc/init.d/nginx restart

以上

About yoshimasa

埼玉県さいたま市在住、2男3女のパパです。Linux系の技術情報を中心にまとめています。1978年2月生まれ。