如何在 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 你或多或少對不同虛擬主機的 RAM/CPU 使用情況一無所知。問題是所有 apache 進程都在同一用戶下運行,並且每個進程都服務於所有虛擬主機。因此,一個進程可以在某一時刻為 vhostA 提供服務,在另一個時刻為 vhostB 提供服務。

更糟的是,隨著每個請求的處理,對於mod_php 的apache 進程,RAM 使用量往往會增加,直到進程處理MaxRequestPerChild 請求,之後進程就會退出,新的、小型的、精益的進程會取代它。因此,幾乎不可能使用 prefork/mod_php 來追蹤資源的使用情況。

您可以做的是利用解析 access_log 的工具(例如 apachetop),並觀察 apache 服務的請求類型。這不會為你帶來非常細緻的結果,但你至少會看到某種模式。如果您的虛擬主機之一正在破壞整個伺服器,這可能會對您有所幫助。

另一方面,如果您想要更好的解決方案,有幾種方法可以解決這個問題。你可以將 prefork 換成 itk。 mpm-itk 可讓您在不同的 UID/GID 下執行每個虛擬主機 - 這將反過來解決您的資源消耗指標問題 - 例如,您可以簡單地監視每個 UID RAM 使用情況。

其他方向是 PHP-FPM,每個虛擬主機都有單獨的池。但這只會分離 PHP 資源消耗,你還是無法看到 apache 做了什麼。但是,從 apache 進程中刪除 mod_php 後,您可以使用 mpm-worker (執行緒模型)運行它們,並且與 PHP 相比,apache 的 RAM 使用量可能可以忽略不計。關於進程標記 - 您可以簡單地在不同的 UID 下運行它們。

相關內容