Simptom ≠ Uzrok: Kako je auto-healer postao pravi problem
PostgreSQL primary na 91 % CPU. Auto-healer ubija najglasniji query. Sat kasnije: opet 91 %. Lekcija: brza rešenja mogu se zaključati u petlju ako niko ne pita koji se obrazac ponavlja.
PostgreSQL primary sa 91 % CPU. Auto-healer ide svakih 5 minuta, pronalazi najglasniji query, šalje pg_cancel_backend(), i load pada na 35 %. Sat kasnije: opet 91 %. Healer kikuje sledeći query. Opet 35 %. Opet sat. Opet 91 %.
Moglo bi se reći da „sistem radi". Ne radi. Troši CPU cikluse boreći se sa simptomom koji nikada ne razume.
Momenat iskrenosti
Posle tri ciklusa smo prestali. Umesto da dodatno tunujemo healer, postavili smo pitanje koje je trebalo postaviti od početka: Šta vraća load?
Odgovor, nakon 20 minuta audita: 14 različitih backend endpoint-a poziva istu agregaciju preko 1,4 miliona redova — COUNT(*) FILTER (...) — bez cache lock-a. Na svakom cache miss-u, osam paralelnih uvicorn worker-a istovremeno pali isti skup query-ja. Thundering herd.
Healer je bio u pravu da postoje upiti koji ne bi trebali biti aktivni. Healer je bio u krivu što ih ubistvo rešava. Problem je bio što je 14 klijenata istovremeno zgrabilo istu kravu za mužu.
Šta je umesto toga bilo potrebno
- Po cache ključu tačno jedan lock. Koristili smo Redis
SET NX EXkao distributed-lock plusasyncio.Lockpo worker-u za lokalni short-circuit. - Pronađena su 14 endpoint-a, tri kritična su odmah popravljena, ostalih jedanaest dokumentovano sa rokom.
- Healer nismo tunovali. Healer uopšte nije bio problem.
Posle fix-a: CPU load stabilno na 53 %. Nema više eskalacija. Nije potreban nijedan healer ciklus.
Meta-lekcija
Svaki sistem ima tačku na kojoj simptom deluje zanimljivije od uzroka. Simptom je glasan, vidljiv i može se „rešiti" kratkim skriptom. Uzrok sedi tri sloja apstrakcije niže, nema ime i zahteva da neko stvarno razume podsistem.
Pravilo koje sebi postavljamo kod svakog ponovljenog incidenta:
„Ako sada uradimo ovu popravku — šta sprečava da za sat vremena opet budemo ovde?"
Ako odgovor nije jasan, planirana popravka nije popravka. To je potiskivač simptoma, i sistem će naći drugi, glasniji način da signalizira isti uzrok.
Primena van baza
Isti obrazac poznaje svaki senior inženjer:
- Flaky test? Slepi retry u CI-ju je potiskivanje simptoma. Test otkriva pravu race condition.
- Memory leak? Pod restart svakih 6h je potiskivanje simptoma. Leak u međuvremenu žvaće korisničke podatke.
- Bounce rate na dugmetu? A/B test s novom bojom je potiskivanje simptoma. Feature ne rešava korisnički problem.
Kod svakog ponovljenog problema: identifikuj pet potrošača pogođenog podsistema i proveri obrazac tamo — ne samo na mestu gde je alert bio glasan.