KUSANAGI 1GBプランのメモリ不足をphp-fpm設定変更で解決する方法
はじめに
ConoHa VPS(1GBプラン)でKUSANAGI + WordPressを運用していると、メモリ不足に悩まされることがあります。今回はnginxの脆弱性対応をきっかけにサーバー状態を確認したところ、メモリがひっ迫していることが判明。php-fpmの設定を見直すことで大幅な改善に成功しました。同じ環境で運用している方の参考になれば幸いです。
環境
| 項目 | 内容 |
|---|---|
| VPS | ConoHa VPS 1GBプラン |
| OS | AlmaLinux 9 |
| KUSANAGI | 9.8.9-1.el9 |
| Webサーバー | nginx129(nginx 1.29.8) |
| PHP | PHP 8.3(php-fpm) |
| DB | MariaDB 10.6 |
Step 1:nginxの脆弱性対応状況を確認する
nginxにv1.29.8以降へのアップデートを推奨する脆弱性情報が公開されました。KUSANAGIではnginxを独自パッケージで管理しているため、以下のコマンドでバージョンを確認します。
nginx -v は使えないので、rpmコマンドで確認します。
rpm -q kusanagi-nginx129
実行結果:
kusanagi-nginx129-1.29.8-1.el9.x86_64
nginx 1.29.8 がインストール済みであることが確認でき、脆弱性対応は完了していました。
Step 2:メモリ状況を確認する
ついでにサーバーのメモリ状況を確認してみました。
free -h
実行結果:
| total | used | free | available | |
|---|---|---|---|---|
| Mem | 762MB | 689MB | 68MB | 73MB |
| Swap | 2.0GB | 704MB | 1.3GB | - |
利用可能なメモリがわずか73MB、さらにSwapを704MBも消費しており、かなり危険な状態でした。
Step 3:メモリを食っているプロセスを特定する
何がメモリを消費しているか調べます。
ps aux --sort=-%mem | head -20
結果を見ると、php-fpmのプロセスが14本以上起動しており、1プロセスあたり約100〜148MBのメモリを消費していました。
| プロセス | 本数 | 1本あたり | 合計(概算) |
|---|---|---|---|
| php-fpm: pool www | 14本以上 | 約100〜148MB | 約1,400MB以上 |
1GBのRAMに対して、php-fpmだけで1GB以上を要求している状態です。これではSwapが溢れるのも当然です。
Step 4:php-fpmの設定を確認する
まず設定ファイルの場所を確認します。
find /etc/opt/kusanagi -name "www.conf"
見つかったパス:/etc/opt/kusanagi/php-fpm.d/www.conf
現在の設定を確認します。
cat /etc/opt/kusanagi/php-fpm.d/www.conf | grep -E "^pm"
実行結果:
| 設定項目 | 変更前の値 | 意味 |
|---|---|---|
| pm | dynamic | プロセス数を動的に管理 |
| pm.max_children | 50 | 最大プロセス数 |
| pm.start_servers | 10 | 起動時のプロセス数 |
| pm.min_spare_servers | 5 | 最小待機プロセス数 |
| pm.max_spare_servers | 15 | 最大待機プロセス数 |
| pm.max_requests | 500 | プロセスが処理するリクエスト数上限 |
pm.max_childrenが50、start_serversが10という設定は、1GBプランには完全にオーバースペックです。
Step 5:php-fpmの設定を変更する
sedコマンドで一括変更します。
sed -i 's/pm.max_children = 50/pm.max_children = 5/' /etc/opt/kusanagi/php-fpm.d/www.conf sed -i 's/pm.start_servers = 10/pm.start_servers = 2/' /etc/opt/kusanagi/php-fpm.d/www.conf sed -i 's/pm.min_spare_servers = 5/pm.min_spare_servers = 1/' /etc/opt/kusanagi/php-fpm.d/www.conf sed -i 's/pm.max_spare_servers = 15/pm.max_spare_servers = 3/' /etc/opt/kusanagi/php-fpm.d/www.conf
変更後の設定を確認します。
cat /etc/opt/kusanagi/php-fpm.d/www.conf | grep -E "^pm"
| 設定項目 | 変更前 | 変更後 |
|---|---|---|
| pm.max_children | 50 | 5 |
| pm.start_servers | 10 | 2 |
| pm.min_spare_servers | 5 | 1 |
| pm.max_spare_servers | 15 | 3 |
Step 6:KUSANAGIを再起動して反映する
kusanagi restart
「restart completed.」と表示されれば成功です。
結果:メモリが大幅に改善
free -h
| 変更前 | 変更後 | |
|---|---|---|
| メモリ使用量 | 689MB | 517MB |
| 空きメモリ | 68MB | 157MB |
| 利用可能メモリ | 73MB | 245MB(約3.4倍) |
| Swap使用量 | 704MB | 439MB(265MB減) |
利用可能メモリが73MBから245MBへと約3.4倍に改善、Swapの使用量も265MB減少しました。
注意点
pm.max_childrenを5に絞ったことで、6人以上が同時にページにアクセスした場合はPHPの処理待ちが発生する可能性があります。ただし、KUSANAGIはfcache(静的キャッシュ)機能を持っており、キャッシュが有効なページはPHPを経由しないため、実際の影響はほとんどありません。個人ブログや中小規模のサイトであれば、この設定で十分運用できます。
まとめ
KUSANAGIのデフォルト設定はある程度スペックのあるサーバーを想定しているため、1GBプランでそのまま使うとメモリが不足しがちです。php-fpmのプロセス数を適切に絞るだけで、今回のように劇的な改善が見込めます。1GBプランでKUSANAGIを使っている方はぜひ一度確認してみてください。


正直1Gプランだと表示速度もそれほど早くないし、というより遅い気がしてて、メンテなど考えるとConHa WINGに変えようかと悩んでました。
しばらくはこの設定で様子見です!





コメント