Apache 2.2 в конечном итоге использует всю память (worker mpm)

Apache 2.2 в конечном итоге использует всю память (worker mpm)

Я настраиваю сервер Apache 2.2 (он используется совместно с MySQL + Courier + Mongo + Postgre). Сервер — это «голое железо» (без виртуализации) с двумя четырехъядерными Xeon (всего 16 ядер) и 12 ГБ ECC RAM (обновление до 24 ГБ в ближайшие дни). В MySql innodb_buffer установлен на 2G, и все работает нормально. Mongo и Postgre почти не трогаются — только для разработки.

Проблема в том, что Apache съедает всю доступную память, в конечном итоге используя весь своп (и, следовательно, приводит к краху MySql, поскольку он использует больше памяти). У нас есть Apache 2.2 с worker MPM и mod_security. Всякий раз, когда мы его перезапускаем, у нас остается около 8 ГБ свободной оперативной памяти.

Я пытаюсь понять несколько вещей:

  • Какова связь между процессами, показанными в, topи рабочими серверами? Я ожидал увидеть не более 10 процессов (как ServerLimit в настройках рабочего процесса - не принимая во внимание основной процесс).
  • Объем памяти RES используется для каждого ПОТОКА или для каждого ПРОЦЕССА?
  • В выводе mod_status ниже есть много запросов READING, которые остаются там в течение длительного времени. Я пробовал включить ExtendedStatus, чтобы узнать, какие клиенты там есть, но не смог найти никакой полезной информации - есть какие-нибудь предложения?
  • при фактическом использовании памяти, какой объем оперативной памяти мне понадобится для обслуживания 400 одновременных подключений? (поскольку статус мода показывает, что 250 уже исчерпаны)
  • как насчет повышения ThreadsPerChild вместо повышения MaxClients/ServerLimit?
<IfModuleработник.c>
StartServers 2
МаксКлиенты 250
MinSpareThreads 25
Макс.СвободныеПотоки 75
ThreadsPerChild 25
МаксЗапросовНаРебенка 0
ServerLimit 10
</ЕслиМодуль>

ТОП-шоу (только для Apache):

вверх - 16:30:21 вверх 46 дней, 23:12, 2 пользователя, средняя загрузка: 0.94, 0.97, 1.31
Задания: всего 460, 1 работает, 459 спит, 0 остановлено, 0 зомби
ЦП: 2.8%us, 0.5%sy, 0.0%ni, 96.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Память: всего 12187448 КБ, использовано 10686748 КБ, свободно 1500700 КБ, буферы 67104 КБ
Своп: 1048568k всего, 275904k использовано, 772664k свободно, 2371208k кэшировано

  PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ КОМАНДА
24252 wwwrun 20 0 2216м 161м 7484 S 20.2 1.4 0:09.25 httpd
24750 wwwrun 20 0 1264m 51m 6196 S 9.9 0.4 0:00.93 httpd
23996 wwwrun 20 0 2136м 279м 7292 S 6.0 2.4 0:16.76 httpd
23326 wwwrun 20 0 2216м 276м 7376 S 2.7 2.3 0:16.81 httpd
23582 wwwrun 20 0 2208м 293м 7132 S 2.3 2.5 0:27.30 httpd
23688 wwwrun 20 0 1904m 208m 7304 S 1.0 1.8 0:13.62 httpd
19507 wwwrun 20 0 2182m 229m 8096 S 0.7 1.9 0:18.65 httpd
23616 wwwrun 20 0 1908m 239m 7092 S 0.7 2.0 0:18.48 httpd
18304 wwwrun 20 0 2160м 334м 11м S 0.3 2.8 0:47.38 httpd
23637 wwwrun 20 0 1830м 231м 7556 S 0.3 1.9 0:20.56 httpd
24457 wwwrun 20 0 2196м 174м 6568 S 0.3 1.5 0:04.11 httpd
15694 wwwrun 20 0 2199m 295m 7504 S 0.0 2.5 0:20.54 httpd
15783 wwwrun 20 0 2172m 244m 10m S 0.0 2.1 0:17.45 httpd
16577 wwwrun 20 0 2128m 354m 7436 S 0.0 3.0 0:28.21 httpd
18290 wwwrun 20 0 277m 9880 964 S 0.0 0.1 0:00.05 httpd
18379 wwwrun 20 0 2208m 211m 6864 S 0.0 1.8 0:08.57 httpd
18480 wwwrun 20 0 2096m 305m 7540 S 0.0 2.6 0:17.72 httpd
18791 wwwrun 20 0 1920m 251m 7244 S 0.0 2.1 0:20.24 httpd
19348 wwwrun 20 0 2060m 310m 7388 S 0.0 2.6 0:22.07 httpd
19619 wwwrun 20 0 2206m 235m 7340 S 0.0 2.0 0:15.30 httpd
19999 wwwrun 20 0 2178m 144m 7132 S 0.0 1.2 0:05.50 httpd
20697 wwwrun 20 0 2002m 193m 7276 S 0.0 1.6 0:08.12 httpd
20838 wwwrun 20 0 1890м 127м 7260 S 0.0 1.1 0:07.44 httpd
21407 wwwrun 20 0 1988m 290m 7708 S 0.0 2.4 0:39.33 httpd
22252 wwwrun 20 0 2216m 295m 7732 S 0.0 2.5 0:27.04 httpd
22723 wwwrun 20 0 2020м 187м 7444 S 0.0 1.6 0:39.80 httpd
22753 wwwrun 20 0 1850m 206m 7448 S 0.0 1.7 0:10.62 httpd
23174 wwwrun 20 0 1990м 229м 7332 S 0.0 1.9 0:07.71 httpd
23383 wwwrun 20 0 1504m 76m 6372 S 0.0 0.6 0:01.25 httpd
23720 wwwrun 20 0 1906m 225m 7080 S 0.0 1.9 0:20.12 httpd
24778 wwwrun 20 0 970m 30m 5604 S 0.0 0.3 0:00.80 httpd

