Верстакфорум практиков
рекламаiprazon: приватные серверные адреса IPv4 и SOCKS5, безлимитный трафик, бесплатный тест до 2 часов
ФорумСбор данных

Ночной прогон: расписание и окно

cronjob
cronjob
Новичок
сообщений 205
с фев, второй сезон
1 января, 08:12первое сообщение

Запускаю сбор в полночь, он идёт часов пять. Раз в неделю случается такое: сайт под утро оживает, отклик растёт, прогон не успевает и наезжает на дневной, который стартует в семь. Два прогона мешают друг другу, оба тормозят.

Хочу нормальное окно: старт, предельный срок, поведение при выходе за срок. Как это принято устраивать?

linuxvsem
linuxvsem
Участник
сообщений 830
с июл
8 июня, 11:29#2

Три вещи: замок, предельный срок и мягкая остановка.

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

#!/bin/sh
# запуск под замком, предельный срок четыре с половиной часа
flock -n /var/lock/nochnoy.lock \
  timeout -s TERM 4.5h /opt/progon/run.sh || echo "занято или вышло время" >&2

Замок снимается сам при выходе, отдельная уборка не нужна.

Настя Лужина
Настя Лужина
Новичок
сообщений 265
с янв, второй сезон
15 ноября, 14:46#3

а timeout не оборвёт на середине записи?

tcpdump_fan
tcpdump_fan
Знаток
сообщений 1010
с июн
22 апреля, 17:03#4

Оборвёт, если прогон не ловит сигнал. Поэтому ставится обработчик: по TERM выставляем флаг, текущая пачка дописывается, очередь остаётся с непройденными задачами, процесс выходит с кодом.

import signal
pora_zakanchivat = False

def na_signal(nomer, kadr): global pora_zakanchivat pora_zakanchivat = True

signal.signal(signal.SIGTERM, na_signal)

while ochered and not pora_zakanchivat: pachka = ochered.vzyat(200) obrabotat(pachka) zapisat(pachka) ```

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

слушаю провод, а не догадки
hardline
hardline
Знаток
сообщений 970
с июн
1 сентября, 08:20#5

Добавлю про сам выбор окна, потому что полночь берут по привычке.

Ночь неоднородна. У магазинов с обычной аудиторией провал нагрузки идёт примерно с двух до шести, а до полуночи там ещё живые покупатели и сайт занят ими. Прогон в полночь по такому сайту получает отклик почти дневной и сам себе устраивает те самые пять часов. Сдвиг старта на два часа вперёд иногда сокращает прогон на четверть, ничего больше не трогая.

Как это померить, не гадая. Раз в полчаса сутки подряд дёргайте одну и ту же страницу десятком запросов и пишите медиану отклика в файл. Через сутки у вас картина по часам, и провал видно глазами. Замер стоит копейки, а окно после него выбирается осмысленно.

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

И третье, про наезд на дневной прогон. Даже с замком и сроком стоит развести их по разным очередям и разным лимитам соединений. Тогда пересечение на десять минут никого не убивает.

медиана отклика по часам, секунды
медиана отклика по часам, секунды
cronjob
cronjob
Новичок
сообщений 205
с фев, второй сезон
8 февраля, 11:37#6
hardline: прогон в полночь по такому сайту получает отклик почти дневной

Сутки померил, картина ровно как у вас: с полуночи до часа отклик вдвое хуже, чем в три ночи. Перенёс старт на два.

linuxvsem
linuxvsem
Участник
сообщений 830
с июл
15 июля, 14:54#7

Ну вот, и переписывать ничего не пришлось.

cronjob
cronjob
Новичок
сообщений 205
с фев, второй сезон
22 декабря, 17:11#8

Итог по теме: старт в два, окно пять часов, замок через flock, мягкая остановка по TERM.

Прогон теперь укладывается в три с половиной часа, до дневного остаётся полтора часа запаса. Наездов больше не было.