Apache 2.2 最終使用所有記憶體(worker mpm)

Apache 2.2 最終使用所有記憶體(worker mpm)

我正在調整 Apache 2.2 伺服器(它與 MySQL + Courier + Mongo + Postgre 共用)。該伺服器是裸機(無虛擬化),具有 2 個四核心 Xeon(總共 16 核心)和 12GB ECC RAM(接下來幾天升級到 24GB)。 MySql 將 innodb_buffer 設為 2G 並且運作正常。 Mongo 和 Postgre 幾乎沒有接觸過——只是為了開發。

問題是 Apache 正在消耗所有可用內存,最終使用所有交換(因此會導致 MySql 崩潰,因為它使用了更多內存)。我們有帶有worker MPM 和mod_security 的Apache 2.2。每當我們重新啟動它時,我們就有大約 8G 的可用 RAM。

我試著去了解一些事情:

  • 圖中顯示的進程 top與工作伺服器之間有什麼關係?我預計最多會看到 10 個進程(作為工作設定中的 ServerLimit - 不考慮主進程)。
  • 每個執行緒或每個行程使用的 RES 記憶體量是多少?
  • 在下面的 mod_status 輸出中,有許多 READING 請求在那裡停留了很長時間。我嘗試啟用 ExtendedStatus 來發現那裡有哪些客戶端,但我找不到任何有用的信息 - 有什麼建議嗎?
  • 根據實際記憶體使用情況,我需要多少 RAM 來服務 400 個並發連接? (因為mod狀態顯示250已經耗盡)
  • 提高 ThreadsPerChild 而不是提高 MaxClients/ServerLimit 怎麼樣?
<IfModuleworker.c>
啟動伺服器2
最大客戶數 250
最小備用線程 25
最大備用線程數 75
每個子線程數 25
每個子項的最大請求數 0
伺服器限制 10
</如果模組>

TOP 顯示(僅適用於 apache):

頂部 - 16:30:21 向上 46 天, 23:12, 2 位用戶, 平均負載: 0.94, 0.97, 1.31
任務:總共 460 個,1 個正在運行,459 個正在睡覺,0 個停止,0 個殭屍
CPU:2.8%us、0.5%sy、0.0%ni、96.7%id、0.0%wa、0.0%hi、0.0%si、0.0%st
記憶體:總共 12187448k,已用 10686748k,空閒 1500700k,67104k 緩衝區
交換:總計 1048568k,已使用 275904k,空閒 772664k,快取 2371208k

  PID 使用者 PR NI VIRT RES SHR S %CPU %MEM TIME+ 指令
24252 wwwrun 20 0 2216m 161m 7484 S 20.2 1.4 0:09.25 httpd
24750 wwwrun 20 0 1264m 51m 6196 S 9.9 0.4 0:00.93 httpd
23996 wwwrun 20 0 2136m 279m 7292 S 6.0 2.4 0:16.76 httpd
23326 wwwrun 20 0 2216m 276m 7376 S 2.7 2.3 0:16.81 httpd
23582 wwwrun 20 0 2208m 293m 7132 S 2.3 2.5 0:27.30 httpd
23688 wwwrun 20 0 1904m 208m 7304 S 1.0 1.8 0:13.62 httpd
19507 wwwrun 20 0 2182m 229m 8096 S 0.7 1.9 0:18.65 httpd
23616 wwwrun 20 0 1908m 239m 7092 S 0.7 2.0 0:18.48 httpd
18304 wwwrun 20 0 2160m 334m 11m S 0.3 2.8 0:47.38 httpd
23637 wwwrun 20 0 1830m 231m 7556 S 0.3 1.9 0:20.56 httpd
24457 wwwrun 20 0 2196m 174m 6568 S 0.3 1.5 0:04.11 httpd
15694 wwwrun 20 0 2199m 295m 7504 S 0.0 2.5 0:20.54 httpd
15783 wwwrun 20 0 2172m 244m 10m S 0.0 2.1 0:17.45 httpd
16577 wwwrun 20 0 2128m 354m 7436 S 0.0 3.0 0:28.21 httpd
18290 wwwrun 20 0 277m 9880 964 S 0.0 0.1 0:00.05 httpd
18379 wwwrun 20 0 2208m 211m 6864 S 0.0 1.8 0:08.57 httpd
18480 wwwrun 20 0 2096m 305m 7540 S 0.0 2.6 0:17.72 httpd
18791 wwwrun 20 0 1920m 251m 7244 S 0.0 2.1 0:20.24 httpd
19348 wwwrun 20 0 2060m 310m 7388 S 0.0 2.6 0:22.07 httpd
19619 wwwrun 20 0 2206m 235m 7340 S 0.0 2.0 0:15.30 httpd
19999 wwwrun 20 0 2178m 144m 7132 S 0.0 1.2 0:05.50 httpd
20697 wwwrun 20 0 2002m 193m 7276 S 0.0 1.6 0:08.12 httpd
20838 wwwrun 20 0 1890m 127m 7260 S 0.0 1.1 0:07.44 httpd
21407 wwwrun 20 0 1988m 290m 7708 S 0.0 2.4 0:39.33 httpd
22252 wwwrun 20 0 2216m 295m 7732 S 0.0 2.5 0:27.04 httpd
22723 wwwrun 20 0 2020m 187m 7444 S 0.0 1.6 0:39.80 httpd
22753 wwwrun 20 0 1850m 206m 7448 S 0.0 1.7 0:10.62 httpd
23174 wwwrun 20 0 1990m 229m 7332 S 0.0 1.9 0:07.71 httpd
23383 wwwrun 20 0 1504m 76m ​​6372 S 0.0 0.6 0:01.25 httpd
23720 wwwrun 20 0 1906m 225m 7080 S 0.0 1.9 0:20.12 httpd
24778 wwwrun 20 0 970m 30m 5604 S 0.0 0.3 0:00.80 httpd

