Недоиспользование reserved-мощности
Provisioned throughput (Azure OpenAI PTUs, выделенные деплойменты у других провайдеров) — это выкупленная наперёд мощность за фиксированную цену в месяц. Экономит на пике, но если реальная нагрузка ниже выкупленной, вы платите за воздух. В отличие от pay-as-you-go, здесь никто не пришлёт «счёт вырос» — деньги списываются одинаково каждый месяц, недоутилизация не видна нигде, кроме дашборда, куда вы не заходите.
Решение — ежедневная сверка «выкуплено vs использовано» с push при устойчивой недозагрузке.
Ежедневная проверка committed vs used
Заголовок раздела «Ежедневная проверка committed vs used»Считаем среднюю утилизацию за сутки и алёртим, если несколько дней подряд она ниже порога — значит, часть 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:
это про деньги, а не про инцидент, будить среди ночи незачем.
Откуда брать used_ptu_avg
Заголовок раздела «Откуда брать used_ptu_avg»Фактическую утилизацию отдают метрики провайдера — например, Azure Monitor
по метрике Provisioned-managed Utilization. Дёрните её REST-запросом в том
же скрипте или экспортируйте в свою TSDB и читайте оттуда. Сам скрипт
удобно повесить на timer-trigger в Yandex Cloud раз в сутки — скелет в
рецепте Своя cloud-функция integrity-проверки.
Зеркальный кейс — перегрузка reserved
Заголовок раздела «Зеркальный кейс — перегрузка reserved»Обратная беда: утилизация упёрлась в 100% и запросы начали спилловером
уходить на дорогой pay-as-you-go. Добавьте вторую ветку с util >= 0.95 и
priority=8 — это уже про деньги И про latency пользователей.
Что положить в текст алёрта
Заголовок раздела «Что положить в текст алёрта»- выкуплено vs средняя фактическая утилизация (в единицах и в %);
- сколько дней подряд держится недозагрузка;
- оценку впустую потраченных денег за месяц;
- ссылку на страницу управления квотой, чтобы сократить committed.