apache2+PHPのDockerイメージを使ったサーバがメモリリークして困った話

June 26, 2022

個人的に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のイメージはデフォルトで使用するリソースが多めになっていることがあるので、きちんと設定を確認しておかないとだめですね。