Есть web-сервер на CentOS 6.5 с такой вот связкой.
Nginx - frontend
Apache ITK - backend
PHP 5.3
APC Cache
MySQL 5.1
По конфигурации железа у него CPU 2x2400 МГц, и RAM 2Гб. Проработал меньше недели и повалились 504, 502 и 500 ошибки (в основном при обходе различными поисковыми ботами). Основная беда - сжераются все ресурсы процессора сервисом httpd.itk.
Конфиг httpd.conf
[console]Timeout 30
KeepAlive Off
KeepAliveTimeout 2
<IfModule itk.c>
StartServers 3
MinSpareServers 3
MaxSpareServers 5
ServerLimit 25
MaxClients 25
MaxRequestsPerChild 250
</IfModule>[/console]
Что делать, куда копать? И nginx используется как фронт-енд, и кеш APC активирован. И все равно не спасает. Заранее благодарен за помощь!
П.С.: в сутки на этом сервере 10000+ просмотров страниц.
Оптимизация LAMP на CentOS 6.5
Покажите вывод
top -bn 1 | head -n 20504, 502 и 500
500 ошибка вряд ли связана с тормозами, скорее косяк в настройках (в том числе htaccess) или скриптах.
Самое смешное, что возникает только при жестком обходе google bot (материалов на сайте 5k+), 1-2 ошибки раз в три дня, причем если перейти по url из отчета - все ок, их нет.
[console]top -bn 1 | head -n 20
top - 20:02:35 up 1 day, 21:07, 1 user, load average: 0.32, 0.39, 0.44
Tasks: 97 total, 2 running, 94 sleeping, 1 stopped, 0 zombie
Cpu(s): 13.9%us, 3.8%sy, 0.0%ni, 79.6%id, 2.3%wa, 0.0%hi, 0.0%si, 0.4%st
Mem: 1922360k total, 1441308k used, 481052k free, 97728k buffers
Swap: 524280k total, 0k used, 524280k free, 1106168k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2001 user 20 0 677m 37m 4068 R 65.6 2.0 0:00.33 httpd.itk
1059 mysql 20 0 1143m 40m 6412 S 9.9 2.2 109:01.19 mysqld
1 root 20 0 19232 1540 1260 S 0.0 0.1 0:00.42 init
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd
3 root RT 0 0 0 0 S 0.0 0.0 0:00.01 migration/0
4 root 20 0 0 0 0 S 0.0 0.0 0:02.18 ksoftirqd/0
5 root RT 0 0 0 0 S 0.0 0.0 0:00.00 migration/0
6 root RT 0 0 0 0 S 0.0 0.0 0:00.47 watchdog/0
7 root RT 0 0 0 0 S 0.0 0.0 0:00.02 migration/1
8 root RT 0 0 0 0 S 0.0 0.0 0:00.00 migration/1
9 root 20 0 0 0 0 S 0.0 0.0 0:01.82 ksoftirqd/1
10 root RT 0 0 0 0 S 0.0 0.0 0:00.38 watchdog/1
11 root 20 0 0 0 0 S 0.0 0.0 0:30.55 events/0[/console]
Самое смешное, что возникает только при жестком обходе google bot (материалов на сайте 5k+), 1-2 ошибки раз в три дня, причем если перейти по url из отчета - все ок, их нет.
А время возникновения ошибок случаем не одинаковое?
Неа, в error log апача тоже чисто. Чепуха какая-то. По тюнингу httpd.itk тоже достаточной информации не обнаружил, как будто у всех из коробки нормально работает. Я вообще не могу назвать 10-15k хостов в стуки сильной нагрузкой. Обычный средний показатель. Я пока вижу решение - увеличить количество ядер процессора. Но мне кажется что это не единственное решение.
Я пока вижу решение - увеличить количество ядер процессора.
Я вообще не уверен, что это решение. Надо сначала найти причину тормозов.
Возможно, что у вас в скриптах дергается какой-то сторонний сервис, который периодически отваливается.
По тюнингу httpd.itk тоже достаточной информации не обнаружил, как будто у всех из коробки нормально работает.
mpm-itk практически аналогичен mpm-prefork. Соответственно рекомендации одинаковые.
Я вообще не уверен, что это решение. Надо сначала найти причину тормозов.
Возможно, что у вас в скриптах дергается какой-то сторонний сервис, который периодически отваливается.
На сервере крутится только nginx, https.itk+apc+php, mqsql, cron для бакапа и удаления tmp-файлов цмски. В каком направлении копать не подскажите? Никаких панелей управления тоже на сервере нет.
mpm-itk практически аналогичен mpm-prefork. Соответственно рекомендации одинаковые.
Спасибо! Значит пока тюнинг mpm-itk и mysql. Пока размер бд ~150Мб, думаю mysql-сервер нет смысла выносить на физически отдельный сервер.
cron для бакапа
Кстати бекап может быть причиной тормозов. Я потому и спрашивал о времени появления ошибок. Хотя с таким объемом базы это сомнительно.
В каком направлении копать не подскажите?
Копайте в направлении систем мониторинга. Zabbix, Nagios, Munin и иже с ними. Вам нужны данные, чтобы выяснить, что происходит с системой, когда сервер перестает отвечать.
Ну и вариант с обращениями к сторонним ресурсам стоит проверить, такое бывает довольно часто. Можно попробовать задать default_socket_timeout = 1 в php.ini.
Пока размер бд ~150Мб, думаю mysql-сервер нет смысла выносить на физически отдельный сервер.
Даже если база вырастет до пары гигабайт, проще и дешевле будет памяти побольше воткнуть, чем выносить БД на отдельный сервер.
Спасибо, о результатах отпишусь!
Даже если база вырастет до пары гигабайт, проще и дешевле будет памяти побольше воткнуть, чем выносить БД на отдельный сервер.
это не лучший вариант.
Что делать, куда копать? И nginx используется как фронт-енд, и кеш APC активирован. И все равно не спасает. Заранее благодарен за помощь!
менять архитектуру, на одном ПК все это не потянет.
1-node: nginx+php+apache-backend(хотя его также лучше вынести на отдульную ноду)
2-node: mysql
менять архитектуру, на одном ПК все это не потянет.
Простите, но бугага (=
Простите, но бугага (=
троллим по тихоньку? )
Докладываю обстановку. Добавил в iptables ограничение 30 коннектов с одного ip, пока полет нормальный:
[console]-A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 30 -j REJECT[/console]
Решил устроить тест с имитацией запросов. На одном сервере выполнил команду, 30 запросов в 30 потоков:
[console]ab -n 30 -c 30 вебморда[/console]
Параллельно на испытуемом выполнил следующее
[console]netstat -anp | grep ':80' | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n[/console]
И в списке с IP увидел сервер с которого выполнялась имитация нагрузки с числом коннектов 40. Какого черта, если в iptables я указал ограничение в 30 коннектов?
И в списке с IP увидел сервер с которого выполнялась имитация нагрузки с числом коннектов 40. Какого черта, если в iptables я указал ограничение в 30 коннектов?
В каких состояниях висят соединения? Емнип connlimit не учитывает соединения в TIME_WAIT.
[quote="bestel"]И в списке с IP увидел сервер с которого выполнялась имитация нагрузки с числом коннектов 40. Какого черта, если в iptables я указал ограничение в 30 коннектов?
В каких состояниях висят соединения? Емнип connlimit не учитывает соединения в TIME_WAIT.[/quote]
Если выполнить:
[console]netstat -anp | grep ':80' | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n[/console]
То оно выдает некое подобие таблицы с колонками кол. подключений и ip-хоста, и никаких состояний.
То оно выдает некое подобие таблицы с колонками кол. подключений и ip-хоста, и никаких состояний.
Естественно, состояния-то вы отрезали с помощью awk.
Попробуйте так
[console]netstat -anp | grep -v TIME_WAIT | grep ':80' | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n[/console]
или
[console]netstat -anp | grep ':80' | awk '{print $6, $5}' | cut -d: -f1 | sort | uniq -c | sort -n[/console]