Перейти к содержимому

Недоиспользование reserved-мощности

Provisioned throughput (Azure OpenAI PTUs, выделенные деплойменты у других провайдеров) — это выкупленная наперёд мощность за фиксированную цену в месяц. Экономит на пике, но если реальная нагрузка ниже выкупленной, вы платите за воздух. В отличие от pay-as-you-go, здесь никто не пришлёт «счёт вырос» — деньги списываются одинаково каждый месяц, недоутилизация не видна нигде, кроме дашборда, куда вы не заходите.

Решение — ежедневная сверка «выкуплено vs использовано» с push при устойчивой недозагрузке.

Считаем среднюю утилизацию за сутки и алёртим, если несколько дней подряд она ниже порога — значит, часть PTU можно сократить.

import os, json, time, requests
NOTIFLY_URL = os.environ["NOTIFLY_URL"]
NOTIFLY_TOKEN = os.environ["NOTIFLY_TOKEN"]
COMMITTED_PTU = 100 # сколько единиц выкуплено
COST_PER_PTU = 260.0 # $/мес за единицу (пример)
MIN_UTIL = 0.60 # ниже 60% средней утилизации = недоиспользование
DAYS_TO_CONFIRM = 3 # столько дней подряд подтверждают вывод
STATE = os.path.expanduser("~/.reserved-capacity.json")
def notify(title, msg, prio):
requests.post(f"{NOTIFLY_URL}/message",
params={"token": NOTIFLY_TOKEN},
json={"title": title, "message": msg, "priority": prio},
timeout=5)
def load_state():
if os.path.exists(STATE):
return json.load(open(STATE))
return {"low_days": 0, "last_day": ""}
def daily_check(used_ptu_avg):
"""used_ptu_avg — средняя фактическая утилизация за сутки (из метрик провайдера)."""
day = time.strftime("%Y-%m-%d")
st = load_state()
if st["last_day"] == day: # уже считали сегодня — не дублируем
return
util = used_ptu_avg / COMMITTED_PTU
if util < MIN_UTIL:
st["low_days"] += 1
else:
st["low_days"] = 0
st["last_day"] = day
json.dump(st, open(STATE, "w"))
if st["low_days"] >= DAYS_TO_CONFIRM:
wasted = (COMMITTED_PTU - used_ptu_avg) * COST_PER_PTU
notify(
f"📉 Reserved-мощность простаивает: {util:.0%}",
f"{DAYS_TO_CONFIRM} дня подряд утилизация < {MIN_UTIL:.0%}. "
f"Впустую ≈${wasted:,.0f}/мес — сократите committed PTU.",
priority=6,
)
# использование: подставьте среднюю утилизацию из Azure Monitor / метрик провайдера
daily_check(used_ptu_avg=48)

Порог по нескольким дням подряд (DAYS_TO_CONFIRM) отсекает разовые спокойные выходные — реагируем только на устойчивый тренд. priority=6: это про деньги, а не про инцидент, будить среди ночи незачем.

Фактическую утилизацию отдают метрики провайдера — например, Azure Monitor по метрике Provisioned-managed Utilization. Дёрните её REST-запросом в том же скрипте или экспортируйте в свою TSDB и читайте оттуда. Сам скрипт удобно повесить на timer-trigger в Yandex Cloud раз в сутки — скелет в рецепте Своя cloud-функция integrity-проверки.

Обратная беда: утилизация упёрлась в 100% и запросы начали спилловером уходить на дорогой pay-as-you-go. Добавьте вторую ветку с util >= 0.95 и priority=8 — это уже про деньги И про latency пользователей.

  • выкуплено vs средняя фактическая утилизация (в единицах и в %);
  • сколько дней подряд держится недозагрузка;
  • оценку впустую потраченных денег за месяц;
  • ссылку на страницу управления квотой, чтобы сократить committed.