ConoHa で運用している PHP が重いので php-fpm をチューニングしてみた


ConoHa の 1GB VPS でこのブログを運用しています。

最近、このブログの編集などで、少しレスポンスが悪いかな?と思うことがあったので調べてみました。

Mackrel で確認

このサーバーは Mackerel で監視を行っています。
メモリのグラフを見るとこの通り、メモリを使い切ってスワップが発生していました。

2/12 に下がっているのは、サーバーの再起動を行ったためです。

ConoHa の VPS は SSD なのでスワップを使用してもパフォーマンスがそれほど下がりませんが、対応が必要そうですね…

ログインして確認

top - 02:41:50 up 10 days, 10:52,  1 user,  load average: 0.23, 0.28, 0.16
Tasks: 146 total,   2 running, 144 sleeping,   0 stopped,   0 zombie
%Cpu(s): 13.5 us,  8.2 sy,  0.0 ni, 29.9 id, 48.1 wa,  0.0 hi,  0.0 si,  0.3 st
KiB Mem :  1016104 total,    71884 free,   850264 used,    93956 buff/cache
KiB Swap:  2097148 total,   864728 free,  1232420 used.    33756 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
10151 nginx     20   0  515652  39488    156 S   0.0  3.9   4:02.43 php-fpm: pool www
11860 nginx     20   0  513224  38540   4884 S  22.6  3.8   3:58.29 php-fpm: pool www
11865 nginx     20   0  517312  36992    156 S   0.0  3.6   3:59.47 php-fpm: pool www
 8333 nginx     20   0  503768  36232   2664 S   0.0  3.6   0:41.22 php-fpm: pool www
 8336 nginx     20   0  505852  35632    120 S   0.0  3.5   0:43.09 php-fpm: pool www
11866 nginx     20   0  515904  34208    144 S   0.0  3.4   3:58.51 php-fpm: pool www
11871 nginx     20   0  515932  34172    148 S   0.0  3.4   4:03.82 php-fpm: pool www
11861 nginx     20   0  514520  34016    152 S   0.0  3.3   3:55.40 php-fpm: pool www
10184 nginx     20   0  514968  33976    144 S   0.0  3.3   3:59.71 php-fpm: pool www
11859 nginx     20   0  515620  33012   2800 R  13.3  3.2   4:01.27 php-fpm: pool www
 8334 nginx     20   0  502264  32828    156 S   0.0  3.2   0:42.17 php-fpm: pool www
11870 nginx     20   0  514280  32000    128 S   0.0  3.1   3:57.46 php-fpm: pool www
 1275 mysql     20   0 1592552  31976   1884 S   3.0  3.1  28:42.91 /usr/sbin/mysqld --daemonize
 8341 nginx     20   0  502420  31568     76 S   0.0  3.1   0:42.92 php-fpm: pool www
21073 nginx     20   0  505612  29876    140 S   0.0  2.9   2:24.17 php-fpm: pool www
10183 nginx     20   0  510160  19540    132 S   0.0  1.9   4:03.62 php-fpm: pool www
11874 nginx     20   0  506184  15704    136 S   0.0  1.5   3:55.12 php-fpm: pool www

php-fpm のプロセスが大量にあり、メモリを消費しているようです。

# free -h
              total        used        free      shared  buff/cache   available
Mem:           992M        857M         65M         72K         68M         18M
Swap:          2.0G        1.3G        729M

この通り、スワップ分を含めて2GB使っているようです。

php-fpm のチューニング

php-fpm のチューニングについて調べてみました。

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

ということで、/etc/php-fpm.d/www.conf を編集してみました。

; The number of requests each child process should execute before respawning.
; This can be useful to work around memory leaks in 3rd party libraries. For
; endless request processing specify '0'. Equivalent to PHP_FCGI_MAX_REQUESTS.
; Default Value: 0
;pm.max_requests = 500
pm.max_requests = 50

デフォルトでは0とのことでしたが、conf ファイルに 500 とありましたので、一旦500に編集してみます。
一旦 500 にしてみましたが、再びメモリ使用量が上昇したため、50 に変更したところ、現在のところ落ち着いています。

php-fpm を再起動して反映

# systemctl restart php-fpm.service
# free -h
              total        used        free      shared  buff/cache   available
Mem:           992M        125M        736M        1.2M        130M        721M
Swap:          2.0G        352M        1.7G

使用メモリが大幅に減りました。
今後は 500 リクエストごとに自動で再起動がかかるはずなので、様子見ですね。

まとめ

WordPress ような PHP をメインにしたサイトを運営する際は、php-fpm のメモリには注意すべきということが分かりました。

ConoHa のスマホアプリ「ConoHa Mobile」にはモニタリングがありますが、項目はCPU、ディスク、ネットワークとなっています。
メモリの監視もあると良いなと思いました。

Mackerel で監視しているので、メモリが 90% を超えた際にアラートメールを飛ばすようにしました。


Comments

comments

コメントを残す

メールアドレスが公開されることはありません。

*

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)