Налаштування Spot Fleet для пакетної обробки (AWS)

Пакетна обробка в хмарі зривається, коли спотова ємність зникає з-під завдання у розпал прогону. Ми налаштовуємо Spot Fleet в AWS під ключ: добираємо профіль навантаження, розподіляємо ємність по пулах і організовуємо перезапуск без втрати прогресу. Черга перестає простоювати, а час обробки пакета скорочується в рази.
Часті запитання

Чому Spot Fleet AWS перериває пакетну обробку

Spot Fleet AWS збирає пул із вільної спотової ємності й тримає його, доки ціна не перевищить поріг, заданий у запиті. Щойно вільних машин у провайдера стає менше, ємність відкликають: вузлу дають коротке вікно, близько двох хвилин, і забирають його.

Сервісу, який відповідає на запити, цього вистачає на дренування з'єднань, а пакетній обробці, де одне завдання рахується десятки хвилин, таке вікно не дає нічого.

Завдання, яке в момент відкликання рахувалося на вузлі, обривається на середині. Проміжні результати лежать у пам'яті або на локальному томі й зникають разом з інстансом, якщо обробка не пише контрольні точки в зовнішнє сховище, — а за замовчуванням не пише. Робота не продовжується з місця обриву, а починається заново.

Далі збій розгортається каскадом.

Завдання вже видані робочим вузлам, яких більше немає, брокер черги не отримує підтвердження й тримає їх до завершення часу очікування — зависла черга завдань зростає, нові завдання чекають, а планувальник тим часом намагається добрати пул і потрапляє під наступне відкликання.

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

Звідси типова картина: нічний перерахунок не встигає до ранку, звіти надходять із затримкою, черговий раз за разом добирає ємність вручну. Проблема не в самій спотовій ємності, а в тому, що завдання не спроєктовано під її відкликання. Розбираємо, як це закривається.

Що дає керований пул спотової ємності

Керований пул спотової ємності в Amazon Web Services — це не «увімкнути спот і чекати», а набір правил: скільки родин вузлів і зон доступності беруть участь, за якою стратегією береться вільна ємність і що робити в момент її відкликання.

Ми фіксуємо цільову частку спота в загальному пулі, а залишок тримаємо на звичайних вузлах — вікно обробки не зупиняється повністю, навіть якщо спотові машини йдуть майже одночасно.

Перший вимірюваний ефект — час проходження вікна обробки.

Коли пул прив'язаний до однієї зони й одного типу вузлів, значна частина вікна йде на очікування звільненої ємності; після розподілу за кількома зонами той самий обсяг черги закривається помітно швидше, і графік обробки перестає дрейфувати до ранку.

Другий — частка успішно завершених завдань. Відкликаний посеред обчислення вузол раніше означав перезапуск з нуля або зіпсований результат; тепер завдання отримує попередження про відкликання, знімає контрольну точку й віддає незавершену частину іншій машині.

Клас відмов «раптове відкликання вузла» просто зникає з журналу збоїв: замість розбору нічних інцидентів команда дивиться на одну метрику — частку завершених завдань.

«Раніше кожен ранок починався з розбору, які вікна не доїхали, — каже наш інженер. — Тепер пул сам перекладає завдання, і у звіті стабільно та сама частка успішних — будь-яке розходження видно одразу».

Варіанти розподілу спотової ємності в AWS

Спотову ємність не можна запитувати одним пулом в одній зоні доступності: за дефіциту потрібного типу екземплярів планувальник перерве частину завдань, і черга зупиниться.

Робоча схема — розподіляти запит відразу за кількома зонами й родинами інстансів: дефіцит приходить до них у різний час, тому сумарна доступність ємності вища, ніж у будь-якого окремого пулу.

Вибір між трьома підходами зводиться до одного питання: яка частка роботи має дійти до кінця, а що допустимо перервати й перезапустити. Нижче — порівняння за цією ознакою.

Варіант Коли підходить Обмеження
Повністю спотовий пул Переривана обробка: розбір логів, перерахунок індексів, прогони моделей, пакетні завдання без жорсткого терміну Немає гарантії ємності — за сплеску попиту завдання чекають у черзі. Переривання посеред кроку потребує контрольних точок і повторного запуску, який не псує результат
Змішаний пул із базовою часткою постійних ресурсів Є етап, який зобов'язаний працювати завжди: координатор черги, база метаданих, приймання та збирання результатів Постійна частина простоює в спокійні години; потрібно стежити, щоб спотова частка зростала, а базова не роздувалася «про всяк випадок»
Пул із резервом у кількох зонах доступності Жорстке вікно завершення й вимога до відмовостійкості: одна зона недоступна — розрахунок продовжується в інших Складніше налаштування: стратегію розподілу й вагу зон підбирають під профіль навантаження, інакше резерв простоює

На практиці частіше беруть змішаний пул із резервом у двох-трьох зонах: базова частка тримає координацію та завершення завдань, а основну частину роботи забирає спотова ємність. Далі розбираємо, як це розкласти за параметрами запиту.

