GNU/Linux 上の仮想ホストごとに PHP サイトのリソース使用状況を監視するにはどうすればよいですか?

GNU/Linux 上の仮想ホストごとに PHP サイトのリソース使用状況を監視するにはどうすればよいですか?

prefork MPM を使用して、RHEL 上の apache2.4/mod_php 経由で多数の PHP サイトを実行します。

私の Apache の子プロセスは、かなりの量の RAM と大量の CPU を使用しています。

仮想ホストごとに RAM/CPU の使用状況を分類できるようにしたいと思います。

私が考えたアイデアの 1 つは、PHP-FPM を使用して、仮想ホストごとに 1 つのワーカー プールを作成することでした。ただし、リソース使用統計を意味のある方法で集計できるように、ワーカー プロセスに名前を付けたりタグ付けしたりできるかどうかはわかりません。

大規模な共有ホストは以前にもこの問題に直面したことがあるような気がします。

何か案は?

答え1

prefork mod_php を使用すると、さまざまな vhost の RAM/CPU 使用率についてほとんどわかりません。問題は、すべての Apache プロセスが同じユーザーで実行され、すべてのプロセスがすべての vhost を処理することです。そのため、あるプロセスは、ある瞬間には vhostA を処理し、別の瞬間には vhostB を処理することができます。

さらに悪いことに、リクエストが処理されるたびに、mod_php を使用する Apache プロセスでは、プロセスが MaxRequestPerChild リクエストを処理するまで RAM 使用量が増加する傾向があり、その後プロセスは終了し、新しい小さくて効率的なプロセスがその代わりになります。そのため、prefork/mod_php でリソースの使用状況を追跡することは事実上不可能です。

できることは、apachetop のような access_log を解析するツールを利用して、Apache が処理するリクエストの種類を監視することです。詳細な結果は得られませんが、少なくとも何らかのパターンはわかります。仮想ホストの 1 つがサーバー全体に負荷をかけている場合、これが役立つ場合があります。

一方、より良い解決策が必要な場合、この問題を解決する方法がいくつかあります。prefork を itk に置き換えることができます。mpm-itk を使用すると、各 vhost を異なる UID/GID で実行できます。これにより、リソース消費メトリックの問題が解決されます。たとえば、UID ごとの RAM 使用量を簡単に監視できます。

他の方法は、各仮想ホストに個別のプールを持つ PHP-FPM です。ただし、PHP リソースの消費を分離するだけで、Apache の動作を確認することはできません。ただし、Apache プロセスから mod_php を削除すると、mpm-worker (スレッド モデル) で実行でき、Apache の RAM 使用量は PHP と比較して無視できる程度になるでしょう。プロセスのタグ付けに関しては、単に異なる UID で実行できます。

関連情報