Laravel оптимизация кода
Создал телеграм бот на Laravel 5.8
Сервер: nginx + php-fpm (directadmin) 32gb, 500gb SSD, 12 x 2.20GHz. PHP 7.1 MySQL 5.7.27
ДБ не большая, бот новый и пользователей тоже не так много. За час в пик приходит 30 тысяч запросов и бот уже конкретно лагает.
Все дб запросы проходят по индексу, но кэш не использовал пока, так как это демо версия еще. Особо тяжелого кода не использовал. Я раньше никогда столько запросов не отправил через php. Поэтому подозреваю что это все из-за ответных запросов на бот от моего сервера. В данный момент запросы идут не в отдельном потоке. Использую обычную команду Request longman/telegram-bot для запросов.
Ларавел начал изучать недавно. Подключил листенер для ДБ запросов
DB::listen(function ($query) {
if ($query->time > 100) {
//лог
}
});
за пик в лог самый медленный запрос попал этот (их было всего 15):
update `table` set `night` = night+1, `current_type` = ?, `status` = ? where `id` = ?
Время выполнения: 2738.99 (миллисекунд) Как видите update идет по ID. команда top показывал почти 100 процентную нагрузку на все потоки.
Общий скрипт выше 6000 строк кода. один cron который запускается каждые 2 секунды
for i in {0..30}; do curl http://URL/ && sleep 1; done;
Что посоветуете для оптимизации? и как можно найти какая именно часть кода нуждается в оптимизации? Слишком подозрительная нагрузка для такого мизерного количества запросов. Стоит ли выводит ответные запросы на отдельный цикл и обработать там ? если да каким образом лучше делать?
pm = ondemand
pm.max_children = 100
pm.process_idle_timeout = 20
pm.max_requests = 500
Ответы (1 шт):
Попробуйте посмотреть в сторону загрузки памяти php процессами. Можно смотреть пиковые нагрузки скрипта через функцию memory_get_peak_usage. 8 запросов в секунду при выполнении запроса в бд длительностью 3сек довольно быстро замусорят память, особенно если таймаут 20сек и лимит запросов 500, возможно бд так долго иногда отвечает потому что php процессы стоят в очереди и едят всю память. Опять таки если делаются какие то операции с файловой системой в скрипте. Слишком много идей можно придумать если не видеть метрики и код