Ec2 Cronjobs - Высокая загрузка ЦП

У меня есть экземпляр EC2 (микро), на котором работает API cakephp. Этот экземпляр обслуживает проверку качества перед развертыванием в производственной среде.

В этом случае у нас есть 5 cronjobs, которые выполняются один раз в минуту. Эти cronjobs в 98% случаев запускают запросы Mysql и завершаются, так как делать нечего. Таким образом, в 98% случаев каждую минуту выполняется 5 запросов mysql.

Эти cronjobs настраиваются с помощью CloduWatch Events> Rules, которые содержат 5 cronjobs, установленных как Documents. Вот' "schemaVersion": "1.2", "description": "CronjobNumberOne", "параметры": {

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

Каждый раз, когда действует правило cronjob, использование ЦП нашего экземпляра Ec2 увеличивается и продолжает расти до тех пор, пока экземпляр Ec2 не умрет. Вот график, чтобы увидеть, что происходит:

Увеличение ЦП за последнюю неделю до сегодняшнего дня.

Я установил SAR, чтобы проверять использование ЦП в течение минуты, и вот что происходит:

Sar -u ALL 1 120

Как только я выключаю событие кукурузных заданий, cpu понижается до нормальных значений.

Я проверил папку журналов, и нет никаких ошибок или чего-то подобного.

Это случилось с кем-нибудь? Любая подсказка о том, как я могу решить эту проблему? Спасибо за вашу помощь!

PS: У нас есть еще один продукт, в котором вместо cronjobs из командной строки у нас есть cronjobs, которые отправляют HTTP-запрос к конечной точке .. У нас более 30 cronjobs. при производстве и использовании процессора далеко не этот.

2
задан 30 October 2018 в 12:35
1 ответ

Мое предположение: Поскольку они запускаются одновременно, возможно, они создают какое-то состояние гонки или блокируют базу данных, препятствуя успешному завершению всех или некоторых их. Я бы сказал, что, вероятно, только двое из них связаны и не могут закончить.

И поскольку каждую минуту запускается новое задание, претендентов на ресурс (предположительно MySQL) становится все больше, и ни один из них не может выполнять свою работу из-за некоторых блокировок. Использование ресурсов в экземпляре продолжает расти, и в конечном итоге экземпляр умирает.

Это мое предположение.

Что делать: Когда это происходит, подключитесь к экземпляру по SSH и выполните ps -faxu и / или используйте top , чтобы выяснить, какие задания cron все еще выполняются. Вы сможете определить это по имени процесса.

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

У вас есть несколько вариантов:

  • Простой и, вероятно, не очень надежный - это распределить задания cron на протяжении минуты. Что-то вроде добавления сна 10 / сна 20 / ...:

     сна 10;  .  / opt / elasticbeanstalk / support / envvars && / var / app / current / bin / cake cronjob_number_one> / var / log / cronjobs_php 2> & 1
     
  • Лучше, но немного сложнее было бы использовать семафоры , например, с помощью flock (1) . По сути, это работает следующим образом:

    1. вы запускаете задание cron
    2. , оно вызывает flock , чтобы попытаться создать файл блокировки
    3. , если это успешно -> запустить фактическое задание
    4. , если нет (потому что старый все еще существует, потому что задание еще не завершено) -> exit

Надеюсь, что это поможет :)

1
ответ дан 3 December 2019 в 12:31

Теги

Похожие вопросы