Наконец, вывод mod_status:

   Версия сервера: Apache/2.2.23 (Unix) mod_ssl/2.2.23 OpenSSL/1.0.0-fips Домен-сервер PHP/5.3.24 с Suhosin-Patch mod_perl/2.0.5
          Perl/v5.10.1

   Сервер построен: 15 мая 2013 10:17:30
     _____________________________________________________________________________________________________________________________________

   Текущее время: понедельник, 12-мая-2014 16:41:08 BRT
   Время перезапуска: понедельник, 12 мая 2014 г., 15:36:37 по бразильскому времени
   Генерация родительского сервера: 1
   Время работы сервера: 1 час 4 минуты 31 секунда
   Всего доступов: 36446 - Общий трафик: 1,6 ГБ
   Загрузка ЦП: u213.3 s13.65 cu0 cs0 - 5,86% загрузки ЦП
   9,42 запроса/сек - 442,8 кБ/сек - 47,0 кБ/запрос
   249 запросов в настоящее время обрабатываются, 0 простаивающих работников

WWRRRKRKRRRRRRRRRWRRWWWWRWCRR.....................................
РВВВРРРРРККРКРВРРРРРВР.....................................
WRWRCRRRWRRWWRKRRWWRRRWWW.....................................
WRWKKWWWRWKRRWRCRRRWWWWWW.....................................
WRWRWCRKCWWWRWWRRWWCRRWW.....................................
WRWKRWRRKKRKRRRRCWWKWWWRW.....................................
RWWKWRRWKRRRWRRWWCRRRRRRW.....................................
WWRRRWRKWWWKRWWWWWWWWKRRW.....................................
РРРРРРК.ВКРРРВКРРРРРКР.......................................
KCRRRRWRWKRWWWRRKWRWRWRK.....................................

Обновление 1:

Я пробовал отключать mod_security2, экспериментировал с настройками рабочих процессов, но в итоге Apache стал потреблять почти 20 ГБ оперативной памяти (я добавил файл подкачки объемом 13 ГБ, чтобы предотвратить сбой сервера).

Наконец, я отключил KeepAlive и оставил MaxRequestsPerChild равным 100 — теперь Apache использует 2-3G, и запросы очищаются, как показано ниже:

   Текущее время: Вторник, 13-мая-2014 17:07:48 BRT
   Время перезапуска: вторник, 13 мая 2014 г., 16:49:14 по бразильскому времени
   Генерация родительского сервера: 0
   Время работы сервера: 18 минут 33 секунды
   Всего доступов: 6637 - Общий трафик: 133,2 МБ
   Загрузка ЦП: u34.43 s3.05 cu0 cs0 - 3,37% загрузки ЦП
   5,96 запросов/сек - 122,5 кБ/сек - 20,5 кБ/запрос
   В настоящее время обрабатывается 14 запросов, 86 бездействующих работников

..................Р.............................................
_RR__R_R__RC_RWC___________________..............
R_WC__R___R__________________________________________________..............
................................................................
................................................................
................................................................
................................................................
................................................................
................................................................
................................................................

решение1

KeepaliveTimeoutпоможет сократить количество висящих «прочитанных» работников.

MPM использует несколько процессов с несколькими потоками для обработки входящего трафика, поэтому вы видите обычную работу Apache.

Эта настройка по умолчанию может лучше подойти для ваших нужд:

ServerLimit 12
StartServers 2
MaxClients 500
MinSpareThreads 25
MaxSpareThreads 50
ThreadsPerChild 50

Это приведет к появлению в общей сложности 10 процессов ( MaxClients/ ThreadsPerChild), что значительно сократит объем памяти вашего сервера. Вы можете позволить себе больше потоков в меньшем количестве процессов из-за доступности ЦП.

Обратите внимание, что для изменения этих переменных необходимо полностью остановить Apache и затем перезапустить его.

решение2

Какова связь между процессами, показанными сверху, и рабочими серверами? Я ожидал увидеть максимум 10 процессов (как ServerLimit в настройках рабочего процесса — не принимая во внимание основной процесс).

Это не похоже на topсервер Apache, на котором запущен MPM-воркер. Я запускаю два сервера, один с MPM-воркером, а другой с MPM-воркером prefork. С worker topпроцессы Apache перечислены как httpd.worker, а количество процессов соответствует количеству активных серверов (линии точек с некоторыми записями без точек), видимых через mod_status. С prefork процессы перечислены как httpd, а количество примерно соответствует количеству бездействующих/активных воркеров (каждая запись без точек).

Итак, учитывая этот вывод mod_status:

..................R.............................................
..............._RR__R_R__RC_RWC__...............................
R_WC__R___R_....................................................
................................................................
................................................................
................................................................
................................................................
................................................................
................................................................
................................................................

topна сервере, на котором запущен prefork, должно отображаться около 31 httpdпроцесса, а topна сервере, на котором запущен worker, должно отображаться 3 httpd.workerпроцесса.

Связанный контент