Apache 2.2 со временем использует всю память (рабочий mpm)
Я настраиваю сервер Apache 2.2 (он используется совместно с MySQL + Courier + Mongo + Postgre). Сервер является "голым железом" (без виртуализации) с 2 четырехъядерными процессорами Xeon (всего 16 ядер) и 12 ГБ ОЗУ ECC (в ближайшие дни будет обновлено до 24 ГБ). MySql имеет innodb_buffer, установленный на 2G, и работает нормально. Монго и Постгре почти не затронуты - только для развития.
Проблема в том, что Apache съедает всю доступную память, в конечном итоге используя весь обмен (и, следовательно, сбой MySql, так как он использует больше памяти). У нас есть Apache 2.2 с рабочим MPM и mod_security. Всякий раз, когда мы перезапускаем его, у нас есть приблизительно 8G свободной оперативной памяти.
Я пытаюсь понять несколько вещей:
- Какова связь между процессами, показанными в
top
с рабочими серверами? Я ожидал увидеть не более 10 процессов (как ServerLimit в рабочих настройках - без учета основного процесса). - Используется ли объем памяти RES для каждой НИТИ или для каждого ПРОЦЕССА?
- В приведенном ниже выводе mod_status есть много запросов READING, которые остаются там в течение длительного времени. Я пытался включить ExtendedStatus, чтобы узнать, какие клиенты есть, но я не смог найти полезную информацию - какие-либо предложения?
- с фактическим использованием памяти, какой объем оперативной памяти мне понадобится для обслуживания 400 одновременных подключений? (так как статус мода показывает 250 уже истощенных)
- а как насчет того, чтобы поднять ThreadsPerChild вместо MaxClients / ServerLimit?
StartServers 2 MaxClients 250 MinSpareThreads 25 MaxSpareThreads 75 ThreadsPerChild 25 MaxRequestsPerChild 0 ServerLimit 10 IfModule>
ТОП-шоу (только для apache):
вверх - 16:30:21 до 46 дней, 23:12, 2 пользователя, средняя загрузка: 0,94, 0,97, 1,31 Задачи: всего 460, 1 работает, 459 спит, 0 остановлено, 0 зомби-процессоров: 2,8% нас 0,5%sy, 0,0% ni, 96,7% id, 0,0% wa, 0,0% hi, 0,0% si, 0,0% st Mem: всего 12187448k, использовано 10686748k, свободно 1500700k, буферов 67104k. Замена: всего 1048568k, использовано 275904k, 772664k свободный, 2371208k кэшированный PID PR пользователя NIR VIRT RES SHR S %CPU %MEM TIME+ КОМАНДА 24252 wwwrun 20 0 2216m 161m 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 2216m 276m 7376 S 2.7 2,3 0: 16,81 httpd 23582 wwwrun 20 0 2208m 293m 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 18,48 httpd 18304 wwwrun 20 0 2160m 334m 11m S 0,3 2,8 0: 47,38 httpd 23637 wwwrun 20 0 1830m 231 7556 S 0,3 1,9 0: 20,56 httpd 24457 wwwrun 20 0 2196m 174m 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 1890m 127m 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 1850 м 206 м 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 BRT Генерация родительского сервера: 1 Время работы сервера: 1 час 4 минуты 31 секунда Всего обращений: 36446 - Общий трафик: 1,6 ГБ Загрузка процессора: u213,3 с13,65 у.е.0 с0 - 5,86% загрузка процессора 9,42 запросов / сек - 442,8 кБ / сек - 47,2 кБ / запрос 249 запросов в настоящее время обрабатываются, 0 свободных рабочих WWRRKRKRRKRRRRWRRWWWRWCRR....................................... RWWWRRWRRRRKKRKRWRRRRRWWR....................................... WRWRCRRWRRWWRKRRWWRRWRWWW....................................... WRWKKWWWRWKRRWRCRRRWWRWWW....................................... WRWRWCRKCWWWRWWRRWWCRWRWW....................................... WRWKRWRRKKRKRRRRCWWKWWWRW....................................... RWWKWRRWKRRRWRRWWCRRRRRRW....................................... WWWRRWRKWWWKRWWWWRWWWKRRW....................................... RRRRRRRK.WKRRWRWWKRRWRRKR....................................... KCRRRRWRWWKRWWWRRKWRWRWRK.......................................
Обновление 1:
Я попытался отключить mod_security2, поигравшись с рабочими настройками, но в итоге Apache потреблял почти 20 ГБ ОЗУ (я добавил файл подкачки 13 ГБ, чтобы предотвратить сбой сервера).
Наконец, я отключил KeepAlive и сохранил MaxRequestsPerChild на 100 - теперь Apache использует 2-3G, и запросы очищаются, как показано ниже:
Текущее время: вторник, 13 мая 2014 г. 17:07:48 Время перезапуска BRT: вторник, 13 мая 2014 г. 16:49:14 Создание родительского сервера BRT: 0 Время работы сервера: 18 минут 33 секунды Всего обращений: 6637 - всего Трафик: 133,2 МБ Загрузка ЦП: u34,43 с3,05 у.е.0 с0 - 3,37% Загрузка ЦП 5,96 запросов / с - 122,5 КБ / с - 20,5 КБ / с запросом В настоящее время обрабатывается 14 запросов, 86 незанятых рабочих..................Р............................................. ________________RR__R_R__RC_RWC___________________.............. R_WC__R___R_______________________________________.............. ................................................................ ................................................................ ................................................................ ................................................................ ................................................................ ................................................................ ...............................................................
2 ответа
KeepaliveTimeout
помог бы уменьшить зависание "читать" рабочих.
MPM использует несколько процессов с несколькими потоками для обработки входящего трафика, поэтому вы видите обычную работу Apache.
Эта настройка по умолчанию может работать лучше для ваших нужд:
ServerLimit 12
StartServers 2
MaxClients 500
MinSpareThreads 25
MaxSpareThreads 50
ThreadsPerChild 50
Это приведет к появлению 10 процессов (MaxClients
/ ThreadsPerChild
), который значительно уменьшит объем памяти вашего сервера. Вы можете позволить себе больше потоков в меньшем количестве процессов из-за доступности ЦП.
Обратите внимание, что изменение этих переменных требует полной остановки Apache, а затем перезапуска.
Как соотносятся процессы, показанные сверху с рабочими серверами? Я ожидал увидеть не более 10 процессов (как ServerLimit в рабочих настройках - без учета основного процесса).
Это не похоже на top
сервера Apache, на котором работает рабочий MPM. Я использую два сервера: один с рабочим MPM, а другой - с prefork MPM. С рабочим 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
на сервере работающий работник должен показать 3 httpd.worker
процессы.