Optymalizacja sprzętu i zasobów
Krótkie podsumowanie
Optymalizacja nie polega na „przyśpieszeniu jednej rzeczy”, ale na równoważeniu wydajności, a kosztu i niezawodności. Podstawowe kroki: Zmierz SLI/SLO i profile, znajdź wąskie gardła, „odpowiednio wymiarowe” możliwości, automatyczne skalowanie i ulepszenia kotwicy w obrazach/wykresach/politykach.
Cele i zasady
Od UX do sprzętu: począwszy od SLO (p95 opóźnienia, sukces operacji) → szukanie ograniczającego zasoby.
Prawowitość: rodzaje zasobów i instancji dla charakteru obciążenia.
Gotówka i bliskość: zmniejszyć „drogie” wycieczki do magazynu i sieci.
Automatyzacja: autoskalowanie, polityka cyklu życia, IaC.
Obserwowalność: metryki czterosygnałowe, profile CPU/alloc, śledzenie.
Bezpieczeństwo = wydajność: mTLS/podpisy/limity - sprzęt przyspieszony w miarę możliwości.
Procesor i harmonogram
Zadania: zminimalizować zawartość i brak pamięci podręcznej, wziąć pod uwagę NUMA i przerwy.
Świadomość NUMA: szpilkowanie przez węzły ('numactl --cpunodebind --membind'), dla baz danych/brokerów - naprawić na węźle.
IRQ/softirq: dystrybucja przez rdzenie (RSS/RPS), bezpieczne gorące kolejki dla procesora bez konkurowania z pracownikami.
Hiperflow: dla „latency sensitive” - naprawić pracowników na rdzeni fizycznych.
Przełączniki kontekstowe: zmniejszyć poprzez długie kolejki/rzeź/asynchron.
Kompilatory/JIT: obejmują profile PGO/LTO (C/C + +), Graal/HotSpot (Java), 'GOMAXPROCS' oraz przydział pracowników (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
Zarządzanie pamięcią i alokacją
Strony: dla JVM/DB - zwykle wyłączyć THP i używać uścisków ręcznie (zmniejsza braki TLB).
Saldo NUMA: dla Statious - commit pamięci do lokalnego węzła.
- JVM: G1/ZGC, '-Xms = -Xmx' równe, rozsądne 'MaxGCPaz Millis'.
- Idź: „GOGC” (zaczynając od 100-200), unikaj niepotrzebnych przydziałów, profile „pprof”.
- Python: użyj 'uvloop', 'asyncio', rozszerzeń C, puli połączeń.
- Swap/zswap: w sprzedaży, zwykle swap off na usługi krytyczne; na węzły ogólnego przeznaczenia - zswap dla „miękkich” ładunków.
Przechowywanie i I/O
Typy dysków: NVMe dla gorącej ścieżki, oddzielne puli dla dzienników/punktów kontrolnych/tempo.
FS: XFS dla dużych plików/dzienników DB; ext4 dla małych/wszechstronnych.
RAID/EC: RAID10 dla niskich opóźnień, RAID6/EC dla danych na zimno.
Harmonogramy: „brak ”/„ mq-termin” dla NVMe.
Async/Batch: rekordy grupy, użyj Zapisz-Za/Grupa-Commit.
bash fio --name=randread --filename=/data/test --size=20G --bs=4k \
--iodepth=64 --rw=randread --ioengine=libaio --numjobs=4 --time_based --runtime=60
Sieć
MTU i offload: 9000 MTU w centrum danych (jeśli końcowy), włączyć GRO/LRO, gdzie dozwolone.
RSS/RPS/RFS: wielokanałowe kolejki na NIC, rozkład według rdzeni; irqbalance - pod kontrolą.
SO_REUSEPORT: skalowalne gniazda słuchowe rozłożone na rdzenie.
Czasy klienta i pociągnięcia: krótki TCP utrzymuje się przy życiu, limit otwartych połączeń, ciśnienie wsteczne.
TLS: TLS 1. 3, instrukcje sprzętowe AES-NI, wznowienie sesji, zszywanie OCSP.
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 (w stosownych przypadkach)
GPU: zwalczanie nadużyć finansowych, zalecenia, CV; monitorować 'util', 'mem', 'sm _ efficiency'.
SmartNIC/eBPF/DPDK: L4/L7 odciążenie, filtrowanie, telemetria bez przejścia do jądra.
Profile energetyczne: naprawić częstotliwości dla stabilnego opóźnienia; unikać agresywnego oszczędzania mocy.
Aplikacje i RDBMS
Puli połączeń: limit 'max _ conns', zastosuj połączenie pooling (PgBouncer/Hikari).
Indeksy/harmonogramy: WYJAŚNIJ/PRZEANALIZUJ profile obejmujące indeksy, partycje.
Buforowanie: pamięć podręczna Redis/in-process, CDN dla statyków, pamięć podręczna krawędzi dla gorących API.
Idempotencja i kolejki: unikać kaskad rekolekcji, włączyć dedup.
Gzip/Brotli: kompresja odpowiedzi z uwzględnieniem kosztów procesora; wybierz równowagę.
Kontenery i kubernety
Żądania/Ograniczenia pakowania bin
Żądania = "gwarancja", limity = "pułap. "Nieprawidłowe limity przez CPU → throttling i p99.
Weź pod uwagę obciążenia wybuchowe (turniej/szczyty meczu) - margines w p95.
Pakowanie bin: oddzielne baseny hosta (latency-crit, batch, GPU, spot). Stosuj topologię (anty-powinowactwo, rozprzestrzenianie się).
Autoskalowanie
HPA według niestandardowych mierników (RPS/p95, a nie procesora).
VPA dla „długotrwałych” i „poza szczytem” pracowników.
Cluster Autoscaler + poszczególne grupy węzłów (na żądanie/na miejscu).
KEDA dla obciążeń imprez (kolejki, Kafka, cron).
Harmonogram i menedżerowie
Menedżer procesora: „statyczny” do przypinania pełnych rdzeni do zasilaczy krytycznych dla opóźnień.
Topologia Menedżer NUMA wyrównanie.
Wtyczki do urządzeń: dla DB/niskiego opóźnienia i 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 i koszty
Profile taryfowe: wybierz instancje według CPU/RAM/disk/network (zoptymalizowane obliczenia, zoptymalizowane pamięć, zoptymalizowane).
Spot/Preemptible: dla partii/postoju/buforów z nadmiarowością wielostrefową.
Rezerwacja/Oszczędności: rezerwy na 1-3 lata dla „stałej” części.
Hot/cold: magazyn wielopoziomowy, obiekt archiwalny, retencja dziennika.
Zasoby bezczynności: nocne/weekendowe przystanki środowisk innych niż krytyczne.
Efektywność energetyczna
Profile zasilania: wydajność vs zrównoważone przez usługę.
Współusytuowanie: zagęszczanie w zimnych godzinach, wyłączanie niewykorzystanych węzłów.
KPI: wat na życzenie, p95/watt, CO, CO, mierniki dostawcy.
Obserwowalność i badania
Метрика: CPU steal/throttle, 'cycles/instructions', LLC miss, RSS/working set, page faults, disk years p95/99, NIC drops, retransmits.
Śledzenie: rozłożone szlaki dla „złotych ścieżek”.
Profilowanie: eBPF/Perf/Flamegrafy, 'pprof '/YourKit/JFR.
Testy obciążenia: zorientowane na SLO, z prawdziwą mieszanką operacji, fazą „rozgrzewania”, wtryskiem uszkodzenia.
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)
Lista kontrolna optymalizacji
- Zdefiniowano SLO i złote ścieżki (API/płatności/wypłaty).
- Zebrane profile sieci CPU/alloc/IO/, znaleziono wąskie gardła top-N.
- NUMA/IRQ/RSS są skonfigurowane w węzłach o krytycznym opóźnieniu.
- THP off (w razie potrzeby), przytulenia dla usług DB/Java.
- NVMe dla gorących danych, XFS/sched IO skonfigurowane, fio-bench potwierdzone.
- Stos sieciowy: MTU, RPS/RFS, SO_REUSEPORT; timeouts/baseny.
- Kubernetes: Żądania poprawne, Limity nie stłumić, HPA według wskaźników biznesowych, VPA/CA zawarte.
- Buforowanie i CDN na „drogich” ścieżkach; Pamięć podręczna Redis/edge.
- FinOps: rightsizing/reserves/spot pools; zatrzymanie bezczynności środowiska.
- Autotest wydajności w CI, regresje na p95/p99.
iGaming/specyficzne dla fintechu
Zaplanowane szczyty: turnieje/mecze/promocje → „elastyczna” pula frontów, wstępne ocieplenie buforów/CDN, HPA przez RPS/opóźnienie.
Płatności i płatności: indywidualne IP/domeny „złota”, kolejki priorytetowe, izolacja zasobów (tains/tolerancje), rezerwa bazowa.
Przeciwciała/przeciwpiechotne: modele ciężkie - na GPU-pracowników; ocena online ≤ 50 ms p95; pamięci podręcznej funkcji.
Regulacja: niezmienne dzienniki i szyfrowanie nie powinny łamać SLO - włączyć przyspieszenia sprzętowe i asynchroniczne rurociągi.
Mini playbooks
• opóźnienie po zwolnieniu:1. Sprawdź prędkość spalania SLO; 2) profile „cpu/alloc”; 3) flaga wsteczna/funkcyjna; 4) zwiększenie repliki/pamięci podręcznej API; 5) RCA i mocowanie testowe.
Obciążenie szczytowe (mecz/turniej):1. Ogrzewanie CDN/cache; 2) podnosić minReplicas; 3) zawierają limity rozerwania; 4) kolejki pocztowe; 5) włączyć tryb tylko do odczytu dla funkcji wtórnych.
Częste błędy
Limity CPU „udusić” szczytowe obciążenia robocze → wysokie p99.
Nieprawidłowy węzeł: wymieszać opóźnienia krytyczne i partii.
Brak ustawień NUMA/IRQ w bazach danych/brokerach.
„Leczenie objawów” (dodanie procesora) zamiast mocowania algorytmów/buforów/SQL.
HPA przez procesor zamiast RPS/latency → wagi późno.
Brak testów wydajności w CI → regresja w prod.
Razem
Optymalizacja to zadanie systematyczne: zmierzyć SLI/SLO, profil, naprawić algorytmy, tune hardware (NUMA/IRQ/IO/network), „rozmiar” zasoby poprawnie i zautomatyzować skalowanie. Przechwytywanie ulepszeń w szablonach (obrazy, wykresy, polityka), kosztach kontroli i energii - a Twoja platforma pozostanie szybka, ekonomiczna i zrównoważona nawet na skrajnych szczytach.