Етапи впровадження: від аудиту навантаження до передачі

Порядок етапів вибудувано так, щоб до першого запуску стало ясно, де пул упреться в ліміти й що станеться, коли провайдер забере інстанси. Починаємо не з конфігурації, а з розрахунку того, що інфраструктура має витримати.

  1. Аудит навантаження. Збираємо фактичне споживання: тривалість завдань, пікову паралельність, вимоги до пам'яті та диска на одиницю роботи. Результат — цільовий розмір пулу й запас на перепідготовку за індивідуальним розрахункомПрофіль переривань.

    Розбираємо історію відкликання ресурсів за типами інстансів і зонами доступності: як часто надходить повідомлення, скільки часу залишається до зупинки, чи збігається це з піками попиту. Звідси видно, які родини інстансів допустимі, а які дадуть постійні перезапуски.

  2. Схема пулу. Конфігурація Spot Fleet: кілька пулів за типами й зонами, стратегія розподілу, частка стійких інстансів як страховка від дефіциту. Фіксуємо, які завдання переривати можна, а які — ні.

  3. Правила перезапуску. Налаштовуємо обробку повідомлення: збереження проміжного результату, коректне завершення процесу, повернення завдання в чергу. Перевіряємо, що повторний запуск не дублює результати.

  4. Перевірка відпрацювання збою. Імітуємо відкликання інстансів під навантаженням: чи вкладається обробка у відведене вікно, чи не губляться дані, чи відновлюється пул до цільового розміру.

  5. Передача регламентів. Віддаємо конфігурацію як код, порядок діагностики, метрики та пороги оповіщень, дії за дефіциту потужностей.

Що залишається в команди після впровадження

Після впровадження логіка роботи з перериваними інстансами залишається в репозиторії та документації, а не в голові інженера, який налаштовував пул. Нижче — перелік артефактів, які команда отримує на руки й може перевірити на прийманні.

  • Конфігурації пулу — декларативні файли з цільовою ємністю, розподілом за типами інстансів і зонами доступності, стратегією вибору та правилами заміни. Правки проходять рев'ю, стенд і робоче середовище збираються з одного джерела.
  • Політики доступу — ролі для вузлів, планувальника й операторів з мінімально необхідними правами, окремі облікові дані для ручних втручань, секрети винесені з конфігів і шаблонів запуску.
  • Схеми інфраструктури — черга, пул, сховище результатів, мережеві межі та точки, де обробляється повідомлення про переривання інстанса, із зазначенням відповідального компонента.
  • Правила контролю черги — пріоритети завдань, ліміти паралелізму, розбиття великих завдань на короткі порції зі збереженням проміжного результату, поріг, за якого пул розширюється замість втрати завдань.
  • Регламент під час збою — покроковий порядок на випадок масового вилучення інстансів: як перезапускається незавершена порція, як перевіряється цілісність уже порахованих результатів, хто отримує повідомлення.
  • Моніторинг — панель і оповіщення за глибиною черги, часткою успішно завершених завдань, часом очікування в черзі та частотою переривань.
  • Документація та передача — інструкція для чергового, порядок зміни конфігурацій і розбір реальних інцидентів на дзвінку з командою.

Команда може змінювати розмір пулу, пріоритети та пороги самостійно, не повертаючись до нас за кожною правкою.

Кейс: пакетний конвеєр, що падав кожні півгодини

Конвеєр на Spot Fleet обробляв десятки тисяч завдань за добу й тримався на пулі з одного типу машин в одній зоні доступності. Коли хмара забирала ємність, витіснялися відразу всі вузли: черга зупинялася, частина завдань губилася на середині кроку, решту перезапускали вручну.

Черговий витрачав на відновлення 25–40 хвилин, і такі зупинки траплялися кожні півгодини в години піку.

Що перебудували

Пул розвели за кількома типами машин і зонами — витіснення однієї групи більше не валить конвеєр повністю. Довгі завдання розбили на короткі кроки зі збереженням стану: перерваний крок повертається в чергу й продовжується з останньої контрольної точки, а не з початку.

Правило вибору ємності враховує і доступність, і ціну, а завдання, чутливі до обриву, йдуть на резервний пул.

Метрика До Після
Частка успішних проходів 71% 99,2%
Втрачені завдання за добу до 400 одиниці, і ті з черги повторів
Час перезапуску після витіснення 25–40 хвилин вручну 2–3 хвилини автоматично
Втручання чергового за добу більше 30 0–1
Повний прохід конвеєра 6–9 годин із простоями близько 4 годин без зупинок

СеверТранс Логістик: «Раніше ми чергували біля монітора й перезапускали чергу руками. Тепер про збій дізнаємося зі звіту, а не від суміжного відділу — конвеєр дожимає сам».

Чим спотовий пул відрізняється від змішаного та автомасштабування?

