Apache 进程数超过 MaxClients

Apache 进程数超过 MaxClients

我们使用 worker MPM 运行 Apache,并将 MaxClients 设置为 6,但当我打开 top 时,我可以看到有 6 个以上的 Apache 进程正在运行。下面的屏幕转储中可以看到 13 个。有人能解释一下吗?还有一个来自 /server-status/ 的屏幕转储,大约在同一时间拍摄。在我们的正常负载下,似乎一次有 2-6 个请求在处理,所以我希望看到 top 中运行许多 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 进程的数量。

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) 确定 top 将 mod_wsgi 进程报告为 apache2。要更正此问题,请将 display-name=my-mod-wsgi-app 参数添加到 WSGIDaemonProcess 配置中。

2) 我们发现我们的 python/Django 应用程序中有一些可怕的部分,导致 mod_wsgi 进程膨胀到 600M。运行其中 5 个会消耗我们 VPS 上的 3G 内存,这让人非常沮丧。

3) 我们在 WSGIDaemonProcess 配置中添加了 inactivity-timeout=300 和 maximum-requests=200,这样当某个进程未被使用或者收到超过 500 个请求时,mod_wsgi 就能很好地自行重新启动,从而使我们超重、混乱的 Django 应用程序能够顺利运行。

感谢 Graham 引导我朝这个方向前进。您可以在 mod_wsgi Google 群组上阅读我对此问题的讨论。https://groups.google.com/forum/#!topic/modwsgi/wYScZlqgjgA

答案1

流程细分如下:

  • 一个 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 邮件列表。

我还建议您观看/阅读:

相关内容