Ec2 Cronjobs - Alto uso da CPU

2

Eu tenho uma Instância do EC2 (micro) executando uma API do cakephp. Esta instância serve validação de qualidade antes de implantar em produção.

Neste caso, temos cinco cronogramas que são executados uma vez por minuto. Esses cronjobs, 98% do tempo, executam uma consulta do Mysql e terminam, já que não há nada a fazer. Então, basicamente, 98% do tempo, a cada minuto, 5 consultas mysql são executadas.

Esses cronjobs são configurados usando eventos CloduWatch > Regras, que contêm os 5 cronjobs definidos como Documentos. Veja um exemplo de um dos nossos documentos:

{   "schemaVersion": "1.2",   "description": "CronjobNumberOne",   "parâmetros": {

}   "runtimeConfig": {     "aws: runShellScript": {       "propriedades": [         {           "id": "0.aws:runShellScript",           "runCommand": [". / opt / elasticbeanstalk / support / envvars & / var / app / current / bin / cake cronjob_number_one > / var / log / cronjobs_php 2 > & 1"]         }       ]     }   } }

Toda vez que a regra do cronjob está ativa, o uso da cpu de nossa instância do Ec2 aumenta, e continua aumentando até que a instância do Ec2 morra. Aqui está um gráfico para ver o que acontece:

aumento de CPU na última semana, até hoje.

Instalei o SAR para verificar o uso da CPU ao longo do minuto e eis o que está acontecendo:

Sar -u ALL 1 120

Assim que eu desligo o evento dos cornjobs, o cpu diminui para valores normais.

Eu verifiquei a pasta de logs e não há erros ou algo assim.

Isso aconteceu com alguém? Alguma pista de como posso resolver este problema? Obrigado pela sua ajuda!

PS: Temos outro produto, que em vez de cronjobs por linha de comando, temos 'cronjobs' que fazem uma requisição HTTP para um enpoint .. Temos mais de 30 'cronjobs' na produção e o uso da cpu não está nem perto dessa .

    
por Cafn 30.10.2018 / 11:35

1 resposta

1

Meu palpite: Como eles são iniciados ao mesmo tempo, talvez eles criem alguma condição de corrida ou bloquear no banco de dados, impedindo a conclusão bem-sucedida de todos ou alguns deles. Eu diria que provavelmente são apenas dois deles interligados e incapazes de terminar.

E como um novo trabalho é iniciado a cada minuto, há mais e mais contendores para o recurso (presumivelmente o MySQL), nenhum deles capaz de fazer seu trabalho devido a alguns bloqueios. O uso de recursos na instância continua aumentando e a instância finalmente morre.

Esse é o meu palpite.

O que fazer: Quando isso acontece com o SSH na instância, use ps -faxu e / ou use top para descobrir quais tarefas cron ainda estão em execução. Você poderá dizer a partir do nome do processo.

A próxima etapa é garantir que a tarefa cron incorreta seja executada apenas uma vez por vez.

Você tem algumas opções:

  • Simples e provavelmente não muito confiável é espalhar os trabalhos cron ao longo do minuto. Algo como preceder sleep 10 / sleep 20 / ...:

    sleep 10; . /opt/elasticbeanstalk/support/envvars && /var/app/current/bin/cake cronjob_number_one > /var/log/cronjobs_php 2>&1
    
  • Melhor ainda, um pouco mais complexo seria usar semáforos , por exemplo, com a ajuda de flock(1) . Essencialmente, é assim que funciona:

    1. você inicia o trabalho cron
    2. ele chama flock para tentar criar um arquivo de bloqueio
    3. se for bem sucedido - > execute o trabalho real
    4. se não (porque o antigo ainda existe, porque o trabalho ainda não terminou) - > sair

Espero que ajude:)

    
por 30.10.2018 / 21:44