Приветствую!Коллеги, подскажите пожалуйста, как решить проблему.Имеется сервер (Intel Xeon W3530 2.8GHz (4 ядра * 2 HT), 24 GB RAM, SSD, Ubuntu 12.04), на котором nginx 1.2.4 + PHP-FPM 5.3.10-1ubuntu3.4 через IP сокет, static pool 400. Система оптимизированы под highload (TCP/IP стек, системные лимиты).Проблема в следующем: судя по тесту siege и просто нагрузке в часы пик сервер может выполнять только до 300-350 запросов в секунду.LoadAvg достигает 100.0, CPU user 85%, sys 15%, все ядра заняты полностью. Т.е. после часов-пик на продакшене по статистике все app-машины нагружены на 100%, образуется очередь на балансировщике.Тестировал с помощью siege: 10 repeats с concurrency 500. Ничего не отваливается, но Trans Rate всего лишь 350, и среднее время ответа увеличивается до 700 ms.Если делаю die() в начале index.php - то без проблем отрабатывает, и trans rate 500, и время малое. Отсюда вывод - система и nginx оптимизированы и могут справиться даже хотя бы с 500 rps.Другой очевидный вывод - что-то не так с кодом приложения. Хорошо, профилировал с помощью Xhprof - на ненагруженной системе нет видимых проблем, за в среднем 200ms скрипт отрабатывает. Но когда сервер загружен, очевидных проблемных функций тоже выявить нельзя - потому что в каждом профайле они разные... В базу точно не упираемся, (ни в MongoDb, ни в Redis) - смотрел по нагрузке на них, и NewRelic говорит что код отнимает большее время.Пробовал и кол-во воркеров увеличивать, и уменьшать - результат не меняется.Такая же ситуация на остальных пяти идентиных production-серверах.Как побороть? Какие у вас RPS?PS. Очень не хочется верить в такие комментарии :(
Я для таких задач использую pinba. Ставится на все сервера продакшна. Паттерн использования такой: сначала просто смотреть на время выполнения отдельных скриптов (avg, max), определить проблемный скрипт, в коде проблемного скрипта вешать пинбовские тэги. Дальше мониторить куски кода, непосредственно по тегам. Таким образом можно определить узкое место, а там уже профайлить.
1) Немного ошибся, в спокойное время ответ 20мс, при средней нагрузке 30-40мс, 200мс и более начинается в часы пик. Вот график среднего времени выполнения php-скрипта
1) 200мс это очень много, куда вы столько тратите?2) статик пул 400 это зачем? 8 ядер не смогут переживать 400 процессов и вы погибнете на context-switching-е. попробуйте dynamic3) 350рпс*5 серверов это 1750рпс. очень интересно что это за проект с такими цифрами, у нас к примеру при _в несколько раз_ большем рпс - в _несколько десятков раз_ больше серверов. точно ли нельзя избавиться от хождения в бекенд в некоторых местах?на самом деле это все советы высосанные из пальца. если ваш код держит 350 рпс, вы можете либо написать код лучше, либо добавить серверов, никакого чуда ждать не стоит:)
--
wbr,
Alexey Rybak
Badoo Development (badoo.com)
имеет, но "разворачивать" пинбу довольно быстро + сможете обмерить
аккуратно любые таймеры.
поскольку вы упираетесь в цру, то вам придется ставить хитрые таймеры
на разные стадии инициализации приложения.
фактически на ощум искать, что отжирает цпу.
io проблемы искать в этом смысле проще.