最後,mod_status 輸出:

   伺服器版本:Apache/2.2.23 (Unix) mod_ssl/2.2.23 OpenSSL/1.0.0-fips 網域伺服器 PHP/5.3.24 帶 Suhosin-Patch mod_perl/2.0.5
          Perl/v5.10.1

   伺服器建成:2013 年 5 月 15 日 10:17:30
     _________________________________________________________________________________________________________________________________

   目前時間:2014 年 5 月 12 日星期一 16:41:08 BRT
   重啟時間:2014年5月12日星期一 15:36:37 BRT
   父伺服器產生:1
   伺服器正常運作時間:1小時4分31秒
   總造訪次數:36446 - 總流量:1.6 GB
   CPU 使用率:u213.3 s13.65 cu0 cs0 - 5.86% CPU 負載
   9.42 個請求/秒 - 442.8 kB/秒 - 47.0 kB/請求
   目前正在處理 249 個請求,0 個空閒工人

WWRRKRKRRKRRRRWRRWWWRWCR ................................................
RWWWRRWRRRRKKRKRWRRRRRWWR........................................
WRWRCRRWRRWWRKRRWWRRWWWW........................................
WRWKKWWWRWWKRRWRCRRRWWRWWW.......................................
WRWRWCRKCWWWRWWRRWWCRWRWW................................
WRWKRWRRKKRKRRRRCWWKWWWW........................................
RWWKWRRWKRRRWRRWWCRRRRRRW........................................
WWWRRWRKWWWWKRWWWWRWWWKRRW.................................................
RRRRRRRK.WKRRWRWWKRRWRRKR......................................... ..
KCRRRRRWWKRWWWRRKWRWRWRK................................................

更新1:

我嘗試停用 mod_security2,擺弄工作設置,但最終 Apache 會消耗幾乎 20G 的 RAM(我添加了 13G 交換文件以防止伺服器崩潰)。

最後,我停用 KeepAlive,並將 MaxRequestsPerChild 保持為 100 - 現在 Apache 使用 2-3G,並且請求正在清理,狀態輸出如下:

   目前時間:2014 年 5 月 13 日星期二 17:07:48 BRT
   重啟時間:2014年5月13日星期二 16:49:14 BRT
   父伺服器產生:0
   伺服器正常運作時間:18分33秒
   總造訪次數:6637 - 總流量:133.2 MB
   CPU 使用率:u34.43 s3.05 cu0 cs0 - 3.37% CPU 負載
   5.96 個請求/秒 - 122.5 kB/秒 - 20.5 kB/請求
   目前正在處理 14 個請求,86 個空閒工人

……………………………………………… ............
________________RR__R_R__RC_RWC________________________________________________
R_WC__R___R__________________________________________________________________
.................................................. .... ............
.................................................. .... ............
.................................................. .... ............
.................................................. .... ............
.................................................. .... ............
.................................................. .... ............
.................................................. .... ............

答案1

KeepaliveTimeout將有助於減少掛「讀」的工人。

MPM 使用具有多個執行緒的多個進程來處理傳入流量,因此您看到的是正常的 Apache 操作。

此預設調整可能更適合您的需求:

ServerLimit 12
StartServers 2
MaxClients 500
MinSpareThreads 25
MaxSpareThreads 50
ThreadsPerChild 50

這將導致總共產生 10 個進程 ( MaxClients/ ThreadsPerChild),這將顯著減少伺服器的記憶體佔用。由於 CPU 的可用性,您可以在更少的進程中承擔更多的執行緒。

請注意,更改這些變數需要完全停止然後重新啟動 Apache。

答案2

上方顯示的進程與工作伺服器有什麼關係?我預計最多會看到 10 個進程(作為工作設定中的 ServerLimit - 不考慮主進程)。

這看起來不像是top運行工作 MPM 的 Apache 伺服器。我正在運行兩台伺服器,一台有工作 MPM,另一台是 prefork MPM。對於worker,將topApache進程列為httpd.worker,並且進程數與透過mod_status可見的活動伺服器數(帶有一些非點條目的點行)相符。使用 prefork,進程被列為httpd,並且該數字大致與空閒/活動工作線程的數量(每個非點條目)相符。

因此給出這個 mod_status 輸出:

..................R.............................................
..............._RR__R_R__RC_RWC__...............................
R_WC__R___R_....................................................
................................................................
................................................................
................................................................
................................................................
................................................................
................................................................
................................................................

top在執行 prefork 的伺服器上應顯示約 31 個httpd進程,top在執行worker 的伺服器上應顯示 3 個httpd.worker進程。

相關內容