Не у каждой компании есть стойки серверов, чтобы посвятить одному веб -объекту. В то время как в настоящее время мы испытываем рекордное количество сеансов и нагрузки на 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»