Почему Apache замедляется в одночасье?

Приветствую экспертов,

На моем выделенном сервере CentOS 5.4 я настраиваю apache с дюжиной виртуальных хостов. Я тестирую несколько из них, каждый загружается в течение секунды; довольно быстро Средняя нагрузка меньше 1. Никаких проблем. Я использую статические HTML-сайты, один блог на WordPress с MySQL 5.0... это не сайты с высокой пропускной способностью; ничего, что могло бы подчеркнуть этот сервер.

На следующее утро я вхожу на работу, загружаю основной сайт, и загрузка занимает от 10 до 20 секунд. Я проверяю среднюю нагрузку на сервер, и она колеблется около 3, иногда до 5, однажды увидела ее в 8, а не ниже 2. В этот момент я грациозно отказов Apache:

# apachectl -k graceful

Займет примерно полминуты, потом все снова хорошо. Все виртуальные хосты загружаются быстро, менее чем за секунду. Средняя нагрузка быстро опускается ниже 1.

При проверке / состоянии сервера не так много происходит; при проверке сетевого трафика (vnstat -l или же vnstat -h), не так много пропускной способности. Оба сопоставимы в начале дня и в конце. Тем не менее, когда я проверяю это утром, Apache намного, намного медленнее, чем почти весь день. Что происходит в одночасье, чтобы заставить Apache так сильно замедляться и потреблять намного больше системных ресурсов?

# httpd -V
Server version: Apache/2.2.3
# uname -a
Linux myserver.com 2.6.18-92.el5 #1 SMP Tue Jun 10 18:51:06 EDT 2008 x86_64 x86_64 x86_64 GNU/Linux
# free
             total       used       free     shared    buffers     cached
Mem:       1025576    1017292       8284          0       8208      43160
-/+ buffers/cache:     965924      59652
Swap:      2096472     361012    1735460

Я полагаю, я мог бы создать cronjob, который изящно подпрыгивал apache ежедневно, но это похоже на быстрое и грязное решение. Я лучше найду причину и исправлю это.

ОБНОВЛЕНИЕ 2009-10-28 14:38; образцы берут каждые 10 секунд в течение пяти минут со средним значением:

$ sar -W 10 30 && date
Linux 2.6.18-92.el5 (myserver.com)   10/28/2009

02:32:36 PM  pswpin/s pswpout/s
02:32:46 PM     10.31     30.43
02:32:56 PM      2.30     32.93
02:33:06 PM     21.56      0.00
02:33:16 PM      1.80      0.00
02:33:26 PM      5.69     26.67
02:33:36 PM      0.10      0.00
02:33:46 PM     25.70      7.60
02:33:56 PM     10.61      7.11
02:34:06 PM      4.10      2.60
02:34:16 PM      0.70      0.00
02:34:26 PM      0.00      0.00
02:34:36 PM      0.00      0.00
02:34:46 PM      3.80      0.00
02:34:56 PM      0.00      0.00
02:35:06 PM      0.00     11.01
02:35:16 PM      7.70     30.30
02:35:26 PM     20.32      0.00
02:35:36 PM      1.60      0.00
02:35:46 PM     11.60      0.00
02:35:56 PM      2.50      0.00
02:36:06 PM      0.00      0.00
02:36:16 PM      3.60      0.00
02:36:26 PM      0.00      0.00
02:36:36 PM      0.00      0.00
02:36:46 PM      0.00      0.00
02:36:56 PM    445.20     56.60
02:37:06 PM      0.00      0.00
02:37:16 PM      0.00      0.00
02:37:26 PM      0.00      0.00
02:37:36 PM      0.00      0.00
Average:        19.31      6.84
Wed Oct 28 14:37:36 PDT 2009

Любопытно, что Apache не медленный этим утром. Я внес некоторые изменения в число запущенных серверов, количество резервных серверов, максимальное количество серверов и т. Д. Вчера. Позвольте мне получить старые значения и сравнить...

Исходные значения из /etc/httpd/conf/httpd.conf:

StartServers      20
MinSpareServers   20
MaxSpareServers  120
ServerLimit      256
MaxClients       256
MaxRequestsPerChild  4000

Новые значения, которые, по всей видимости, работают нормально:

StartServers     30
MinSpareServers  30
MaxSpareServers  40
ServerLimit      50
MaxClients       50
MaxRequestsPerChild  4000

Я, вероятно, продолжу немного дорабатывать эти настройки, но, похоже, сейчас они работают хорошо.

Сар командует снова этим утром:

$ sar -W 10 30 && date
Linux 2.6.18-92.el5 (myserver.com)   10/29/2009

09:31:09 AM  pswpin/s pswpout/s
09:31:19 AM      5.80     54.40
09:31:29 AM     62.10      0.00
09:31:39 AM      0.00      0.00
09:31:49 AM      0.00      0.00
09:31:59 AM      0.00      0.00
09:32:09 AM      3.30      0.00
09:32:19 AM      2.70      0.00
09:32:29 AM      0.00      0.00
09:32:39 AM      0.00      0.00
09:32:49 AM      0.00      0.00
09:32:59 AM      3.10      0.00
09:33:09 AM      5.80      0.00
09:33:19 AM      0.00      0.00
09:33:29 AM      0.00      0.00
09:33:39 AM      0.00      0.00
09:33:49 AM      0.00      0.00
09:33:59 AM      0.00      0.00
09:34:09 AM      0.00      0.00
09:34:19 AM      0.00      0.00
09:34:29 AM      0.00      0.00
09:34:39 AM      4.00      0.00
09:34:49 AM      0.10      0.00
09:34:59 AM      0.00      0.00
09:35:09 AM      4.80      0.00
09:35:19 AM      0.00      0.00
09:35:29 AM    291.29      0.00
09:35:39 AM      0.00      0.00
09:35:49 AM      0.80      0.00
09:35:59 AM      0.00      0.00
09:36:09 AM      0.00      0.00
Average:        12.78      1.81
Thu Oct 29 09:36:09 PDT 2009

Среднее на самом деле ниже! И сервер получил больше трафика, чем вчера. Womble, кажется, ты был прав! И теперь во Вселенной все хорошо.

Джон Гарденье, хорошая идея! У него есть -o [filename] переключиться только для этого. Спасибо за чаевые!

Джереми Виссер, dstat это действительно сладкий инструмент! Спасибо за чаевые! Не было установлено, пришлось yum install dstat,

2 ответа

Решение

На основании вашего free Вывод, я сильно подозреваю, что ваши процессы Apache сильно закопаны в swap. Выход из sar -W 1 0 подтвердит (или опровергнет) эту гипотезу (запустит ее, когда машина работает медленно).

Если процессы Apache не все фактически обслуживают запросы (как показано mod_status), вы должны настроить количество "запасных" дочерних элементов (с MaxSpareServers), чтобы они быстрее получали (и, следовательно, не занимали много памяти). Если вам действительно нужно количество детей, на которых вы работаете, чтобы обслуживать нагрузку запроса, вам потребуется больше оперативной памяти (я бы выбрал еще 1 ГБ; оперативная память дешевая, а время диагностики - нет).

Какой процесс (ы), который пожирает всю память? Попробуйте iostat / vmstat до перезапуска любого apache - это может быть проблемой ввода-вывода.

Для мониторинга трендов я советую использовать munin / colectd (у них есть даже очень полезные плагины apache (особенно для вашего случая)).

Другие вопросы по тегам