Apache-2.2

如何減少 Unix 網路伺服器上的記憶體使用

  • November 28, 2017

我目前正在使用 Joyent Accelerator 來託管我的 web 應用程序,它執行良好,但是我需要降低成本,所以我正在降級我目前的計劃,這會帶來一些新的記憶體限制(256M rss,512M 交換)。昨天我並沒有超過他們,但是今天重新啟動 Apache 幾次後,我現在是 411M rss,721M swap (prstat -Z -s cpu)。

在伺服器故障中搜尋只為我提供了很多方法和特定工具來監視伺服器,但沒有關於如何減少/優化它的記憶體使用的建議。我也看過這個問題,但我認為這對這種特殊(或者我可以說是通用的?)情況沒有好處。

伺服器在共享 CPU 上執行 Solaris,我使用的是 Apache + MySQL + PHP 堆棧。

我很想知道可以採取哪些步驟來解決這個問題並解決問題。然而,我也沒有時間在目前結束之前降低我的記憶足跡和降級計劃,所以任何可以創造奇蹟和拯救一天的東西都是受歡迎的:)

*謝謝大家的回答!*按照您的建議,我已經能夠將記憶體使用量減少到 195M SWAP 和 108M RSS,而無需接觸我的程式碼(我肯定會很快對其進行優化,但這應該是讓我快速擺脫麻煩的解決方案)。

這是我做的事情的清單:

**擺脫了 VirtualHost 條目中使用的萬用字元。**我使用伺服器的真實 IP 而不是 *:80 和 *:443。

**更改了 Apache 的 prefork MPM。**這些是我最終使用的值:

啟動伺服器 1
MinSpareServers 1
MaxSpareServers 5
伺服器限制 16
最大客戶數 16
MaxRequestsPerChild 0
聽積壓 100

這些絕不是神奇的數字。我花了一些時間嘗試不同的值和組合,然後根據我的伺服器的實際使用情況測試它們,每個人都應該在他們的環境中做同樣的事情。作為記錄,我的伺服器每月接收近 200 萬 pvs,以固定速率提供動態頁面和資產 - 沒有探勘效應。同樣,其目的是減少記憶體佔用,而不是提高性能或 HA。

參考:

**關閉 Apache 的 KeepAlive。**通過設置KeepAliveTimeout為較低的值(在我的情況下為 2),我可以預期更少的伺服器程序只等待與可能不再請求任何內容的空閒客戶端的連接。

參考:http ://httpd.apache.org/docs/2.0/mod/core.html#keepalivetimeout

**刪除了 MySQL 未使用的模組。**我添加skip-innodb到 MySQL 的 my.cnf。大量減少記憶體消耗。

還有一些我個人無法做到的非常好的建議:

  • **刪除不需要的 PHP 模組。**我伺服器上的 PHP 已經編譯了大多數 mod,我可能會在其他 VPS 上嘗試我自己的最小 PHP。
  • **使用 php-fastcgi 切換到 nginx。**這是我將很快嘗試的另一個好建議,但現在我不能冒險停機。

引用自:https://serverfault.com/questions/21106