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 процессы стоят в очереди и едят всю память. Опять таки если делаются какие то операции с файловой системой в скрипте. Слишком много идей можно придумать если не видеть метрики и код

→ Ссылка