Optymalizacja wydajności produkcyjnej
W zeszłym tygodniu Twoja usługa checkout odpowiadała w 200 ms. Dziś w nocy, w godzinach szczytu, p99 utrzymuje się na poziomie 3 sekund, konwersja spada, a kanał dyżuru jest zalany czerwonymi alertami. Masz otwarte trzy dashboardy i nie wiesz, który sygnał jest przyczyną, a który objawem. To moment, w którym asystent AI podpięty do Twojego klastra i backendu obserwowalności zarabia na siebie: w jednym przebiegu zestawi metryki podów, ślady i wolne zapytania, zamiast zmuszać Cię do przeskakiwania między narzędziami.
Ten przewodnik pokazuje inżynierom DevOps i SRE, jak prowadzić takie dochodzenie w Cursorze, Claude Code i Codeksie — każdy podpięty do tych samych serwerów MCP Kubernetes i obserwowalności — oraz jak przekuć ustalenia w zmianę, którą można bezpiecznie wdrożyć.
Co z tego wyniesiesz
Dział zatytułowany „Co z tego wyniesiesz”- Działającą konfigurację MCP łączącą Cursor, Claude Code i Codex z Kubernetes, Twoim backendem obserwowalności i Postgresem
- Gotowy do wklejenia prompt do diagnozy regresji opóźnienia p99 w wielu usługach
- Gotowy do wklejenia prompt do naprawy wyczerpania puli połączeń pod obciążeniem szczytowym
- Gotowy do wklejenia prompt do dostrojenia zachowania Horizontal Pod Autoscalera (HPA), żeby przestał oscylować
- Listę kontrolną „gdy to się posypie” dla trybów awarii, które psują dostrajanie wspomagane AI (przeterminowane metryki, zmyślone liczby, optymalizacje, które regresują pod rzeczywistym ruchem)
Niezbędne serwery MCP do pracy nad wydajnością
Dział zatytułowany „Niezbędne serwery MCP do pracy nad wydajnością”Te serwery są takie same we wszystkich trzech narzędziach — konfiguracja MCP jest identyczna niezależnie od tego, czy używasz Cursora, Claude Code, czy Codeksa. Skonfiguruj je raz. Uchwyty poniżej (@kubernetes, @dynatrace, @last9, @postgres) pojawiają się w promptach w całym przewodniku.
Kubernetes — metryki klastra i stan podów
Dział zatytułowany „Kubernetes — metryki klastra i stan podów”Zainstaluj raz, a potem wskaż serwerowi swój kubeconfig:
npm install -g kubectl-mcp-server{ "mcpServers": { "kubernetes": { "command": "npx", "args": ["-y", "kubectl-mcp-server"], "env": { "KUBECONFIG": "/path/to/kubeconfig" } } }}Postgres — analiza wolnych zapytań i plany EXPLAIN
Dział zatytułowany „Postgres — analiza wolnych zapytań i plany EXPLAIN”Użyj utrzymywanego serwera postgres-mcp (crystaldba), który działa przez uvx i odczytuje connection string ze zmiennej DATABASE_URI. Do debugowania na produkcji startuj w trybie ograniczonym (tylko do odczytu):
{ "mcpServers": { "postgres": { "command": "uvx", "args": ["postgres-mcp", "--access-mode=restricted"], "env": { "DATABASE_URI": "postgresql://user:password@localhost:5432/dbname" } } }}Backend obserwowalności — ślady i APM
Dział zatytułowany „Backend obserwowalności — ślady i APM”Wybierz ten, którego już używasz. Oba to prawdziwe, utrzymywane pakiety. Uwierzytelnianie to część, którą ludzie psują najczęściej, więc dokładna konfiguracja jest poniżej — i oba domyślnie idą ścieżką wymagającą minimum poświadczeń.
{ "mcpServers": { "dynatrace": { "command": "npx", "args": ["-y", "@dynatrace-oss/dynatrace-mcp-server@latest"], "env": { "DT_ENVIRONMENT": "https://<env-id>.apps.dynatrace.com" } } }}Gdy ustawisz tylko DT_ENVIRONMENT, uwierzytelnianie przy pierwszym użyciu odbywa się przez przepływ OAuth Authorization Code w przeglądarce — to udokumentowana ścieżka domyślna, więc zwykle ta jedna zmienna wystarcza. Nieinteraktywny DT_PLATFORM_TOKEN jest wspierany jako opcjonalna alternatywa dla konfiguracji headless lub CI.
Ścieżka rekomendowana przez twórców to hostowany endpoint HTTP, który używa OAuth w przeglądarce i nie potrzebuje żadnych zmiennych środowiskowych:
claude mcp add --transport http last9 \ https://app.last9.io/api/v4/organizations/<org_slug>/mcpJeśli wolisz lokalny binarny serwer stdio, potrzebuje on dokładnie jednej zmiennej — refresh tokena:
{ "mcpServers": { "last9": { "command": "npx", "args": ["-y", "@last9/mcp-server@latest"], "env": { "LAST9_REFRESH_TOKEN": "<write_refresh_token>" } } }}Wygeneruj LAST9_REFRESH_TOKEN (z uprawnieniem Write, tylko dla administratorów) w Settings → API Access pod adresem app.last9.io/settings/api-access — nie na stronie integracji OTLP. Jedyna inna zmienna to opcjonalny LAST9_API_HOST (domyślnie app.last9.io), dla hostów zarządzanych samodzielnie.
Diagnozowanie regresji opóźnienia p99
Dział zatytułowany „Diagnozowanie regresji opóźnienia p99”To chleb powszedni: coś zwolniło i musisz znaleźć przyczynę przed kolejnym skokiem ruchu. Pomysł na prompt jest w każdym narzędziu ten sam, ale sposób wywołania się różni — Cursor używa uchwytów @ w panelu agenta, a Claude Code i Codex przyjmują żądanie w wierszu poleceń.
W panelu agenta wskaż serwery MCP po uchwycie, żeby Cursor pobrał dane na żywo zamiast zgadywać:
@kubernetes @last9 Our checkout-service p99 jumped from 200ms to 3sduring peak hours (18:00–21:00 UTC). Correlate the regression:
1. Pull checkout-service pod CPU/memory for the last 24h and flag the time the p99 climbed.2. From traces, identify which downstream span grew the most.3. Check the Redis cache hit rate over the same window.4. Tell me which signal is the cause and which are symptoms.
Do not propose fixes yet — I want the diagnosis and the evidence first.Uruchom go headless z terminala; Claude Code wywołuje te same serwery MCP:
claude "Using the kubernetes and last9 MCP servers, diagnose why \checkout-service p99 jumped from 200ms to 3s during 18:00-21:00 UTC. \Correlate pod CPU/memory, the slowest downstream trace span, and the \Redis cache hit rate. Identify cause vs symptom with evidence. \Do not propose fixes yet."Codex przyjmuje prompt pozycyjnie i sięga do serwerów MCP w ten sam sposób. Na czas diagnozy trzymaj go w trybie tylko do odczytu:
codex --ask-for-approval on-request "Using the kubernetes and last9 \MCP servers, diagnose the checkout-service p99 regression (200ms -> 3s, \18:00-21:00 UTC). Correlate pod CPU/memory, the slowest downstream span, \and the Redis cache hit rate. Report cause vs symptom with evidence only."Sens ramy „najpierw diagnoza, żadnych poprawek” polega na tym, żeby powstrzymać model przed przeskoczeniem do wiarygodnie brzmiącego lekarstwa, zanim przeczyta dane. Chcesz, żeby zacytował poda, span i okno metryki — liczby, które sam potwierdzisz na dashboardzie.
Naprawa wyczerpania puli połączeń
Dział zatytułowany „Naprawa wyczerpania puli połączeń”Klasyczna awaria godzin szczytu: usługi rzucają błędami too many clients, opóźnienie zapytań skacze z 50 ms do sekund, a wąskim gardłem jest baza danych — nie dlatego, że jest wolna, ale dlatego, że połączenia są na głodzie. AI dobrze się tu sprawdza, bo matematyka (rozmiar puli × liczba replik vs max_connections) jest mechaniczna, a model może odczytać Twoje aktualne ustawienia z klastra.
-
Pobierz aktualną konfigurację puli i limit Postgresa.
@kubernetes @postgres Eight services share one Postgres instance.Each runs pool min=5/max=25. During peak we get connection timeoutsand "too many clients" errors. Read the current replica counts fromthe cluster and the database max_connections, then tell me how manyconnections we actually demand at peak vs what the DB allows.Okno terminala claude "Using the kubernetes and postgres MCP servers, read the \replica count for each service and Postgres max_connections. Compute \peak connection demand (pool max x replicas, summed) vs the limit. \Show the arithmetic."Okno terminala codex --ask-for-approval on-request "Using the kubernetes and \postgres MCP servers, compute peak Postgres connection demand \(pool max x replicas per service, summed) against max_connections. \Show the arithmetic and where it overflows." -
Poproś o konkretną konfigurację, a nie o wykład. Gdy model ma już liczby, każ mu zaproponować konkretne rozmiary puli i konfigurację PgBouncera — z uzasadnieniem powiązanym z Twoją liczbą replik.
-
Wdróż i obserwuj. Wprowadź zmianę najpierw w jednej usłudze, obserwuj metryki liczby połączeń i wskaźnika błędów przez najbliższy szczyt, a potem poszerzaj.
Dostrajanie autoskalowania, które oscyluje
Dział zatytułowany „Dostrajanie autoskalowania, które oscyluje”Gdy HPA skaluje w górę agresywnie, ale w dół powoli — albo szarpie się co kilka minut — przepalasz pieniądze i wciąż nie nadążasz za skokami. Naprawa zwykle tkwi w oknach stabilizacji i metryce, na której skaluje się HPA, a AI może odczytać Twoje aktualne obiekty HorizontalPodAutoscaler i rozumować o zachowaniu, które opisujesz.
@kubernetes Our HPAs flap: payment-service scales up at CPU 70%(min=3/max=10) but CPU spikes to 95% before scaling triggers, andscale-down happens every 2-3 minutes. Read the current HPA specs,explain why it's reactive, and propose new behavior.scaleUp /behavior.scaleDown stabilizationWindowSeconds plus a target metricthat anticipates load better than raw CPU.claude "Using the kubernetes MCP server, read the HorizontalPodAutoscaler \specs. payment-service scales at CPU 70% but spikes to 95% before \triggering and scales down every 2-3 min. Propose behavior.scaleUp / \scaleDown stabilizationWindowSeconds and a better target metric. \Output the patched HPA YAML."codex --ask-for-approval on-request "Using the kubernetes MCP server, \read the HPA specs and fix the flapping payment-service HPA (CPU 70% \target, spikes to 95%, scales down every 2-3 min). Propose scaleUp/ \scaleDown stabilizationWindowSeconds and a request-rate target metric. \Output patched YAML; do not apply it."Dobra odpowiedź daje Ci tutaj realny blok behavior — na przykład krótkie okno scaleUp (około 60 s) i dłuższe okno scaleDown (300 s+), żeby klaster przestał skakać w górę i w dół — plus sugestię skalowania na podstawie wskaźnika żądań lub metryki niestandardowej zamiast samego CPU, bo CPU opóźnia się za faktycznym obciążeniem.
Gdy to się posypie
Dział zatytułowany „Gdy to się posypie”Praca nad wydajnością wspomagana AI zawodzi w konkretny, rozpoznawalny sposób. Poznaj te przypadki, zanim zaufasz rekomendacji na produkcji.
- Serwer MCP nie może dosięgnąć klastra lub backendu. Jeśli asystent zwraca mgliste, zaokrąglone metryki („około 95% CPU”) zamiast wartości ze znacznikami czasu, niemal na pewno odpowiada z danych treningowych, a nie z Twoich. Potwierdź połączenie:
claude mcp listpokazuje skonfigurowane serwery w Claude Code, a panel ustawień MCP w Cursorze pokazuje status zielony/czerwony dla każdego serwera. Uruchom prompt ponownie dopiero, gdy dane faktycznie płyną. - Zmyślone metryki. Nawet przy żywym połączeniu model może wymyślić liczbę, by zapełnić lukę w wyniku zapytania. Traktuj każdą wartość jak twierdzenie do zweryfikowania na źródłowym dashboardzie, zanim na jej podstawie zadziałasz. Instrukcja „cytuj dokładne wartości i znaczniki czasu” z powyższych promptów istnieje właśnie po to, żebyś mógł to sprawdzić.
- Optymalizacja zregresowała pod rzeczywistym obciążeniem. Zmiana, która świetnie wygląda na stagingu, może się rozsypać przy produkcyjnej współbieżności — mniejsza pula połączeń, która jest w porządku przy 1 tys. żądań/s, głoduje przy 5 tys. Wprowadzaj zmiany najpierw w jednej usłudze lub jednej replice, obserwuj przez prawdziwy szczyt i trzymaj poprzednią konfigurację o jedno
kubectl rollout undood siebie. - Model zoptymalizował niewłaściwą rzecz. Jeśli pominiesz krok „najpierw diagnoza”, asystent z radością dostroi objaw. Gdy poprawka nie rusza kluczowej metryki, wróć do promptu diagnostycznego i każ mu ponownie uszeregować przyczynę vs objaw na świeżych danych.
Co dalej
Dział zatytułowany „Co dalej”- Praca z bazami danych z AI — głębsze przepływy MCP Postgresa do pracy ze schematem i zapytaniami
- Najlepsze praktyki MCP — zawężanie poświadczeń i zarządzanie konfiguracjami serwerów w różnych narzędziach
- Reagowanie na incydenty z AI — przekuwanie diagnozy w postmortem i zabezpieczenie