Apache-2.2

如何優化 Apache 以在我的網站上使用 1GB 的 RAM?

  • February 9, 2011

我的 VPS 計劃給了我 1GB 的 RAM,可爆破到 2GB。當然,我不能每天使用 2 GB,也不能 > 1 GB,所以我計劃優化我的網路伺服器的性能。

平均每小時點擊次數約為 8'000-10'000。這意味著每秒大約 2 個連接。到目前為止,達到的最大每小時點擊次數約為 60'000。這意味著每秒大約有 16 個連接。

不幸的是,我目前的 apache 配置使用了太多記憶體(當沒有連接的客戶端時 - 通常在夜間 - 它使用大約 1GB),所以我嘗試自定義 apache 安裝以滿足我的需要。

我正在使用帶有 apache2-mpm-worker 的 Ubuntu,核心 2.6.18,因為我讀過它需要更少的記憶體和 fcgid (+ PHP)。這是我的 /etc/apache2/apache2.conf:

Timeout 45
KeepAlive on
MaxKeepAliveRequests 100
KeepAliveTimeout 10
<IfModule mpm_worker_module>
   StartServer 2
   MinSpareThreads 25
   MaxSpareThreads 75
   MaxClients 100
   MaxRequestsPerChild 0
</IfModule>

這是 ps aux 的輸出:

www-data  9547  0.0  0.3 423828  7268 ?        Sl   20:09   0:00 /usr/sbin/apache2 -k start
root     17714  0.0  0.1  76496  3712 ?        Ss   Feb05   0:00 /usr/sbin/apache2 -k start
www-data 17716  0.0  0.0  75560  2048 ?        S    Feb05   0:00 /usr/sbin/apache2 -k start
www-data 17746  0.0  0.1  76228  2384 ?        S    Feb05   0:00 /usr/sbin/apache2 -k start
www-data 20126  0.0  0.3 424852  7588 ?        Sl   19:24   0:02 /usr/sbin/apache2 -k start
www-data 24260  0.0  0.3 424852  7580 ?        Sl   19:42   0:01 /usr/sbin/apache2 -k start

雖然這是 php5 的 ps aux:

www-data  7461  2.9  2.2 142172 47048 ?        S    19:39   1:39 /usr/lib/cgi-bin/php5
www-data 23845  1.3  1.7 135744 35948 ?        S    20:17   0:15 /usr/lib/cgi-bin/php5
www-data 23900  2.0  1.7 136692 36760 ?        S    20:17   0:22 /usr/lib/cgi-bin/php5
www-data 27907  2.0  2.0 142272 43432 ?        S    20:00   0:43 /usr/lib/cgi-bin/php5
www-data 27909  2.5  1.9 138092 40036 ?        S    20:00   0:53 /usr/lib/cgi-bin/php5
www-data 27993  2.4  2.2 142336 47192 ?        S    20:01   0:50 /usr/lib/cgi-bin/php5
www-data 27999  1.8  1.4 135932 31100 ?        S    20:01   0:38 /usr/lib/cgi-bin/php5
www-data 28230  2.6  1.9 143436 39956 ?        S    20:01   0:54 /usr/lib/cgi-bin/php5
www-data 30708  3.1  2.2 142508 46528 ?        S    19:44   1:38 /usr/lib/cgi-bin/php5

如您所見,它使用了大量記憶體。我怎樣才能減少它以適合僅 1GB 的 RAM?

PS:我也在考慮切換到nginx,如果Apache不能滿足我的需求…

UPDATE1:我剛剛寫了一些關於 fcgid 配置的行,因為我以前沒有寫過:

FcgidMaxRequestsPerProcess 1000
FcgidIdleTimeout 15
FcgidBusyTimeout 30
FcgidMaxProcessesPerClass 5

我已經通過在我的 VPS 上編譯 apache(使用 prefork!)+ PHP5 解決了。現在它從 50 個子程序開始,消耗大約 6-700 MB。

我認為這是我能做的最好的:P

減少 Apache 使用的記憶體量相當簡單……只需通過增加執行緒數量來減少程序數量。

另一方面,減少 CGI / PHP 使用的記憶體量很大程度上取決於您的 PHP 應用程序、它們的記憶體效率以及您使用的 PHP 版本。

至少,您可以使用以下內容修改您的 Apache,這將為您提供 2 個具有 50 個執行緒的 Apache 程序,並確保 Apache 程序將每 10k 連接重新載入自己(不考慮 keepalived 連接)以釋放阿帕奇記憶體:

<IfModule mpm_worker_module>
   KeepAlive On
   MaxKeepAliveRequests    100
   KeepAliveTimeout        15
   StartServers            2
   ServerLimit             2
   MinSpareThreads         50
   MaxSpareThreads         100 
   ThreadLimit             100
   ThreadsPerChild         50
   MaxClients              100
   MaxRequestsPerChild     10000
</IfModule>

然後,您可能需要查看 fcgid 配置以確保限制活動 php 程序的數量,並確保重新載入程序以釋放未使用的記憶體。但是,這在很大程度上取決於您的 Web 應用程序和使用模式:

FcgidMaxRequestsPerProcess
FcgidIdleTimeout
FcgidBusyTimeout
FcgidMaxProcesses
FcgidMaxProcessesPerClass

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