Apache消耗過多的CPU和記憶體
我在使用 Apache Web 伺服器時遇到了一些 CPU 和記憶體使用問題。
我們在虛擬機上執行**Ubuntu Server 12.04 LTS 。**我們的伺服器有以下規格:
- 8GB 記憶體;
- 4 個 vCPU(12ghz);
我們將伺服器配置為執行基於Drupal (7.23) 的網站。所以我們安裝了Apache、PHP、MySQL……版本如下:
- 阿帕奇 2.2.22;
- PHP 5.3.10 ( PHP 作為 Apache 模組執行。 );
- APC 3.1.7;
- MySQL 5.5.31(所有 innodb 表);
我也在執行一些apache 模組。看看(
apachectl -M
):
- 核心模組(靜態)
- log_config_module(靜態)
- logio_module(靜態)
- mpm_prefork_module(靜態)
- http_module(靜態)
- so_module(靜態)
- 動作模組(共享)
- 別名模組(共享)
- authz_host_module(共享)
- deflate_module(共享)
- dir_module(共享)
- env_module(共享)
- 包含模組(共享)
- mime_module(共享)
- php5_module(共享)
- proxy_module(共享)
- proxy_http_module(共享)
- reqtimeout_module(共享)
- rewrite_module(共享)
- setenvif_module(共享)
- ssl_module(共享)
- status_module(共享)
在apache2.conf上,我們有這個配置:
Timeout 90 KeepAlive On MaxKeepAliveRequests 80 KeepAliveTimeout 5 HostnameLookups Off LogLevel warn <IfModule mpm_prefork_module> StartServers 10 MinSpareServers 10 MaxSpareServers 30 MaxClients 120 MaxRequestsPerChild 1000 </IfModule>
我網站的虛擬主機:
<VirtualHost *:80> ServerName blabla.bla.bla ServerAdmin bla@bla.com DocumentRoot /l/disk0/site/public_html <Directory /> AllowOverride None </Directory> <Directory /l/disk0/site/public_html> Options MultiViews Indexes Includes FollowSymLinks ExecCGI AllowOverride All Order allow,deny allow from all </Directory> LogLevel warn ErrorLog "/l/disk0/site/logs/apache/site/error.log" CustomLog "/l/disk0/site/logs/apache/sit/access.log" combined SSLProxyEngine on RewriteEngine on RewriteLog logs/rewrite_www_log RewriteLogLevel 0 Include rewrites-www.conf </VirtualHost>
Drupal 模組:
- ACL 7.x-1.0
- APC - 替代 PHP 記憶體 7.x-1.0-beta4
- 提升 7.x-1.0-beta2
- 記憶體過期 7.x-2.0-beta2
- 驗證碼 7.x-1.0
- 混沌工具套件 (ctools) 7.x-1.3
- 日期 7.x-2.6
- 域訪問 7.x-3.10
- 域塊 7.x-2.0
- 域 CTools 7.x-1.3
- 域區域設置 7.x-1.0-beta3
- 域分類 7.x-3.x-dev (2012-abr-29)
- 域視圖 7.x-1.5
- 嵌入視圖顯示 7.x-1.2
- 實體 API 7.x-1.2
- 實體參考 7.x-1.0
- IMCE 7.x-1.7
- IMCE Mkdir 7.x-1.0
- 國際化 7.x-1.10
- 連結 7.x-1.1
- 本地化更新 7.x-1.0-beta3
- 媒體 7.x-1.3
- 元標記快速 7.x-2.7
- 時事通訊 7.x-1.0-beta9
- 選項元素 7.x-1.9
- 頁面樣式 7.x-1.0
- 面板 7.x-3.3
- Pathauto 7.x-1.2
- 病理 7.x-2.11
- profile2 7.x-1.3+0-dev (2013-mai-24)
- 選擇或其他 7.x-2.19
- sheetnode 7.x-1.0-beta4+3-dev (2013-mai-25)
- SMTP 身份驗證支持 7.x-1.0
- 代幣 7.x-1.5
- 音譯 7.x-3.1
- 變數 7.x-2.3
- 視圖 7.x-3.7
- 每個角色的詞彙權限 7.x-1.0
- 網路表格 7.x-3.19
- 網路表單驗證 7.x-1.2
- 工作台 7.x-1.2
- 工作台_訪問 7.x-1.2
- 工作台媒體 7.x-1.1
- 工作台配置文件 7.x-1.1
- xmlsitemap 7.x-2.0-rc2
我的網站很簡單,訪問者不多。我說的是每天可能有 500 名訪客。Drupal 可以使用這麼多 CPU 嗎?或者它是一個模組?
另一個問題是記憶體使用。創建程序時,為apache2分配80M。我想太多了。
我的問題是 CPU(所有核心)的使用率很高。大多數時候,它的使用率在 90% 到 100% 之間!有問題的程序是 apache2。記憶體也被無情地消耗掉了。在總共 8GB 的記憶體中,消耗的記憶體約為6.5GB 到 7.5GB。我不知道我的 apache 配置是否錯誤,或者我是否真的需要更多硬體(我猜不是)。Drupal會導致CPU負載高嗎?
當 CPU 使用率達到 100% 時,站點出現故障,我們必須重新啟動 apache。我使用 APC 和安裝 Boost 對 Drupal 做了一個解決方案。有一定的效果,但CPU使用率仍然很高。很高。
如果您需要更多資訊,例如 Drupal 模組和 PHP 擴展。請告訴我。
另一個問題是記憶體使用。創建程序時,為apache2分配80M。我想太多了。
那是真實記憶體還是虛擬記憶體?老實說,這不是很多。更重要的是,您應該專注於解決導致問題的事情,而不僅僅是您“認為”應該有所不同的事情。
如果您希望 Apache 程序佔用更少的記憶體,您應該禁用模組(因為每個模組都是需要在記憶體中的更多程式碼)。但是,如果您需要已啟用的所有模組,那麼,就是這樣。
我在管理記憶體受限的機器時使用的一種方法是將某些任務移出 Apache 並移到其他伺服器中,這樣我就可以單獨調整它們。
但更簡單的方法是改變
MaxClients 120
對您的工作量更合理的東西:
如果我們考慮重寫訪問和主站點流量,我們每分鐘大約有 70 個請求。現在,我們有 33 個傳入連接。
我稍後再談,但如果你只處理 33 個並發請求,你就不需要 120 個工人!
MaxClients 40
您可能應該分別調低到 5
MinSpareServers
和MaxSpareServer
10 之類的值。沒有必要讓 30 名工人無所事事。現在,回到
如果我們考慮重寫訪問和主站點流量,我們每分鐘大約有 70 個請求。現在,我們有 33 個傳入連接。
如果您有 33 個並發請求,但您每分鐘只執行 70 個,則有兩種可能性:
- 您的每個請求大約需要 30 秒才能送達!
- 你的請求率不是很穩定,而且大部分時間你什麼都不做。
如果 #1 是這種情況,我真的不知道如何提供幫助 - 有些事情非常錯誤,所以我什至不知道從哪裡開始告訴你從哪裡開始尋找。
如果它是#2,我猜你正在從你的伺服器提供你所有的靜態資產(圖像、js、css、字型)。最好將它們放在 CDN 上,但如果你真的做不到,你可以在它們上設置超長的記憶體時間並重新打開 Varnish。如果您將 Apache 程序與 PHP 和一大堆其他東西一起使用只是為了提供靜態文件,那麼您就是在浪費資源 - 使用更簡單的方法來做到這一點!
我的問題是 CPU(所有核心)負載很高。大多數時候,負載在 90% 到 100% 之間!有問題的程序是apache2。
這是一個常數,還是僅在您為請求提供服務時?
磁碟 I/O 看起來如何 (
iostat -mhx 2
)?MySQL 在做什麼(show processlist;
)?對於您所描述的內容,您的伺服器功能非常強大。這是個好消息,因為這意味著您應該能夠解決此問題。