如何在 GNU/Linux 上基于每个虚拟主机监控 PHP 站点的资源使用情况?

如何在 GNU/Linux 上基于每个虚拟主机监控 PHP 站点的资源使用情况?

使用 prefork MPM 在 RHEL 上通过 apache2.4/mod_php 运行一堆 PHP 站点。

我的 Apache 子进程使用了​​相当多的 RAM 和 CPU。

我希望能够根据每个虚拟主机来分配 RAM/CPU 的使用情况。

我的一个想法是使用 PHP-FPM 并为每个虚拟主机创建一个工作池。但是,我不清楚是否可以命名或标记工作进程,以便以有意义的方式汇总资源使用统计数据。

我感觉大型共享主机肯定遇到过这个问题。

有任何想法吗?

答案1

使用 prefork mod_php 时,您或多或少对不同 vhost 的 RAM/CPU 使用情况一无所知。问题是所有 apache 进程都在同一用户下运行,并且每个进程都为所有 vhost 提供服务。因此,一个进程可以在某一时刻为 vhostA 提供服务,而在其他时刻为 vhostB 提供服务。

更糟糕的是,随着每个请求的响应,对于使用 mod_php 的 apache 进程,RAM 使用量往往会增长,直到进程处理 MaxRequestPerChild 个请求,之后进程退出,新的、小型且精简的进程将取而代之。因此,使用 prefork/mod_php 跟踪资源使用情况几乎是不可能的。

您可以做的是使用解析 access_log 的工具(如 apachetop),并观察 apache 提供的请求类型。这不会给您带来非常细致的结果,但您至少会看到某种模式。如果您的某个虚拟主机正在破坏整个服务器,这可能会对您有所帮助。

另一方面,如果您想要更好的解决方案,有几种方法可以解决这个问题。您可以将 prefork 换成 itk。mpm-itk 允许您在不同的 UID/GID 下运行每个 vhost - 这反过来会解决您的资源消耗指标问题 - 例如,您可以简单地监控每个 UID 的 RAM 使用情况。

另一个方向是 PHP-FPM,每个 vhost 都有单独的池。但这只会分离 PHP 资源消耗,您仍然无法看到 apache 所做的工作。但是,从 apache 进程中删除 mod_php 后,您可以使用 mpm-worker(线程模型)运行它们,与 PHP 相比,apache 的 RAM 使用量可能可以忽略不计。关于进程标记 - 您只需在不同的 UID 下运行它们即可。

相关内容