Minha pergunta se resume a, se vários processos do magento cron: run -vvv sempre estiverem rodando e atingindo o MySql constantemente.
Estou configurando o Magento 2.2.1 através do Google Cloud e tenho os 3 trabalhos cron padrão pré-configurados através da instalação do Magento em um clique do 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
Olhando para o topo -c , sempre existem dois processos php.bin em execução, que atingem o MySql constantemente e fazem com que ele use entre 50% e 70% da CPU o tempo todo. Aqui está um instantâneo da aparência normal.
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
Também alterei os crons para executar a cada 5 minutos, em vez do padrão a cada minuto, mas o comportamento permanece o mesmo.
Minha mudança mais recente foi alternada a cada 7 minutos e 8 minutos com o 2 cron: executar tarefas iniciando com 3 e 4 minutos de diferença, e com isso apenas 1 tarefa cron está sendo executada por vez com 30% a 40% da CPU do MySQL.
Meu site também não tem tráfego no momento, porque ainda não o iniciei. Esse comportamento é normal no Magento, pois não há nada acontecendo com o site? Eu deixei descansar por 12 horas sem fazer nada e, quando olho para o topo, o cron ainda está em execução e martelando o MySQL.
ATUALIZAÇÃO: Agora está claro que o problema é apenas o primeiro cron: execute o processo que está causando problemas. Mudei o segundo e o terceiro itens de volta a cada minuto e deixei o primeiro aos 8 minutos, e há apenas um único cron: processo em execução por vez. No comentário abaixo, pode haver um problema nas instalações do Bitnami Magento, mas esta é a minha primeira experiência com o Magento, portanto não sei se esse é o comportamento esperado (realmente espero que não seja).
fonte
htop
. Com ele eu vejo que eu tenho mais de dez linhas commagento cron:run -vvv
. Alguns já está no ar há alguns minutos. Vou tentar descobrir por que o cron não está funcionando conforme o esperado.Respostas:
Fornecendo pelo menos um trabalho temporário para solucionar o problema, para evitar martelar o servidor MySQL. Problema no Git que descreve o problema
Pelo menos parte do problema se resume à tabela cron_schedule. Eu recomendo fazer um
select count(*) from cron_schedule;
e se isso retornar mais do que algumas centenas, então você tem o problema. Para mim, essa consulta retornou 208.046 em um servidor em execução por apenas algumas semanas.Se você tiver o problema, execute esta consulta para excluir tudo da tabela, exceto as linhas recentes
delete from cron_schedule where scheduled_at < date_sub(now(), interval 1 hour);
Em seguida, execute a consulta de contagem novamente e ela deve ficar mais baixa. A mina passou de 208k para 252.
Depois de executar essa consulta, defino todos os três crons padrão de volta ao padrão uma vez por minuto e, como mágica, todos os três são executados quase que instantaneamente. De volta ao normal, tanto quanto eu posso dizer.
Na questão do github, outro usuário sugere adicionar essa consulta ao crontab para impedir que a tabela cresça novamente.
A última resposta da equipe Magento sobre o assunto foi em setembro, dizendo que eles não podem reproduzir o problema, mas vários usuários continuaram dizendo que experimentam a mesma coisa, inclusive eu. Esperemos que eles consertem isso para que esse hack possa ser removido.
EDIT: Para usar esse comando no crontab, você precisará passar suas credenciais para o MySQL de alguma forma. Veja meu comentário abaixo se você estiver em uma VM ou servidor dedicado e quiser colocar seu usuário / passe no crontab, caso contrário, será necessário configurar um arquivo de credenciais do MySQL. E você pode usar
which mysql
para encontrar o caminho para o diretório binário do mysql.fonte
mysql magento-db -e "query"
onde magento-db é o nome do banco de dados (no meu caso, é bitnami_magento), também funciona quando há uma senha para o banco de dados? Normalmente, entro no banco de dados comomysql -u somename -p
e depois insiro a senha em um prompt.*/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)";