Apache-2.2

Apache消耗過多的CPU和記憶體

  • October 18, 2021

我在使用 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

您可能應該分別調低到 5MinSpareServersMaxSpareServer10 之類的值。沒有必要讓 30 名工人無所事事。

現在,回到

如果我們考慮重寫訪問和主站點流量,我們每分鐘大約有 70 個請求。現在,我們有 33 個傳入連接。

如果您有 33 個並發請求,但您每分鐘只執行 70 個,則有兩種可能性:

  1. 您的每個請求大約需要 30 秒才能送達!
  2. 你的請求率不是很穩定,而且大部分時間你什麼都不做。

如果 #1 是這種情況,我真的不知道如何提供幫助 - 有些事情非常錯誤,所以我什至不知道從哪裡開始告訴你從哪裡開始尋找。

如果它是#2,我猜你正在從你的伺服器提供你所有的靜態資產(圖像、js、css、字型)。最好將它們放在 CDN 上,但如果你真的做不到,你可以在它們上設置超長的記憶體時間並重新打開 Varnish。如果您將 Apache 程序與 PHP 和一大堆其他東西一起使用只是為了提供靜態文件,那麼您就是在浪費資源 - 使用更簡單的方法來做到這一點!

我的問題是 CPU(所有核心)負載很高。大多數時候,負載在 90% 到 100% 之間!有問題的程序是apache2。

這是一個常數,還是僅在您為請求提供服務時?

磁碟 I/O 看起來如何 ( iostat -mhx 2)?MySQL 在做什麼(show processlist;)?


對於您所描述的內容,您的伺服器功能非常強大。這是個好消息,因為這意味著您應該能夠解決此問題。

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