Apache-2.2

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

  • December 20, 2016

我正在調整 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 怎麼樣?
<IfModule worker.c>
啟動伺服器 2
最大客戶數 250
MinSpareThreads 25
最大備用執行緒數 75
每個孩子的執行緒數 25
MaxRequestsPerChild 0
伺服器限制 10
</IfModule>

TOP 顯示(僅適用於 apache):

頂部 - 16:30:21 上升 46 天,23:12,2 個使用者,平均負載:0.94、0.97、1.31
任務:共 460 個,執行 1 個,睡眠 459 個,停止 0 個,殭屍 0 個
Cpu (s): 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 with 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 c0 - 5.86% CPU 負載
9.42 請求/秒 - 442.8 kB/秒 - 47.0 kB/請求
目前正在處理 249 個請求,0 個空閒工作人員

WWRRKRKRRKRRRRWRRWWWRWCRR.......................................
RWWWRRWRRRRKKRKRWRRRRRWWR ....................................
WRWRCRRWRRWWRKRRWRWRWRWWW ...................................
WRWKKWWWRWKRRWRCRRRWWRWWW ......................................
WRWRWCRKCWWWWRWWCRWRWW ...................................
WRWKRWRRKKRKRRRRCWWKWWWRW ...................................
RWWKWRRWKRRRWRRWWCRRRRRW……………………………………。
WWWRRWRKWWWKRWWWWWWWWWWKRRW.......................
RRRRRRRK.WKRRWRWWKRRWRRKR.......................
KCRRRRRWRWWKRWWWRRKWRWRWRK ....................................

更新1:

我嘗試禁用 mod_security2,修改了 worker 設置,但最終 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 個空閒工作人員

.....................R................................. .....................
________________RR__R_R__RC_RWC___________________.......
R_WC__R___R_____________________________.......
................................................................
................................................................
................................................................
................................................................
................................................................
................................................................
................................................................

KeepaliveTimeout將有助於減少懸掛的“閱讀”工人。

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

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

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

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

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

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