Различия в производительности MySQL при использовании cron


У меня есть несколько сценариев обслуживания PHP, запущенных в среде общего хостинга с использованием cPanel. Большинство сценариев необходимо запускать каждые 3-4 часа, и для упрощения их выполнения я написал сценарий планировщика, который проверяет, какие (если таковые имеются) из этих сценариев необходимо запустить, и выполняет их по мере необходимости. Я настроил сценарий планировщика на запуск каждые 5 минут в cron. Если сценарий обнаружит, что в настоящее время не требуется никаких задач по обслуживанию, он ничего не сделает. Накладные расходы на вызов планировщика приводят к выполняется около 5 коротких SQL-запросов (поэтому они выполняются каждые 5 минут).

Все работало нормально, пока мой хост не пожаловался на высокое использование MySQL, утверждая, что я намного превысил допустимый предел. После отключения задания cron планировщика мое использование ресурсов снизилось до 0.

  • Перед отключением задания cron: Количество процессов MySQL (среднее) - 0,97
  • После отключения задания cron: Количество процессов MySQL (среднее) - 0,00

Странный дело в том, что после удаления задания cron я все еще продолжал активировать скрипт планировщика вручную через браузер каждые несколько часов. Поскольку скрипт все еще выполнялся, я был очень удивлен тем, насколько резко упало среднее количество процессов MySQL. Перед отключением задания cron я начал регистрировать, сколько SQL-запросов было выполнено сценариями планировщика и обслуживания.

  • Перед отключением задания cron: 9899 запросов в день (в среднем)
  • После отключение задания cron: 9552 запроса в день (в среднем)

Поэтому, когда я вызвал планировщик вручную, он по-прежнему выполнял почти столько же SQL-запросов, сколько и в cron, но каким-то образом мое использование MySQL все равно упало практически до нуля.

Существуют ли какие-либо различия в производительности между выполнением PHP-скрипта с помощью задания cron с использованием команды php, чем при вызове его через браузер? Я явно не закрываю соединение с базой данных в своем сценарии, так как это было мое понимая, что это происходит автоматически в конце выполнения. Возможно ли, что это соединение остается открытым, когда скрипт запускается через cron? Какие еще могут быть объяснения существенных различий в производительности при использовании cron?

Author: Hybrid System, 2013-01-15

1 answers

Обычно вместе с PHP устанавливаются два файла php.ini:

  • Один для Apache
  • Один для интерфейса командной строки (Интерфейс командной строки)

Как правило, задания cron будут выполняться php -f yourfile.php, в котором используется файл CLI php.ini. Аналогично, когда вы вызываете скрипт по сети и через apache, он будет использовать файл apache php.ini. Кроме того, apache позволяет использовать php_value или php_flag в конфигурации виртуального хоста или .htaccess файлах.

У вас, скорее всего, есть разница в конфигурации между apache и CLI.

Первое, что приходит мне в голову, - это постоянные подключения к БД. Постоянные соединения будут использовать пул подключений к вашему серверу БД, которые будут сохраняться между запросами, т.е. будут оставлены открытыми, чтобы избежать рукопожатий TCP. Это оптимизация производительности, но может превысить лимит подключения вашего сервера MySQL.

В моей системе (Ubuntu) пути для двух файлов php.ini следующие следует:

  • /etc/php5/apache2/php.ini
  • /etc/php5/cli/php.ini

Вы можете указать файл php.ini, который вы хотите использовать при запуске php через командную строку с помощью флага -c.

 3
Author: thwd, 2013-01-16 11:02:34