Рубрики
Uncategorized

Заставить Cronjobs по очереди

Как мы избегаем перегрузки ограниченных ресурсов сервера. Tagged с LoadAverage, Linux, Cron, DevOps.

Не у каждой компании есть стойки серверов, чтобы посвятить одному веб -объекту. В то время как в настоящее время мы испытываем рекордное количество сеансов и нагрузки на Ombe.com, мы все еще не решили укусить пулю и оболочку для балансировки нагрузки или CDN и сопутствующих головных болей, направленных на то, чтобы вытащить все от одноредерной ориентации в готовый много сервер.

Таким образом, когда мы начали испытывать нагрузочные шипы без соответствующих шипов трафика, у нас было некоторое расследование.

Мы обнаружили, что у нас было несколько трудоемких сценариев, бегущих от Крон (8) , выполнение технического обслуживания и прочего (например, создание статического HTML из большого набора данных) … И все они боролись за системные ресурсы. Вот как выглядел наш файл Crontab (и это так много примеров файлов Crontab):

#min    hr      day     month   wkday   command
*/5     *       *       *       *       /etc/scripts/kill_lockfile
5       4       *       *       *       /etc/scripts/dump_db
30      1       */2     *       *       /etc/scripts/make_sitemaps
0,30    *       *       *       *       /etc/scripts/make_all_filters
*/7     *       *       *       *       /etc/scripts/fix_brandnames
55,25   *       *       *       *       /etc/scripts/fix_foo
48,18   *       *       *       *       /etc/scripts/fix_bar
35,5    *       *       *       *       /etc/scripts/create_baz
                                        .... and many more ...

Итак, make_sitemaps DB-интенсивный, как и DIMP_DB , make_all_filters и fix_brandNames и, вероятно, некоторые другие сценарии «Fix_this». Не дай Бог, они когда -либо бегают одновременно … но рано или поздно, с Crontab (5) вот так, они будут, и они сделал Анкет Это сделало страницы медленным до виртуального ползания … и это не хорошо для ваших посетителей.

Итак, какой ответ? Упрощать!

Вот что наши Crontab (5) Похоже, сейчас:

#min    hr      day     month   wkday   command
*/5      *       *       *       *     /etc/scripts/frequent
59       *       *       *       *     /etc/scripts/hourly
02       0       *       *       *     /etc/scripts/daily

Каждый из этих сценариев — это обертка, которая называет все задания, которые мы хотим выполнять ежедневно, ежечасно или часто в последовательности Анкет Итак, Нет рабочих мест работают одновременно.

Теперь, как мы можем сохранить частый от бега, когда почасовой это работает? Мы создаем и держим файл блокировки в /TMP .

Вот вершина повседневная — Обратите внимание: это псевдо-код, который напоминает любовь PHP & Shell (возможно, тоже немного Perl); Вы захотите реализовать это на своем выборе.

$lockfile = '/tmp/cronlock';

while (file_exists($lockfile)) {
   sleep 15;
}

echo daily > $lockfile;

В конце повседневная Мы стерли наш план блокировки.

почасовой выглядит почти так же. Хотя мы положили немного страховки наверху на случай, если наши почасовой Работа принимает … целый час:

//check for the lockfile, sleep if exists
if (file_get_contents($lockfile) == "hourly") {
  // we are waiting on an instance of ourself!
  exit;
}

while (file_exists($lockfile)) {
   sleep(60); // wait for the lockfile to disappear; check every minute
}

частый немного отличается; Поскольку он работает несколько раз в час, мы не спим, если подарок блокировки. Мы просто выходим … в конце концов, Крон Запустит наш сценарий снова через 5 минут!

if (file_exists($lockfile)) {
    exit();
}

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

Дайте мне знать, если это полезно, и у вас будет отличная Weyti!

Оригинал: «https://dev.to/dalecosp/make-cronjobs-take-their-turn-2502»