1 (20.07.2014 19:09:07 отредактировано bestel)

Есть 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

 Консоль:
Timeout 30
KeepAlive Off
KeepAliveTimeout 2
<IfModule itk.c>
StartServers 3
MinSpareServers 3
MaxSpareServers 5
ServerLimit 25
MaxClients 25
MaxRequestsPerChild 250
</IfModule>

Что делать, куда копать? И nginx используется как фронт-енд, и кеш APC активирован. И все равно не спасает. Заранее благодарен за помощь!

П.С.: в сутки на этом сервере 10000+ просмотров страниц.

Let the metal flow!...

2 (20.07.2014 19:29:23 отредактировано neol)

Покажите вывод

top -bn 1 | head -n 20
bestel пишет:

504, 502 и 500

500 ошибка вряд ли связана с тормозами, скорее косяк в настройках (в том числе htaccess) или скриптах.

3 (20.07.2014 20:27:42 отредактировано bestel)

Самое смешное, что возникает только при жестком обходе google bot (материалов на сайте 5k+), 1-2 ошибки  раз в три дня, причем если перейти по url из отчета - все ок, их нет.

 Консоль:
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

Let the metal flow!...

4

bestel пишет:

Самое смешное, что возникает только при жестком обходе google bot (материалов на сайте 5k+), 1-2 ошибки  раз в три дня, причем если перейти по url из отчета - все ок, их нет.

А время возникновения ошибок случаем не одинаковое?

5 (20.07.2014 20:59:16 отредактировано bestel)

Неа, в error log апача тоже чисто. Чепуха какая-то. По тюнингу httpd.itk тоже достаточной информации не обнаружил, как будто у всех из коробки нормально работает. Я вообще не могу назвать 10-15k хостов в стуки сильной нагрузкой. Обычный средний показатель. Я пока вижу решение - увеличить количество ядер процессора. Но мне кажется что это не единственное решение.

Let the metal flow!...

6

bestel пишет:

Я пока вижу решение - увеличить количество ядер процессора.

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

bestel пишет:

По тюнингу httpd.itk тоже достаточной информации не обнаружил, как будто у всех из коробки нормально работает.

mpm-itk практически аналогичен mpm-prefork. Соответственно рекомендации одинаковые.

7 (20.07.2014 22:23:04 отредактировано bestel)

neol пишет:

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

На сервере крутится только nginx, https.itk+apc+php, mqsql, cron для бакапа и удаления tmp-файлов цмски. В каком направлении копать не подскажите? Никаких панелей управления тоже на сервере нет.

neol пишет:

mpm-itk практически аналогичен mpm-prefork. Соответственно рекомендации одинаковые.

Спасибо! Значит пока тюнинг mpm-itk и mysql. Пока размер бд ~150Мб, думаю mysql-сервер нет смысла выносить на физически отдельный сервер.

Let the metal flow!...

8

bestel пишет:

cron для бакапа

Кстати бекап может быть причиной тормозов. Я потому и спрашивал о времени появления ошибок. Хотя с таким объемом базы это сомнительно.

bestel пишет:

В каком направлении копать не подскажите?

Копайте в направлении систем мониторинга. Zabbix, Nagios, Munin и иже с ними. Вам нужны данные, чтобы выяснить, что происходит с системой, когда сервер перестает отвечать.
Ну и вариант с обращениями к сторонним ресурсам стоит проверить, такое бывает довольно часто. Можно попробовать задать default_socket_timeout = 1 в php.ini.

bestel пишет:

Пока размер бд ~150Мб, думаю mysql-сервер нет смысла выносить на физически отдельный сервер.

Даже если база вырастет до пары гигабайт, проще и дешевле будет памяти побольше воткнуть, чем выносить БД на отдельный сервер.

9

Спасибо, о результатах отпишусь!

Let the metal flow!...

10

neol пишет:

Даже если база вырастет до пары гигабайт, проще и дешевле будет памяти побольше воткнуть, чем выносить БД на отдельный сервер.

это не лучший вариант.

bestel пишет:

Что делать, куда копать? И nginx используется как фронт-енд, и кеш APC активирован. И все равно не спасает. Заранее благодарен за помощь!

менять архитектуру, на одном ПК все это не потянет.
1-node: nginx+php+apache-backend(хотя его также лучше вынести на отдульную ноду)
2-node: mysql

It is good day to die ...
MS Windows 10
Заметки о главном...

11

i2ks пишет:

менять архитектуру, на одном ПК все это не потянет.

Простите, но бугага (=

12

neol пишет:

Простите, но бугага (=

троллим по тихоньку? )

It is good day to die ...
MS Windows 10
Заметки о главном...

13 (22.07.2014 19:01:48 отредактировано bestel)

Докладываю обстановку. Добавил в iptables ограничение 30 коннектов с одного ip, пока полет нормальный:

 Консоль:
-A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 30 -j REJECT

Решил устроить тест с имитацией запросов. На одном сервере выполнил команду, 30 запросов в 30 потоков:

 Консоль:
ab -n 30 -c 30 вебморда


Параллельно на испытуемом выполнил следующее

 Консоль:
netstat -anp | grep ':80' | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n


И в списке с IP увидел сервер с которого выполнялась имитация нагрузки с числом коннектов 40. Какого черта, если в iptables я указал ограничение в 30 коннектов?

Let the metal flow!...

14

bestel пишет:

И в списке с IP увидел сервер с которого выполнялась имитация нагрузки с числом коннектов 40. Какого черта, если в iptables я указал ограничение в 30 коннектов?

В каких состояниях висят соединения? Емнип connlimit не учитывает соединения в TIME_WAIT.

15

neol пишет:
bestel пишет:

И в списке с IP увидел сервер с которого выполнялась имитация нагрузки с числом коннектов 40. Какого черта, если в iptables я указал ограничение в 30 коннектов?

В каких состояниях висят соединения? Емнип connlimit не учитывает соединения в TIME_WAIT.

Если выполнить:

 Консоль:
netstat -anp | grep ':80' | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n

То оно выдает некое подобие таблицы с колонками кол. подключений и ip-хоста, и никаких состояний.

Let the metal flow!...

16

bestel пишет:

То оно выдает некое подобие таблицы с колонками кол. подключений и ip-хоста, и никаких состояний.

Естественно, состояния-то вы отрезали с помощью awk.

Попробуйте так

 Консоль:
netstat -anp | grep -v TIME_WAIT | grep ':80' | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n

или
 Консоль:
netstat -anp | grep ':80' | awk '{print $6, $5}' | cut -d: -f1 | sort | uniq -c | sort -n