個人的にPHPで実装したAPIサーバを、apache2を含んだPHPのDockerイメージ(php:8.0.10-apache-buster)で稼働していたのですが、このコンテナがメモリリークをしているらしいことがわかり、原因を調査しました。同じような悩みを持つ方のページを拝見したところ、apache2のMaxRequestsPerChild(2.4ではMaxConnectionsPerChild)を減らすとよいとのことで、設定を確認してみたところ、MaxConnectionsPerChildが0、つまり上限なしに設定されていました。原因はこれかと思い、この値を3に変更してみたところ、これまで単調増加していた使用メモリが、以下の画像のように単調増加しなくなりました。
設定を変更したのは/etc/apache2/mods-available/mpm_prefork.confのファイルで、他の値も以下のように最小限にしてみました(かなり適当)。
<IfModule mpm_prefork_module>
StartServers 1
MinSpareServers 1
MaxSpareServers 1
MaxRequestWorkers 10
ServerLimit 1
MaxClients 1
MaxConnectionsPerChild 3
</IfModule>
自分しかアクセスしないプライベートなサーバなので、とりあえずこれで問題は起きていないようですが、もっとアクセス数が多いサーバだと調整が必要です。
kubernetesのhelmやDockerのイメージはデフォルトで使用するリソースが多めになっていることがあるので、きちんと設定を確認しておかないとだめですね。
