Однажды столкнулся с интересной проблемой, MySQL стал пожирать полностью все ресурсы процессора. Причем “захват” ресурсов происходил плавно с выраженными скачками на графике мониторинга
Провалы на графике это ручной перезапуск службы MySQL
Причина утечки процессорных ресурсов под MySQL
В поисках причины были исследованы длинные запросы к БД и перепробваны различные комбинации настроек MySQL, но ничего не получилось выявить и не получилось добиться стабильной работы сервера…
Путем исключения удалось найти виновника данного хулиганства, им оказался типовой файл cron_event.php. Проблема оказалась на самом видном месте, но почему-то я вупор этого не видел в самом начале. Все дело в том, что в типовом файле cron_event.php определяется параметр PHP
set_time_limit(0);
Что собственно означает, что выполнение запросов не лимитировано по времени. И в следствие чего какие-то функции зависали и продолжали находиться в запущенном состоянии не выгружаясь и не освобождая ресурсы.
Решение проблемы захвата 100% процессора службой MySQL
Решается данная проблема в три действия:
- копируем файл cron_event.php в папку /local/php_interface/
- меняем значение “0” на “60” в функции set_time_limit
- меняем путь в плариновщике заданий CRON на новый путь <путь от корня до папки сайта>/local/php_interface/cron_event.php
Таким образом мы задаем лимит в 60 секунд на выполнение скрипта. Однако, если вы знаете, что вам нужно установить больший лимит времени для выполнения PHP скприптов, то можно установить нужный интервал в фукнции set_time_limit.
Еще один важный момент, по возможности рекомендую установить версию PHP 8.1. На этой версии, в отичии от 8.2 и 8.3 скрипты работают стабильней и меньше нагружают сервер.