Apache 程序超過 MaxClients
我們讓 Apache 與 worker MPM 一起執行,並將 MaxClients 設置為 6,但是當我打開頂部時,我可以看到超過 6 個 Apache 程序正在執行。13 在下面的螢幕轉儲中可見。有人可以解釋一下嗎?還有一個來自 /server-status/ 的螢幕轉儲,大約在同一時間拍攝。在我們的正常負載下,一次似乎有 2-6 個請求處理,所以我希望看到許多 apache2 程序在頂部執行。我可以協調這一點的唯一方法是假設在最大負載下,有 3 個伺服器正在執行(ServerLimit 3、3 個 apache2 程序),每個伺服器有 2 個執行緒(3x2 = 6 個 apache2 程序),但即使這樣也會導致最多執行 9 個 apache 程序.
Apache 本質上是在逃跑,從不釋放記憶體。我們每秒處理大約 5-6 個請求,使用 /server-status/ 進行監控,因此我認為將 MaxRequestsPerChild 設置為 1000(我們將其設置為 500)會導致程序回收和釋放記憶體,但這不會似乎發生。我們正在通過 New Relic 監控 apache 程序記憶體。當我們重新啟動 Apache 時,它會消耗大約 550M 的記憶體,我們的配置如下。每個程序最終都會膨脹到 VIRT: 300m RES: 80m 並且我們似乎無法控制正在執行的程序數量,所以 apache 在 12-14 小時內從 550M - 5G 將我們消滅了。
我檢查了 /conf.d/ 目錄以確保我們沒有覆蓋 apache 配置中的任何設置。有人對控制 apache 有什麼建議嗎?我知道我們有一個執行 mod_wsgi 的胖 python 應用程序,它可能存在記憶體洩漏,當然可以進行優化,但我只是想控制產生的 apache 程序的數量。
阿帕奇配置:
### Section 1: Global Environment # # The directives in this section affect the overall operation of Apache, # such as the number of concurrent requests it can handle or where it # can find its configuration files. # ServerRoot "/etc/apache2" ServerName localhost LockFile ${APACHE_LOCK_DIR}/accept.lock PidFile ${APACHE_PID_FILE} Timeout 120 KeepAlive Off ExtendedStatus On # worker MPM # StartServers: initial number of server processes to start # MinSpareThreads: minimum number of worker threads which are kept spare # MaxSpareThreads: maximum number of worker threads which are kept spare # ThreadLimit: ThreadsPerChild can be changed to this maximum value during a # graceful restart. ThreadLimit can only be changed by stopping # and starting Apache. # ThreadsPerChild: constant number of worker threads in each server process # MaxClients: maximum number of simultaneous client connections # MaxRequestsPerChild: maximum number of requests a server process serves <IfModule mpm_worker_module> StartServers 1 ThreadsPerChild 2 MinSpareThreads 1 MaxSpareThreads 2 MaxClients 6 ServerLimit 3 MaxRequestsPerChild 1000 </IfModule> # These need to be set in /etc/apache2/envvars User ${APACHE_RUN_USER} Group ${APACHE_RUN_GROUP} AccessFileName .htaccess <Files ~ "^\.ht"> Order allow,deny Deny from all Satisfy all </Files> DefaultType None HostnameLookups Off ErrorLog ${APACHE_LOG_DIR}/error.log LogLevel warn LogFormat "%v:%p %a %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined LogFormat "%a %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined LogFormat "%a %l %u %t \"%r\" %>s %O" common LogFormat "%{Referer}i -> %U" referer LogFormat "%{User-agent}i" agent # Include module configuration: Include mods-enabled/*.load Include mods-enabled/*.conf # Include ports listing Include ports.conf # Include generic snippets of statements Include conf.d/
最佳:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 24775 www-data 20 0 282m 68m 5160 S 104 0.8 3:04.67 apache2 24782 www-data 20 0 283m 66m 5376 S 57 0.8 3:24.31 apache2 24780 www-data 20 0 280m 65m 4976 S 55 0.8 3:20.74 apache2 24778 www-data 20 0 289m 72m 5540 S 29 0.9 3:09.55 apache2 24773 www-data 20 0 278m 64m 5116 S 26 0.8 2:55.66 apache2 24777 www-data 20 0 282m 65m 4664 S 20 0.8 3:08.39 apache2 13433 memcache 20 0 642m 597m 876 S 16 7.4 11:46.62 memcached 24774 www-data 20 0 288m 71m 4672 S 15 0.9 3:12.58 apache2 24781 www-data 20 0 283m 66m 5160 S 11 0.8 3:16.01 apache2 24779 www-data 20 0 281m 64m 4676 S 8 0.8 3:11.44 apache2 24776 www-data 20 0 284m 74m 4660 S 8 0.9 2:56.38 apache2 27105 www-data 20 0 49520 6180 2636 S 2 0.1 0:00.05 apache2 27100 www-data 20 0 49432 6084 2628 S 1 0.1 0:00.06 apache2 9 root 20 0 0 0 0 S 1 0.0 62:05.25 rcu_sched 27007 www-data 20 0 49568 6292 2684 S 1 0.1 0:00.60 apache2 1 root 20 0 3496 872 428 S 0 0.0 0:04.61 init 2 root 20 0 0 0 0 S 0 0.0 0:00.00 kthreadd 3 root 20 0 0 0 0 S 0 0.0 0
/伺服器狀態/
Apache Server Status for www.mysite.com Server Version: Apache/2.2.22 (Ubuntu) mod_ssl/2.2.22 OpenSSL/1.0.1 mod_wsgi/3.3 Python/2.7.3 Server Built: Feb 13 2012 01:37:45 Current Time: Tuesday, 18-Feb-2014 10:53:01 EST Restart Time: Tuesday, 18-Feb-2014 10:25:32 EST Parent Server Generation: 0 Server uptime: 27 minutes 28 seconds Total accesses: 8248 - Total Traffic: 126.6 MB CPU Usage: u.36 s.15 cu0 cs0 - .0309% CPU load 5 requests/sec - 78.7 kB/second - 15.7 kB/request 2 requests currently being processed, 0 idle workers ................................................................ ................................................................ WW.............................................................. Scoreboard Key: "_" Waiting for Connection, "S" Starting up, "R" Reading Request, "W" Sending Reply, "K" Keepalive (read), "D" DNS Lookup, "C" Closing connection, "L" Logging, "G" Gracefully finishing, "I" Idle cleanup of worker, "." Open slot with no current process Srv PID Acc M CPU SS Req Conn Child Slot Client VHost Request 0-0 - 0/0/1569 . 0.02 0 37 0.0 0.00 25.22 67.217.125.252 www.mysite.com GET /imgname.jpg HTTP/1.0 0-0 - 0/0/1502 . 0.03 0 786 0.0 0.00 22.47 65.55.52.119 www.mysite.com GET / HTTP/1.0 1-0 - 0/0/1629 . 0.04 13 260 0.0 0.00 24.85 70.208.67.110 www.mysite.com GET /article/s 1-0 - 0/0/1416 . 0.04 13 469 0.0 0.00 21.42 98.109.237.89 www.mysite.com GET / HTTP/1.0 2-0 27863 0/54/1021 W 0.44 0 0 0.0 0.69 15.95 66.151.5.10 www.mysite.com GET /storm-h 2-0 27863 0/50/1111 W 0.44 0 0 0.0 0.61 16.73 108.88.80.66 www.mysite.com GET /server-status/ HTTP/1.0
更新
這個問題有一個多步驟的解決方案。
辨識出 mod_wsgi 程序被 top 報告為 apache2。要更正此問題,請將 display-name=my-mod-wsgi-app 參數添加到您的 WSGIDaemonProcess 配置中。
我們發現我們的 python/Django 應用程序中有一些可怕的部分導致 mod_wsgi 程序膨脹到 600M。執行其中的 5 個會在我們的 VPS 上消耗 3G 的記憶體並讓它非常難過。
我們將 inactivity-timeout=300 和 maximum-requests=200 添加到我們的 WSGIDaemonProcess 配置中,並且當程序未使用或收到超過 500 個請求時,mod_wsgi 會很好地自行重新啟動,這使我們超重、馬虎的 Django 應用程序能夠順利執行。
感謝 Graham 讓我開始朝這個方向發展。您可以閱讀我在 mod_wsgi Google 組上討論這個問題的方法。https://groups.google.com/forum/#!topic/modwsgi/wYScZlqgjgA
流程分解如下:
- 一個 Apache 父程序。如果 Apache 是從系統 init.d 腳本啟動的,那麼這個程序將以“root”身份執行。它將是所有其他程序的父程序 ID。
- 可變數量的 Apache 子工作程序。確切的數字取決於 Apache MPM 設置和您的站點接收的流量。它會有所不同,因為 Apache 將根據需要動態控制子工作程序的數量。
- 固定數量的 mod_wsgi 守護程序模式程序。這取決於您為 WSGIDaemonProcess 指令指定的程序數。
如果你使用 WSGIDaemonProcess 的 display-name 選項,那麼一些工具,例如 BSD 派生的 ‘ps’ 命令和 ‘htop’ 將顯示你指定的名稱而不是 ‘apache2’。通過這種方式,您可以區分哪些實際上是執行您的 Web 應用程序的 mod_wsgi 守護程序。
要推斷更多,您需要顯示您正在使用的 mod_wsgi 配置是什麼。現在,儘管 MPM 設置看起來您的配置很差,因為在使用 Apache worker MPM 時使用如此少的執行緒執行和偏愛程序並沒有多大意義。
無論哪種方式,StackOverflow 都不是一個論壇,因此是一個非常糟糕的地方,可以嘗試進行長時間的討論以幫助整理您的配置。最好使用 mod_wsgi 郵件列表。
我還建議您觀看/閱讀: