Right-sizing віртуальних машин: оптимізація витрат без ризику

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

Right-sizing віртуальних машин: де простоюють ресурси

Майже на будь-якій інфраструктурі, старшій за рік, видно ту саму картину: профілі ресурсів виставлялися «із запасом на зростання» і відтоді не переглядалися.

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

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

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

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

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

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

Що дає вирівнювання профілю навантаження і ресурсів

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

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

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

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

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

Варіанти приведення профілю віртуальних машин до норми

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

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

Варіант Коли підходить Обмеження
Ручний перегляд профілю за метриками Стабільне навантаження, парк до десятків машин, рідкісні зміни Потрібен розбір історії за повний цикл; результат застаріває між ревізіями й залежить від того, хто дивиться
Автоматичні рекомендації за телеметрією Великий різнорідний парк, немає ресурсів на постійний ручний аналіз Радить, але не діє; якість залежить від глибини історії та наявності агента всередині гостьової системи
Гнучке масштабування за правилами Змінне навантаження з передбачуваними добовими й тижневими піками Не рятує від повільного зростання споживання пам'яті; вимагає коректного виведення вузла з обслуговування

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

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

Порядок робіт: від збору метрик до передачі регламенту

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

  1. Інвентаризація парку. Зводимо машини, їхнє призначення, власників і теги в один реєстр. Одразу позначаємо дублі та середовища, де навантаження фактично відсутнє.
  2. Зняття профілю навантаження. Накопичуємо метрики 2–4 тижні: медіана, пікові перцентилі, добові й місячні сплески, споживання пам'яті, дисковий обмін. Фіксуємо, що саме впирається в стелю.
  3. Схема цільових конфігурацій. Таблиця «поточна → цільова» із запасом під пік і обґрунтуванням за кожним класом. Узгоджуємо з власниками сервісів, а не змінюємо мовчки.
  4. Зміни. Ідемо групами: спочатку непродуктивні середовища, потім продуктивні — з вікном обслуговування, точкою відкату й критерієм зупинки.
  5. Перевірка під навантаженням. Синтетичний тест плюс спостереження за реальним трафіком після перемикання. Новий профіль порівнюємо зі знятим: якщо пік знову впирається в стелю, конфігурацію коригуємо.
  6. Передача регламенту. Віддаємо документ: як читати метрики, з якою періодичністю переглядати конфігурації, за якими правилами заводяться нові машини.

На виході залишається не разова кампанія з економії, а робоче правило: парк переглядається за метриками, тому конфігурації не «розпливаються» назад за кілька місяців.

Регламенти, схеми та політики: що передаємо команді

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

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

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

Кейс: перегляд профілів у кластері з піковим навантаженням

Кластер під високонавантаженим сервісом жив із профілями, підібраними на око: кожному сервісу видавали запас пам'яті та процесорів під найгірший сценарій.

За фактом утилізація трималася на 10–15%, а надлишкові резерви займали більше половини виділеного обсягу — при цьому в пікові години частина сервісів усе одно впиралася в ліміти й додавала затримку. Частка недоступності за квартал сягала 0,4%, і майже всі ці хвилини припадали на пік.

Що змінили і що отримали

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

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

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

Після перегляду надлишкові резерви стиснулися з 60% до 15% від виділеного обсягу, середня утилізація зросла до 40–45%, а метрики піку не просіли. 95-й перцентиль часу відгуку в години максимуму навіть знизився: сервіси перестали конкурувати за пам'ять.

Частка недоступності наступного кварталу впала до 0,05%, інциденти з нестачею пам'яті припинилися. Відкат залишався дешевим: старі профілі зберегли як конфігурацію попереднього релізу, повернення займало хвилини.

Що робити, якщо застосунок уже розгорнуто під навантаження

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

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

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

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

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

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

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

Технічні заперечення: ризики зниження ресурсів та їхнє зняття

Заперечення на розборах зазвичай ті самі: зріжемо ресурси — продуктивне середовище впаде в пік.

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

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

Як переконатися, що зниження ресурсів безпечне?

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

Що буде, якщо навантаження зросте після зміни?

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

Як часто переглядати конфігурації?

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

Де закінчується автоматизація?

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

Обговоримо задачу: зберемо профіль і повернемося з планом

Щоб right-sizing не залишився разовим зрізом, стартуємо з інвентаризації.

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

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

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

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

Опишіть задачу у двох-трьох абзацах — за цими даними повернемося з оцінкою, планом робіт і порядком впровадження.

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

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

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