У нас есть 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
Разбивка процессов:
Если вы используете опцию display-name для WSGIDaemonProcess, то некоторые инструменты, такие как полученная из BSD команда ps и htop, будут отображать указанное вами имя, а не apache2. Таким образом вы сможете определить, какие процессы демона mod_wsgi запускают ваше веб-приложение.
Чтобы сделать дополнительные выводы, вам нужно будет показать, какую конфигурацию mod_wsgi вы используете. Прямо сейчас похоже, что у вас плохая конфигурация даже с настройками MPM, так как работа с таким низким числом потоков и предпочтение процессов при использовании рабочего Apache MPM не имеет большого смысла.
В любом случае, StackOverflow - это не форум, и, как следствие, это действительно плохое место, чтобы попытаться провести долгое обсуждение, чтобы помочь разобраться в вашей конфигурации. Вам лучше использовать список рассылки mod_wsgi.
Также предлагаю посмотреть / прочитать: