Приветствую знатоков,
На моем выделенном сервере 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 (особенно для вас)).