Назад | Перейти на главную страницу

Каким образом можно предотвратить разрушение серверов заданиями cron пользователя?

Довольно часто пользовательские задания cron на общих серверах выполняются одновременно и попадают в конфликт (насколько я могу судить). Итак, нагрузка резко возрастает, Nagios злится, Apache перестает отвечать, вы не можете подключиться по SSH, потому что время ожидания истекло и т.д. для решения этой проблемы, когда pgrep crond | wc -l возвращает> 50.

Кажется, что их можно поразить, ограничив количество процессов crond, запущенных в любой момент времени или аналогичных (например, отправив SIGSTOP, пока некоторые из них не станут менее хакерскими), но я еще не нашел никаких хороших зацепок.

Аппаратное обеспечение: 4 процессора и выше, младший - Dell 1435s с ~ 8 ГБ памяти, RAID 10, WD EADS, в основном Plesk и cPanel, но также и некоторые злые системы Sphera.

Как ты справляешься с этой проблемой, SF?

Ты можешь использовать cron.allow и cron.deny чтобы ограничить доступ пользователей к cron, или вы можете использовать Лимиты PAM чтобы ограничить использование ЦП, количество процессов и тому подобное. Помимо этого, решение состоит в том, чтобы создать что-то для мониторинга и решения cron пользователей, потому что cron на самом деле не имеет ограничения на количество запускаемых заданий.

Я думаю, что в CPanel есть что-то о количестве одновременно выполняемых заданий cron, но это особый инструмент (не уверен).

Я думаю, у вас одна из этих проблем:

  • недостаточно памяти для одновременного запуска crontab. Вы можете исправить:

    • добавление дополнительной оперативной памяти
    • ограничение максимальной памяти, которую может выделить пользователь
    • перепланируйте задания, чтобы уменьшить количество одновременных заданий - вам может потребоваться заменить crond и использовать другой планировщик
  • высокий ввод / вывод. Вы можете исправить:

    • понижение приоритета ввода / вывода с помощью ionice
    • перепланировать задания, чтобы уменьшить количество одновременных заданий

Попытайтесь выяснить, переключается ли машина, и если она не переключается в ночное время, измените класс приоритета ввода-вывода cron на idle:

sudo ionice -c 3 -p $(pgrep cron)

Я всегда планировал cronjobs в случайное время (особенно минуты). Я обычно вижу примеры cron, которые запускаются в полночь, например:

0 0 * * *  /usr/bin/echo "Job ran"

Если у вас много таких заданий, вы напрашиваетесь на проблемы. К сожалению, это часто длительные системные задания. Я также обычно планирую задания в разное время в течение окна пакетного процесса. (С 23 до 05) часов.

Мне нравится новая спецификация cron, используемая в Ubuntu. Это несколько /etc/cron.* каталоги, чтобы указать задания для запуска. Они запускаются последовательно, а не параллельно, ограничивая нагрузку.

Вы должны увидеть, что запланировано в файлах, расположенных в /etc/spool/cron/crontabs. Для чтения этих файлов потребуется root-доступ. Если проблемы вызывают пользователи, обсудите с ними проблему.

Вы также можете проверить /var/log/syslog для записей CRON, чтобы узнать, что и когда запускается.