Оптимизация железа и ресурсов
Краткое резюме
Оптимизация — это не «ускорить что-то одно», а сбалансировать производительность ↔ стоимость ↔ надежность ↔ энергию. Базовые шаги: измерить SLI/SLO и профили, найти узкие места, «правильно размерить» мощности, автоматизировать масштабирование и закрепить улучшения в образах/чартах/политиках.
Цели и принципы
От UX к железу: начинаем от SLO (p95 latency, успех операций) → ищем лимитирующий ресурс.
Правильный размер (rightsizing): ресурсы и типы инстансов под характер нагрузки.
Кэш и близость: уменьшайте «дорогие» походы к хранилищам и сетям.
Автоматизация: autoscaling, политики жизненного цикла, IaC.
Наблюдаемость: метрики «четырех сигналов», профили CPU/alloc, трейсинг.
Безопасность = производительность: mTLS/подписи/лимиты — с аппаратным ускорением где возможно.
CPU и планирование
Задачи: минимизировать контеншен и кэш-промахи, учесть NUMA и прерывания.
NUMA-осведомленность: pinning по узлам (`numactl --cpunodebind --membind`), для БД/брокеров — фиксировать на узле.
IRQ/softirq: распределить по ядрам (RSS/RPS), закрепить горячие очереди за CPU без конкуренции с воркерами.
Гиперпоточность: для «чувствительных к латентности» — фиксировать воркеры на физических ядрах.
Контекст-свитчи: уменьшать через длинные очереди/батчинги/асинхрон.
Компиляторы/JIT: включить PGO/LTO (C/C++), Graal/HotSpot профили (Java), `GOMAXPROCS` и выделение воркеров (Go).
bash
IRQ affinity: bind NIC queue to specific CPU echo 2 >/ proc/irq/XX/smp_affinity # kernel mask
Softirq balance on sysctl -w net network cores. core. netdev_budget=600 sysctl -w net. core. netdev_max_backlog=5000
Память и управление аллокациями
THP/HugePages: для JVM/DB — обычно отключить THP и использовать hugepages вручную (уменьшает TLB-промахи).
NUMA-баланс: для stateful — фиксировать память на локальном узле.
- JVM: G1/ZGC, `-Xms=-Xmx` равные, разумный `MaxGCPauseMillis`.
- Go: `GOGC` (начать с 100–200), избегать лишних аллокаций, профили `pprof`.
- Python: использовать `uvloop`, `asyncio`, C-расширения, пул соединений.
- Swap/zswap: на проде обычно swap off для критичных сервисов; на узлах общего назначения — zswap для «мягких» нагрузок.
Хранение и I/O
Типы дисков: NVMe под hot-path, отдельные пулы для логов/чекапоинтов/темпа.
ФС: XFS для больших файлов/БД-журналов; ext4 для маленьких/универсальных.
RAID/EC: RAID10 для низких задержек, RAID6/EC — под холодные данные.
I/O-планировщики: `none`/`mq-deadline` для NVMe.
Async/Batch: группируйте записи, используйте Write-Behind/Group-Commit.
bash fio --name=randread --filename=/data/test --size=20G --bs=4k \
--iodepth=64 --rw=randread --ioengine=libaio --numjobs=4 --time_based --runtime=60
Сеть
MTU и offload: 9000 MTU в датацентре (если end-to-end), включить GRO/LRO там, где допустимо.
RSS/RPS/RFS: многоканальные очереди на NIC, распределение по ядрам; irqbalance — под контроль.
SO_REUSEPORT: масштабируемые listen-сокеты с распределением по ядрам.
Клиентские таймауты и пуллинги: короткие TCP-keepalive, лимит открытых коннектов, backpressure.
TLS: TLS 1.3, аппаратные инструкции AES-NI, session resumption, OCSP stapling.
bash sysctl -w net. core. rmem_max=268435456 sysctl -w net. core. wmem_max=268435456 sysctl -w net. ipv4. tcp_rmem="4096 87380 134217728"
sysctl -w net. ipv4. tcp_wmem="4096 65536 134217728"
GPU/FPGA/SmartNIC (где уместно)
GPU: инференс антифрода, рекомендации, CV; следить за `util`, `mem`, `sm_efficiency`.
SmartNIC/eBPF/DPDK: разгрузка L4/L7, фильтрация, телеметрия без переходов в ядро.
Энергопрофили: фиксировать частоты под стабильную латентность; избегать агрессивных power-save.
Приложения и РСУБД
Пулы соединений: ограничить `max_conns`, применять connection pooling (PgBouncer/Hikari).
Индексы/планировщики: профили EXPLAIN/ANALYZE, покрывающие индексы, партиционирование.
Кэширование: Redis/ин-процесс кэш, CDN для статики, edge-кэш для «горячих» API.
Идемпотентность и очереди: избегайте каскадов ретраев, включайте dedup.
Gzip/Brotli: компрессия ответов с учетом CPU-стоимости; выбирайте баланс.
Контейнеры и Kubernetes
Requests/Limits и bin-packing
Requests = «гарантия», Limits = «потолок». Неверные Limits по CPU → throttling и p99.
Учитывайте burst-нагрузки (пики турниров/матчей) — запас в p95.
Bin-packing: разделяйте пулы узлов (latency-crit, batch, GPU, spot). Используйте топологию (anti-affinity, spread).
Автомасштабирование
HPA по кастомным метрикам (RPS/p95, а не CPU).
VPA для «долгоживущих» и «непиковых» ворклоадов.
Cluster Autoscaler + отдельные node-группы (on-demand/spot).
KEDA для событийных нагрузок (очереди, Kafka, cron).
Планировщик и менеджеры
CPU Manager: `static` для пиннинга полных ядер latency-критичным подам.
Topology Manager: выравнивание по NUMA.
HugePages/Device Plugins: для БД/низкой латентности и GPU/FPGA.
yaml apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: { name: api-gw }
spec:
scaleTargetRef:
apiVersion: apps/v1 kind: Deployment name: api-gw minReplicas: 6 maxReplicas: 60 metrics:
- type: Pods pods:
metric:
name: http_latency_p95_ms target:
type: AverageValue averageValue: 120
FinOps и стоимость
Профили тарифов: подобрать инстансы по CPU/RAM/диску/сети (compute-optimized, memory-optimized, storage-optimized).
Spot/Preemptible: для batch/стейджинга/кешей с мультизонной избыточностью.
Reservation/Savings: резервы на 1–3 года для «постоянной» части.
Горячо/холодно: tiered-storage, объектка для архивов, ретеншн логов.
Idle-ресурсы: ночные/уикенд-остановки не-критичных окружений.
Энергоэффективность (GreenOps)
Power profiles: performance vs balanced по сервисам.
Ко-размещение: уплотнение в «холодные» часы, выключение неиспользуемых узлов.
KPI: ватт на запрос, p95/ватт, CO₂-метрики провайдера.
Наблюдаемость и тестирование
Метрики: CPU steal/throttle, `cycles/instructions`, LLC miss, RSS/working set, page faults, disk lat p95/99, NIC drops, retransmits.
Трейсинг: распределенные трейсы для «золотых путей».
Профилирование: eBPF/Perf/Flamegraphs, `pprof`/YourKit/JFR.
Нагрузочные тесты: SLO-ориентированные, с реальным mix операций, фазой «прогрева», fault-инъекцией.
promql
CPU throttling доля sum(rate(container_cpu_cfs_throttled_seconds_total[5m])) by (pod)
/ sum(rate(container_cpu_usage_seconds_total[5m])) by (pod)
Network loss sum (rate (node_net_dropped_total[5m])) by (instance)
Чек-лист оптимизации
- Определены SLO и «золотые пути» (API/платежи/выплаты).
- Профили CPU/alloc/IO/сети собраны, найдены top-N узких мест.
- NUMA/IRQ/RSS настроены на latency-критичных узлах.
- THP off (при необходимости), hugepages для БД/Java-сервисов.
- NVMe под горячие данные, XFS/IO-sched настроены, fio-бенч подтвержден.
- Сетевой стек: MTU, RPS/RFS, SO_REUSEPORT; таймауты/пулы.
- Kubernetes: Requests корректны, Limits не душат, HPA по бизнес-метрикам, VPA/CA включены.
- Кэширование и CDN на «дорогих» путях; Redis/edge-кэш.
- FinOps: rightsizing/резервы/spot-пулы; остановка idle-окружений.
- Автотесты производительности в CI, регрессии на p95/p99.
Специфика для iGaming/финтех
Пики по расписанию: турниры/матчи/акции → «эластичный» пул фронтов, пред-прогрев кэшей/CDN, HPA по RPS/латентности.
Платежи и выплаты: отдельные «золотые» IP/домены, приоритетные очереди, изоляция ресурсов (taints/tolerations), резерв по базе.
Антибот/антифрод: heavy-модели — на GPU-воркерах; онлайн-скоринг ≤ 50 мс p95; кэш фичей.
Регуляторика: неизменяемые логи и шифрование не должны ломать SLO — включайте аппаратные ускорения и асинхронные пайплайны.
Мини-плейбуки
Латентность ↑ после релиза:1. Сверить burn-rate SLO; 2) профили `cpu/alloc`; 3) откат/фичфлаг; 4) увеличить реплики/API-кэш; 5) RCA и фиксация теста.
Пиковая нагрузка (матч/турнир):1. Прогреть CDN/кэш; 2) поднять minReplicas; 3) включить burst-лимиты; 4) разнести очереди; 5) включить read-only-режим для второстепенных функций.
Типичные ошибки
Limits CPU «удушают» пиковые ворклоады → высокий p99.
Неправильный пул узлов: смешивают latency-критичные и batch.
Отсутствие NUMA/IRQ-настроек на БД/брокерах.
«Лечим симптомы» (добавляем CPU) вместо исправления алгоритмов/кэшей/SQL.
HPA по CPU вместо по RPS/latency → скейлится поздно.
Нет тестов производительности в CI → регрессии в проде.
Итог
Оптимизация — это системная работа: измеряйте SLI/SLO, профилируйте, исправляйте алгоритмы, настраивайте железо (NUMA/IRQ/IO/сеть), «правильно размерьте» ресурсы и автоматизируйте масштабирование. Закрепляйте улучшения в шаблонах (образы, чарты, политики), контролируйте стоимость и энергию — и ваша платформа останется быстрой, экономной и устойчивой даже в экстремальные пики.