Мой вопрос сводится к тому, должны ли несколько процессов magento cron: run -vvv всегда выполняться и постоянно попадать на MySql.
Я настраиваю Magento 2.2.1 через Google Cloud, и у меня есть 3 стандартных задания cron, которые были предварительно настроены через установку Magento в один клик Google.
*/1 * * * * /opt/bitnami/php/bin/php /opt/bitnami/apps/magento/htdocs/bin/magento cron:run -vvv 2>&1
*/1 * * * * /opt/bitnami/php/bin/php /opt/bitnami/apps/magento/htdocs/update/cron.php 2>&1
*/1 * * * * /opt/bitnami/php/bin/php /opt/bitnami/apps/magento/htdocs/bin/magento setup:cron:run -vvv 2>&1
Если посмотреть на top -c, то всегда запущено 2 процесса php.bin, которые постоянно работают с MySql и заставляют его все время использовать около 50-70% ЦП. Вот снимок того, как это обычно выглядит.
PID USER PR NI VIRT RES SHR S %CPU %MEM
19327 mysql 20 0 3872884 332876 19172 S 60.8 3.4 332:42.45 /opt/bitnami/mysql/bin/mysqld.bin --defaults-file=/opt/bitnami/mysql/my.cnf --basedir=/opt/bitnami+
26458 bitnami 20 0 679516 476444 64492 S 24.6 4.9 0:24.85 /opt/bitnami/php/bin/php.bin /opt/bitnami/apps/magento/htdocs/bin/magento cron:run -vvv
26415 bitnami 20 0 677532 475672 64588 R 23.6 4.9 1:36.11 /opt/bitnami/php/bin/php.bin /opt/bitnami/apps/magento/htdocs/bin/magento cron:run -vvv
Я также изменил запуск крон каждые 5 минут, вместо значения по умолчанию каждую минуту, но поведение остается прежним.
Мое последнее изменение менялось каждые 7 минут и 8 минут с помощью 2 cron: запускать задания с интервалом в 3 и 4 минуты, причем одновременно выполнялось только одно задание cron с 30% - 40% ЦП от MySQL.
Мой сайт также не имеет трафика сейчас, потому что я еще не запустил его. Это нормальное поведение от Magento, так как с сайтом ничего не происходит? Я оставил его на 12 часов, ничего не делая, и когда я смотрю сверху, cron все еще работает и забивает MySQL.
ОБНОВЛЕНИЕ: теперь ясно, что проблема заключается только в первом cron: запустить процесс, который вызывает проблемы. Я изменил 2-й и 3-й элементы обратно на каждую минуту и оставил первый на 8-й минуте, и за один раз запущен только один запущенный процесс cron: run. Из комментария ниже это может быть проблема с установками Bitnami Magento, но это мой первый опыт работы с Magento, поэтому я не знаю, является ли это ожидаемым поведением (я действительно надеюсь, что это не так).
источник
htop
. С ней я вижу , что у меня есть больше , чем десять строк сmagento cron:run -vvv
. Некоторые были живы в течение нескольких минут. Я постараюсь выяснить, почему cron не работает так, как ожидалось.Ответы:
Обеспечение хотя бы временного обхода проблемы, чтобы не забивать ваш сервер MySQL. Git проблема с описанием проблемы
По крайней мере, часть проблемы сводится к таблице cron_schedule. Я бы порекомендовал сделать,
select count(*) from cron_schedule;
и если это возвращает более нескольких сотен, то у вас есть проблема. Для меня этот запрос вернул 208 046 на сервере, который работал всего несколько недель.Если у вас есть проблема, то выполните этот запрос, чтобы удалить все в этой таблице, кроме последних строк
delete from cron_schedule where scheduled_at < date_sub(now(), interval 1 hour);
Затем снова запустите запрос на подсчет, и он должен быть ниже. Мой пошел с 208k до 252.
После выполнения этого запроса я установил все 3 стандартных кроны обратно к стандартным раз в минуту, и, как по волшебству, они все 3 запускаются практически мгновенно. Вернуться к норме, насколько я могу судить.
В проблеме github другой пользователь предлагает добавить этот запрос в crontab, чтобы предотвратить повторный рост таблицы.
Последний ответ команды Magento по этому вопросу был в сентябре, что они не могут воспроизвести проблему, но ряд пользователей подтвердили, что испытывают то же самое, в том числе и я. Так что, надеюсь, они исправят это, так что этот взлом может быть удален.
РЕДАКТИРОВАТЬ: Чтобы использовать эту команду в crontab вам нужно каким-то образом передать свои учетные данные в MySQL. См. Мой комментарий ниже, если вы находитесь на выделенной виртуальной машине или сервере и хотите поставить своего пользователя / пользователя на crontab, в противном случае вам потребуется настроить файл учетных данных MySQL. И вы можете использовать,
which mysql
чтобы найти путь к вашей двоичной директории mysql.источник
mysql magento-db -e "query"
где magento-db - это имя базы данных (в моем случае это bitnami_magento), также работает, когда есть пароль для базы данных? Я обычно вхожу в базу данных,mysql -u somename -p
а затем вводить пароль в командной строке.*/15 * * * * <path_to_mysql_binary_dir>/mysql -u<sql_user> -p'<sql_user_pass>' <database_name> -e "delete from cron_schedule where scheduled_at < date_sub(now(), interval 1 hour)";