Найти тему

Что делать если Bitrix MySQL использует все ресурсы процессора

Оглавление

Однажды столкнулся с интересной проблемой, MySQL стал пожирать полностью все ресурсы процессора. Причем “захват” ресурсов происходил плавно с выраженными скачками на графике мониторинга

График загрузки CPU на сервере
График загрузки CPU на сервере

Провалы на графике это ручной перезапуск службы MySQL

Причина утечки процессорных ресурсов под MySQL

В поисках причины были исследованы длинные запросы к БД и перепробваны различные комбинации настроек MySQL, но ничего не получилось выявить и не получилось добиться стабильной работы сервера…

Путем исключения удалось найти виновника данного хулиганства, им оказался типовой файл cron_event.php. Проблема оказалась на самом видном месте, но почему-то я вупор этого не видел в самом начале. Все дело в том, что в типовом файле cron_event.php определяется параметр PHP

set_time_limit(0);

Что собственно означает, что выполнение запросов не лимитировано по времени. И в следствие чего какие-то функции зависали и продолжали находиться в запущенном состоянии не выгружаясь и не освобождая ресурсы.

Решение проблемы захвата 100% процессора службой MySQL

Решается данная проблема в три действия:

  1. копируем файл cron_event.php в папку /local/php_interface/
  2. меняем значение “0” на “60” в функции set_time_limit
  3. меняем путь в плариновщике заданий CRON на новый путь <путь от корня до папки сайта>/local/php_interface/cron_event.php

Таким образом мы задаем лимит в 60 секунд на выполнение скрипта. Однако, если вы знаете, что вам нужно установить больший лимит времени для выполнения PHP скприптов, то можно установить нужный интервал в фукнции set_time_limit.

Еще один важный момент, по возможности рекомендую установить версию PHP 8.1. На этой версии, в отичии от 8.2 и 8.3 скрипты работают стабильней и меньше нагружают сервер.