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
以上