
我正在調整 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,將top
Apache進程列為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
進程。