Назад | Перейти на главную страницу

Процессы Apache в топе больше, чем MaxClients

У нас есть Apache, работающий с рабочим 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) заставит процессы перерабатывать и освобождать память, но это не так. кажется, что происходит. Мы отслеживаем память процесса apache через New Relic. Когда мы перезапускаем Apache, он потребляет около 550 МБ памяти с нашей конфигурацией ниже. Каждый процесс в конечном итоге разрастется до VIRT: 300m RES: 80m, и, похоже, мы не можем контролировать количество запущенных процессов, поэтому apache переходит с 550M на 5G в течение 12-14 часов и уничтожает нас.

Я проверил каталог /conf.d/, чтобы убедиться, что мы не переопределяем какие-либо настройки в нашей конфигурации apache. Есть ли у кого-нибудь советы по получению контроля над apache? Я знаю, что у нас есть толстое приложение на Python, работающее с mod_wsgi, которое, вероятно, имеет утечки памяти и, безусловно, может быть оптимизировано, но я просто хочу контролировать количество порождаемых процессов 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) Определите, что процессы mod_wsgi сообщались top как apache2. Чтобы исправить это, добавьте параметр display-name = my-mod-wsgi-app в конфигурацию WSGIDaemonProcess.

2) Мы обнаружили, что в нашем приложении python / Django есть ужасная часть, из-за которой процесс mod_wsgi раздувается до 600M. Запуск 5 из них потребовал бы 3G памяти на нашем VPS, и это очень печально.

3) Мы добавили inactivity-timeout = 300 и maximum-requests = 200 в нашу конфигурацию WSGIDaemonProcess, и mod_wsgi прекрасно перезапускается, когда процесс не используется или получает более 500 запросов, что обеспечивает бесперебойную работу нашего избыточного, небрежного приложения Django.

Спасибо Грэхему за то, что начал меня в этом направлении. Вы можете прочитать, как я рассказываю об этой проблеме, в группе googled mod_wsgI. https://groups.google.com/forum/#!topic/modwsgi/wYScZlqgjgA

Разбивка процессов:

  • Один родительский процесс Apache. Если Apache запускается из системных сценариев init.d, то этот процесс будет выполняться от имени «root». Это будет идентификатор родительского процесса для всех остальных процессов.
  • Переменное количество дочерних рабочих процессов Apache. Точное число зависит от настроек Apache MPM и объема трафика, получаемого вашим сайтом. Это зависит от того, что требуется, потому что Apache будет динамически контролировать количество дочерних рабочих процессов.
  • Фиксированное количество процессов режима демона mod_wsgi. Это определяется тем, сколько процессов вы указали в директиве WSGIDaemonProcess.

Если вы используете опцию display-name для WSGIDaemonProcess, то некоторые инструменты, такие как полученная из BSD команда ps и htop, будут отображать указанное вами имя, а не apache2. Таким образом вы сможете определить, какие процессы демона mod_wsgi запускают ваше веб-приложение.

Чтобы сделать дополнительные выводы, вам нужно будет показать, какую конфигурацию mod_wsgi вы используете. Прямо сейчас похоже, что у вас плохая конфигурация даже с настройками MPM, так как работа с таким низким числом потоков и предпочтение процессов при использовании рабочего Apache MPM не имеет большого смысла.

В любом случае, StackOverflow - это не форум, и, как следствие, это действительно плохое место, чтобы попытаться провести долгое обсуждение, чтобы помочь разобраться в вашей конфигурации. Вам лучше использовать список рассылки mod_wsgi.

Также предлагаю посмотреть / прочитать: