Мы размещаем наш веб-сервис на выделенном сервере. В период высокой нагрузки сервер очень часто возвращает ошибку тайм-аута вместо страницы. У нас около 170 000 запросов в день. Однако на сервере много свободной памяти, а ЦП в данный момент не загружен.
Не могу понять, почему сервер плохо работает.
Я проанализировал проблемный случай с помощью утилиты tcpdump. Это хорошие и плохие сеансы, отслеживаемые tcpdump. Запрос одинаковый в обоих экспериментах. Хорошо - сервер возвращает ответ. Плохо - нет ответа, ошибка тайм-аута.
Вы понимаете, почему проблема возникает из этих данных? Как я могу двигаться дальше, чтобы приблизиться к источнику ошибки?
Я заменил свой реальный IP-адрес на 123.45.67.890
---- Bad ----
12:23:36.366292 IP 123.45.67.890.61749 > myserver.superbservers.com.www: S 2125316338:2125316338(0) win 8192 <mss 1460,nop,wscale 2,nop,nop,sackOK>
12:23:39.362394 IP 123.45.67.890.61749 > myserver.superbservers.com.www: S 2125316338:2125316338(0) win 8192 <mss 1460,nop,wscale 2,nop,nop,sackOK>
12:23:45.365567 IP 123.45.67.890.61749 > myserver.superbservers.com.www: S 2125316338:2125316338(0) win 8192 <mss 1460,nop,nop,sackOK>
--------
---- Good ----
12:27:07.632229 IP 123.45.67.890.63914 > myserver.superbservers.com.www: S 3581365570:3581365570(0) win 8192 <mss 1460,nop,wscale 2,nop,nop,sackOK>
12:27:10.620946 IP 123.45.67.890.63914 > myserver.superbservers.com.www: S 3581365570:3581365570(0) win 8192 <mss 1460,nop,wscale 2,nop,nop,sackOK>
12:27:10.620969 IP myserver.superbservers.com.www > 123.45.67.890.63914: S 2654770980:2654770980(0) ack 3581365571 win 5840 <mss 1460,nop,nop,sackOK,nop,wscale 6>
12:27:10.838747 IP 123.45.67.890.63914 > myserver.superbservers.com.www: . ack 1 win 4380
12:27:10.957143 IP 123.45.67.890.63914 > myserver.superbservers.com.www: P 1:213(212) ack 1 win 4380
12:27:10.957152 IP myserver.superbservers.com.www > 123.45.67.890.63914: . ack 213 win 108
12:27:10.965543 IP myserver.superbservers.com.www > 123.45.67.890.63914: P 1:630(629) ack 213 win 108
12:27:10.965621 IP myserver.superbservers.com.www > 123.45.67.890.63914: F 630:630(0) ack 213 win 108
12:27:11.183540 IP 123.45.67.890.63914 > myserver.superbservers.com.www: . ack 631 win 4222
12:27:11.185657 IP 123.45.67.890.63914 > myserver.superbservers.com.www: F 213:213(0) ack 631 win 4222
12:27:11.185663 IP myserver.superbservers.com.www > 123.45.67.890.63914: . ack 214 win 108
--------
Подробности об услуге.
Это служба сводки погоды. Он написан на Perl при поддержке MySQL. Скрипт использует несколько модулей (из CPAN и нашего собственного).
Код относительно прост. Скрипт загружает погоду с другого сервера, конвертирует формат данных и возвращает ответ XML. Погода кешируется в MyISAM DB. Существует база данных местоположений мира (INNODB), которую также можно запросить через скрипт.
Это показатели, полученные в период высокой нагрузки.
Средний трафик: 2,5 Мбит / с
Среднее количество пакетов: 3300 пакетов / сек.
Хостер: SuperbHosting
ОС: Ubuntu
Параметры сервера: E6300 CONROE 1.86GHZ 2 X 1MB CACHE 1066 1GB DDR2 667MHZ
Это ссылка на файл конфигурации apache, который мы используем http://repkin5.snow.prohosting.com/apache.txt
Это отчет о состоянии сервера в момент высокой нагрузки http://repkin5.snow.prohosting.com/server-status.htm Из 120 дочерних серверов всего 10, так что места для новых запросов достаточно.
Снимок верхней программы в период высокой нагрузки.
------
top - 13:21:29 up 15 days, 18:36, 1 user, load average: 0.18, 0.19, 0.21
Tasks: 137 total, 1 running, 136 sleeping, 0 stopped, 0 zombie
Cpu(s): 1.8%us, 1.2%sy, 0.0%ni, 92.8%id, 0.7%wa, 0.0%hi, 3.5%si, 0.0%st
Mem: 1033904k total, 590620k used, 443284k free, 6892k buffers
Swap: 3028212k total, 82556k used, 2945656k free, 64156k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
4252 mysql 20 0 162m 48m 3352 S 1 4.8 279:01.27 mysqld
14503 www-data 20 0 43280 14m 3824 S 1 1.4 0:00.16 apache2
14577 www-data 20 0 43012 13m 3500 S 1 1.4 0:00.06 apache2
14401 www-data 20 0 45076 17m 4340 S 0 1.8 0:00.46 apache2
14414 www-data 20 0 45516 18m 4344 S 0 1.8 0:00.47 apache2
14420 www-data 20 0 45624 18m 4372 S 0 1.8 0:00.61 apache2
14421 www-data 20 0 45488 18m 4352 S 0 1.8 0:00.42 apache2
14496 www-data 20 0 44820 17m 4328 S 0 1.7 0:00.18 apache2
14510 www-data 20 0 45216 17m 4300 S 0 1.8 0:00.62 apache2
1 root 20 0 2844 456 404 S 0 0.0 0:05.24 init
2 root 15 -5 0 0 0 S 0 0.0 0:00.00 kthreadd
3 root RT -5 0 0 0 S 0 0.0 0:00.24 migration/0
4 root 15 -5 0 0 0 S 0 0.0 32:28.85 ksoftirqd/0
5 root RT -5 0 0 0 S 0 0.0 0:00.77 watchdog/0
6 root RT -5 0 0 0 S 0 0.0 0:00.15 migration/1
7 root 15 -5 0 0 0 S 0 0.0 0:03.07 ksoftirqd/1
8 root RT -5 0 0 0 S 0 0.0 0:00.63 watchdog/1
-----
Есть целый ряд (<- каламбур) причин, по которым Apache может не отвечать. В качестве отправной точки я бы посмотрел на статус сервера, если у вас есть mod_status включен и посмотрите, сколько процессов запущено, и выглядят ли они занятыми или нет. Эта страница - хорошее первое место для просмотра вещей, которые вы могли бы попробовать, если окажется, что у вас есть проблемы с дочерними процессами.
Иногда кажется, что ваш сервер MySQL усердно работает (но не на скриншоте) из-за высокой загрузки процессора. Проверьте, какие запросы выполняются, выполнив SHOW PROCCESSLIST;
в командной строке MySQL.
Также попробуйте активировать Статус сервера страница в Apache. С участием ExtendedStatus On
он предоставит вам информацию о том, какие страницы загружаются в это время, и вы увидите, сколько открытых «слотов» у вас осталось в Apache.
По умолчанию в Apache mpm-prefork должно быть не более 250 процессов, то есть вы можете обрабатывать 250 одновременных загрузок файлов. Это может вызвать много проблем, если у вас много посетителей, особенно если у вас KeepAlive
активирован. Вы увидите на своей странице состояния сервера, если это ваша проблема.
Верхний снимок экрана показывает, что ваш сервер MySQL вообще не работает! (Извините, Эмиль, но вам нужно прочитать это более внимательно или узнать больше о вершине).
И в списке всего 8 процессов apache.
И средняя загрузка составляет 0,2 при 93% простоя процессора - эта машина ничего не делает.
Половина конфига отсутствует в опубликованной ссылке, но похоже, что она разветвлена.
Мое первое предположение заключается в том, что для MaxServers установлено какое-то дурацкое значение вроде 10 (в зависимости от того, как выглядит ваше приложение, оно должно быть в районе 100-200).
Вы также можете проверить глупые вещи, такие как обратный поиск по входящим соединениям или установленный mod_ident (хорошо, это не всегда глупо - но следует использовать с крайним изнеможением).
Безусловно, установка mod_status и включение расширенного статуса даст гораздо лучшее представление о том, что здесь происходит.
С.
Karl B прав. Страница статуса Apache вам очень поможет. Проверьте, не занесен ли запрос в журнал ошибок. Возможно, количество активных запросов достигло максимального количества, указанного в файле конфигурации apache. Посмотрите, больше ли MaxClients, чем:
sudo netstat -tnp|egrep -c 'apache|http'
Можете попробовать флудить ping (ping -f) сервер? Я предполагаю, что есть проблема с оборудованием, связанная с сетевым подключением, поскольку ваш сервер, похоже, не отвечает на пакеты SYN достаточно быстро.