Всем привет! Помогите разобраться с проблемой.
Php fpm создает высокое LA + нагрузку на цпу.
Имеем: API Веб сервер ngnix+phpfpm (2000 процессов) + redis + memcached.
База данных на другом сервере, с ней все ок.
Нагрузка 3500-6000 запросов в секунду.
Архитектура - клиент шлет запрос, мы ищем в базе данные, обращаемся к мемкешу, обращаемся к редису за массивом исключений, полученные данные (300 строк из mysql) прогоняем в цикле для создания массива, дергаем из массива нужное нам значение, пишем в базу результат, пишем в редис результат и выводим результат к клиенту.
Проблема: при 3500-4300 запросов в сек, LA 28-30 + нагрузка процессора 30-40%. При повышении запросов до 5000-6000 в секунду. Начинает серьезно расти LA и расход процессора поднимается до 70-90 процентов. Скорее всего
Железка AMD EPYC 7502P + nvmessd диски
Может нужно поменять процессор в соотношении - меньше ядер но больше частота?
Выбор из процессоров:
2 x Intel® Xeon® SP Gold (2шт)
Intel® Xeon® W-2295
Intel® Xeon® W-2145
AMD EPYC 7502P
Intel® Core™ i9-12900K
AMD Ryzen™ 7 3700X
Александр, Вы даже не указали насколько большая БД...
Какие индексы вообще есть...?
Какие запросы вообще выполняются и по каким полям и каким данным...? (понятно что 300 строк выбираются...)
Суть задачи, которую выполняет программа...? Возможно надо менять архитектуру и подход к этой задаче...
Александр, Тогда надо разбираться, что там "такого в PHP"...вот это очень расплывчато:
клиент шлет запрос, мы ищем в базе данные, обращаемся к мемкешу, обращаемся к редису за массивом исключений, полученные данные (300 строк из mysql) прогоняем в цикле для создания массива, дергаем из массива нужное нам значение, пишем в базу результат, пишем в редис результат и выводим результат к клиенту.
1. Поставьте prometheus + node_exporter. Метрики очень важны, без них это только тыкать пальцем в небо
2. Если систему нагружает php код, то поставьте xhprof и профилируйте запросы (например 1% запросов), тогда вы сможете увидеть какой именно код даёт нагрузку на процессор
3. Если БД на том же сервере, то установите ещё и mysql_exporter
Александр, не думали на счёт roadrunner и подобных решений? Судя по описанию у вас достаточно лёгкая логика в php коде, соответственно возможно основная нагрузка идёт при бутстрапинге. А тот же roadrunner будет загружать приложение всего один раз, а не на каждый запрос. У вас может получиться серьёзный буст производительности