ZabbixのMemory高負荷の原因になるphp-fpmの設定について

# はじめに
　ZabbixServerを構築して、長期運用をする際に最も注意すべきポイントは何でしょうか。
　私は『Memory使用率』だと思っています。

　よくあるのが、**vm.memory.size[pavailable]**の使用率が70%以上になり、
　Memory空き容量が枯渇、Swapが発生してしまう事例です。

![memory01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640068/efbba4d2-2b77-21d3-8041-2738b0457270.png)

　何度再起動しようと、このように右肩上がりでMemory使用率は上がっていきます。
　これを放置して、Memory空き容量やSwap領域が枯渇した場合は、
　そのままOSがハングしてしまうこともしばしばです。
　こうなってしまうと、ハングする前にZabbixServerの再起動が必要でした。

　私は個人的にAWSにZabbixServer(5.0系)を立てていますが
　インスタンスタイプはt3a.smallであり、Memory容量は1.74GBしかありません。
　小さなMemoryですが、これ以上大きなインスタンスタイプにするとお財布への打撃も大きく、
　省MemoryでのZabbixServerの長期運用は課題でした。

# php-fpmのrss使用量、大きすぎね？
　そんなこんなで、何とかできないか色々データを集めていると、
　php-fpmの物理Memory専有量（rss）が大きいことに気づきました。
（**proc.mem["php-fpm",,,,rss]**で取得できます）

![memory03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640068/20332b8f-5ec9-456b-9099-7ba647a1d52e.png)
※MySQLとかを差し置いて、右肩上がりでMemory使用量が増えているphp-fpmさん

　しかもよくよく見てみると、ZabbixServerのMemory使用率と連動しています。

![memory02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640068/0b7ab18d-7a0a-4069-7aae-9a24c3047083.png)

　いや、お前が原因やんけ……。薄々感じてはいましたが、確信した瞬間でした。


# 対策・設定変更
　根本原因を色々調べましたが、残念ながらよく分からなかったので、
（きっと画面描画などでプロセスが色々データを余計に保持しちゃうのでしょう）
　php-fpm側の設定で対処することにしました。

◆参考記事
[[Apache] 一定数リクエストを処理したphp-fpmのプロセスを再起動する](https://www.84kure.com/blog/2020/09/21/apache-%E4%B8%80%E5%AE%9A%E6%95%B0%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E3%82%92%E5%87%A6%E7%90%86%E3%81%97%E3%81%9Fphp-fpm%E3%81%AE%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E3%82%92%E5%86%8D/)

　php-fpmのconfファイルの、プロセス起動方式を「static」にして、
　さらに「pm.max_requests」というオプションを追加し、
　リクエスト数が上限に達したら再起動してもらうことにしました。


```php
修正前の設定
/etc/php-fpm.d/zabbix.conf

[zabbix]
user = apache
group = apache

listen = /run/php-fpm/zabbix.sock
listen.acl_users = apache,nginx
listen.allowed_clients = 127.0.0.1

pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35

php_value[session.save_handler] = files
php_value[session.save_path]    = /var/lib/php/session

php_value[max_execution_time] = 300
php_value[memory_limit] = 256M
php_value[post_max_size] = 32M
php_value[upload_max_filesize] = 8M
php_value[max_input_time] = 300
php_value[max_input_vars] = 10000
php_value[date.timezone] = Asia/Tokyo
```

```php
修正後の設定
/etc/php-fpm.d/zabbix.conf

[zabbix]
user = apache
group = apache

listen = /run/php-fpm/zabbix.sock
listen.acl_users = apache,nginx
listen.allowed_clients = 127.0.0.1

pm = static # staticに変更
pm.max_children = 2 # CPUコア数分
pm.max_requests = 200 # とりあえず200で

php_value[session.save_handler] = files
php_value[session.save_path]    = /var/lib/php/session

php_value[max_execution_time] = 300
php_value[memory_limit] = 256M
php_value[post_max_size] = 32M
php_value[upload_max_filesize] = 8M
php_value[max_input_time] = 300
php_value[max_input_vars] = 10000
php_value[date.timezone] = Asia/Tokyo
```
　
　すると、Memory使用率はこうなりました！
　綺麗な平行線で、再起動後にもMemory使用率が上がっていません！

![memory04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640068/8f3ece63-c5f4-594b-78de-f8cf3b7b0bd0.png)

　これでMemory高負荷の問題は解決しました！！

# おわりに
　いかがでしたでしょうか。もしZabbixServerのMemory使用率で悩まれていましたら、
　php-fpmのrss使用量を確認してみてください。
　
　いまのところ、私はphp-fpmの設定をstaticにしたことや
　200リクエストで再起動させていることによる弊害は特に感じていません。
　画面の動作速度も、そんなに変わったようには感じません。（ちょっとグラフ描画は遅いかも？）

　私はあまりphp-fpmの仕様に詳しくないですが、個人所有のZabbixであれば十分でしょう。
　多数の運用者が触る画面だと、もう少し設定を見直す必要もあるかもしれませんが、
　いずれにしても今後ZabbixServerを構築する際には、
　php-fpmの設定見直しは必須だな、と感じています。

　php-fpmの設定については、なかなかベテランのZabbixエンジニアさんの記事でも
　あまり言及されていないような気がしましたので、記事にしました。