Це не три заміни одна одної, а три рівні однієї схеми. Спотовий пул у AWS — правило вибору ємності всередині групи, змішаний пул — та сама група, але з кількома типами інстансів, автомасштабування — управління кількістю вузлів. Їх часто ставлять як альтернативи, хоча на практиці одне налаштовують поверх іншого.

Пул з однією стратегією вибору ємності працює, поки його тип інстанса доступний: за відкликання випадає весь запас відразу, і черга завдань зупиняється.

Змішаний пул розмазує ризик — кілька типів і зон доступності зі зваженою ємністю, тому відкликання частини вузлів не валить кластер. Плата за це — різнорідні вузли, і планувальник має пакувати завдання з різними вимогами до диска й пам'яті.

Автомасштабування вирішує інше завдання: тримає кількість воркерів відповідно до попиту за метрикою довжини черги, зі step scaling і cooldown. Відкликання ємності воно не скасовує — повідомлення надходить за лічені хвилини, і завдання без чекпойнта перезапускається з нуля.

Спотовий пул без обробника повідомлень і плавного виведення вузлів просто перетворює виграш на повторну роботу.

Межа застосовності проходить за характером навантаження. Батч з ідемпотентними кроками та чекпойнтами живе на споті, а база даних, singleton-сервіс і довгий розрахунок без збереження стану — ні.

Автомасштабування не рятує й там, де вузьке місце не в кількості воркерів, а в зовнішній залежності: ліміт запитів до джерела або швидкість сховища — нові вузли лише додадуть конфліктів за один ресурс.

Обмеження спотових пулів: переривання, квоти, ємність

Спотова ємність обходиться дешевше, і її зазвичай багато, але в пулів є фізика, яку не обійти налаштуваннями. Відкликання інстанса надходить із коротким повідомленням, квота на родину обмежує одночасний набір, а вільна ємність перетікає між зонами доступності протягом дня. Нижче — часті сумніви перед перенесенням пакетної обробки на спотові пули.

Що відбувається із завданнями, коли інстанс відкликають?

Повідомлення про відкликання надходить заздалегідь: обробник на вузлі переводить його в режим завершення, пише контрольну точку кроку в спільне сховище й повертає завдання в чергу — його підхоплює інший вузол.

Це працює, якщо крок ідемпотентний і розбитий на короткі частини: тоді губиться один фрагмент розрахунку, а не все завдання.

Чи можна повністю виключити переривання?

Ні — спотова ємність завжди повертається провайдеру на вимогу, частку відкликань можна лише знизити. Допомагають вибір пулів із найбільшим залишком, розподіл за кількома родинами інстансів і зонами, запас під піки.

Для завдань із жорстким терміном тримають невеликий резервний пул на вимогу, який вмикається за нестачі спота й страхує хвіст черги.

Як ділити навантаження за зонами доступності?

Чим ширший пул за зонами, тим менший шанс, що дефіцит ємності в одній зоні зупинить всю обробку. Але квота на обчислювальні ресурси рахується на регіон і на родину інстансів, тому нова зона впирається в той самий ліміт — підвищення запитують заздалегідь. І чим ширша географія, тим більше обміну даними між зонами під час збирання результатів.

Обговоримо ваше навантаження та профіль переривань

Щоб повернутися з оцінкою та планом, а не із загальними словами, потрібен мінімум вхідних даних. Доступи та внутрішні регламенти на цьому кроці не потрібні — достатньо профілю навантаження й вимог до строків.

  • Профіль навантаження: скільки пакетних завдань запускається за добу, середня та пікова паралельність, обсяг оброблюваних даних.
  • Вимоги до строків: чи є жорстке вікно завершення обробки або залишок допустимо перенести на наступне вікно.
  • Профіль переривань: яку частку завдань можна перезапустити, а де перезапуск неприпустимий і потрібна контрольна точка.
  • Поточний стан: чи вже використовуються спотові ємності, які родини інстансів і зони доступності задіяні.
  • Робота з даними: звідки завдання читає вхідні дані й куди пише результат, чи є залежність від спільного сховища.
  • Обмеження: квоти акаунта, вимоги щодо ізоляції, вікна обслуговування, правила маркування ресурсів.
  • Критерії приймання: за якими метриками ви зрозумієте, що черга розвантажується, а вартість обробки перестала зростати.

Опишіть завдання — ми розберемо, як навантаження лягає на пул спотових ємностей, і запропонуємо порядок робіт.

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

Наші компетенції:

Останні роботи

  • Розробка сайту компанії B2B ADVANCE
    Розробка сайту компанії B2B ADVANCE
    1542
  • Розробка веб-додатків для компанії FEEDME
    Розробка веб-додатків для компанії FEEDME
    1393
  • Розробка веб-сайту для компанії БЕЛФІНГРУП
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    1081
  • Розробка інтернет магазину для компанії FURNORO
    Розробка інтернет магазину для компанії FURNORO
    1368
  • Розробка логотипу компанії B2B Advance
    Розробка логотипу компанії B2B Advance
    815
  • Розробка веб-додатків для компанії Enviok
    Розробка веб-додатків для компанії Enviok
    1139