如何優化 Apache 以在我的網站上使用 1GB 的 RAM?
我的 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