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

Почему apache за ночь тормозит?

Приветствую знатоков,

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

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

# apachectl -k graceful

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

При проверке / server-status ничего не происходит; при проверке сетевого трафика (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 ежедневно, но это кажется быстрым и грязным решением. Я лучше найду причину и исправлю это.

ОБНОВЛЕНИЕ 28.10.2009 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:

$ 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

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

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

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

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

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

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

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