Apache-2.2

Apache 程序超過 MaxClients

  • February 19, 2014

我們讓 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

更新

這個問題有一個多步驟的解決方案。

  1. 辨識出 mod_wsgi 程序被 top 報告為 apache2。要更正此問題,請將 display-name=my-mod-wsgi-app 參數添加到您的 WSGIDaemonProcess 配置中。

  2. 我們發現我們的 python/Django 應用程序中有一些可怕的部分導致 mod_wsgi 程序膨脹到 600M。執行其中的 5 個會在我們的 VPS 上消耗 3G 的記憶體並讓它非常難過。

  3. 我們將 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 郵件列表。

我還建議您觀看/閱讀:

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