Blog

Nedostajući swap fajl koji je zamrznuo naše servere

Dana 24. septembra jedan od naših produkcionih servera prestao je da odgovara. Load balancer ga je označio kao nezdravog, a naš alat za daljinske komande nije mogao da mu pristupi. Ali ništa se nije srušilo i ništa nije ubijeno zbog prevelike potrošnje memorije. Server se trešao: pošto nije imao swap prostor, a kontejneri su smeli da koriste više memorije nego što mašina ima, Linux je trošio vreme na izbacivanje i ponovno čitanje fajlova koji su mu bili potrebni za rad, i gotovo da nije napredovao. Dodavanje swap fajla od 2 GB na svaki server rešilo je problem. Zanimljivija lekcija ticala se health check-ova.

Kako je izgledalo „zaglavljivanje”

  • Health check-ovi load balancera na tom serveru istekli su zbog isteka vremena.
  • Komande poslate kroz AWS Systems Manager ostajale su u statusu „Pending” i nikad se nisu izvršile.
  • U logovima nije bilo ubijanja zbog nedostatka memorije. Nijedan proces nije pao.

Nedelju dana ranije prebacili smo produkciju na manje ARM servere sa po 2 GB RAM-a. Naš staging server, još manji, zamrznuo se na isti način dok je raspakovao container image tokom deploy-a.

Zašto nema greške za memoriju?

Linux ubija proces tek kada zaista ostane bez memorije koju može da povrati. Pre te tačke, oslobađa memoriju iz keš stranica, to jest kopija fajlova koje drži u RAM-u, uključujući kod svakog pokrenutog programa.

Na našim serverima zbirni limiti memorije kontejnera iznosili su oko 3,3 GB na mašini sa oko 1,8 GB upotrebljive memorije. Obično ne koriste svi svoj limit istovremeno. Kada su to ipak radili, kernel je stalno izbacivao kod programa iz keša da bi napravio mesto, a zatim ga ponovo čitao sa diska čim bi taj kod ponovo bio potreban. Taj ciklus, trešenje, može da učini mašinu gotovo potpuno neodzivnom, a da tehnički nikad ne ostane bez memorije. Zato ništa ne biva ubijeno i ništa se ne oporavlja.

Bez swap-a, kernel nema gde da smesti memoriju koja je alocirana, ali se retko koristi, pa je mora uzeti iz keša.

Rešenje

Skript za bootstrap servera sada pravi swap fajl od 2 GB sa niskom vrednošću swappiness (10) pri svakom pokretanju ili popravci servera. Niska swappiness vrednost znači da kernel i dalje radije drži radnu memoriju u RAM-u, ali retko korišćene stranice mogu da se pomere na disk, umesto da se kod programa izbacuje iz keša. Primenili smo to uživo na oba produkciona servera i na staging, a deploy pipeline pri svakom produkcionom deploy-u ponovo objavljuje bootstrap skript, tako da i zamenjen server to dobije.

Ono što nas je više zabrinulo: nezdrav server je ostao

Naša grupa servera koristila je EC2 health check-ove („da li mašina radi?”), a ne health check-ove load balancera („da li odgovara na zahteve?”). Zato je server koga je load balancer već odbacio za grupu i dalje bio zdrav. Nikad ne bi bio zamenjen. Produkcija bi tiho radila na jednom serveru, dok neko ne primeti i ne restartuje drugi.

Prebacivanje grupe na health check-ove load balancera zvuči kao očigledno rešenje, ali kod nas nije jednostavno: tokom deploy-a serveri namerno vraćaju grešku na svoj health endpoint kako bi balancer prestao da im šalje saobraćaj (vidi kako smo postigli nula 502 grešaka pri deploy-u). Grupa koja bi zamenjivala servere po tom signalu zamenila bi ih usred svakog deploy-a.

Zato smo za sada dodali korak u našu listu za deploy: posle svakog deploy-a proveravamo zdravlje svakog cilja na load balanceru, a ne samo to da li je deploy job prošao. Ako komande ka serveru ostaju u statusu „Pending”, server se trese. Restartujemo ga, jer je već van rotacije.

Šta smo iz ovoga izvukli

  • „Ne padanje” nije isto što i „zdravo”. Trešenje ne proizvodi grešku, samo usporenje toliko ekstremno da mašina prestane da odgovara.
  • Mali serveri treba da imaju swap. Čak i malo, uz nisku swappiness vrednost, daje kernelu mesto gde može da smesti hladnu memoriju.
  • Limiti memorije čiji zbir premašuje kapacitet mašine su oklada. Ponekad je izgubite. Znajte kada ste je sklopili.
  • Znajte kojoj proveri zdravlja vaše automatsko skaliranje veruje. Provera koja samo pita „da li je VM uključena?” neće zameniti server koji je prestao da radi.

Mythex · Pricing · Pravite bilo šta uz AI · Šabloni za sajtove i aplikacije · Mythex u poređenju · Rečnik pojmova za pravljenje aplikacija uz AI · Besplatni alati za pravljenje aplikacija uz AI · English

English አማርኛ العربية Български বাংলা Bosanski Català Čeština Dansk Deutsch Ελληνικά Español Español (España) Eesti فارسی Suomi Français Français (Canada) ગુજરાતી हिन्दी Hrvatski Magyar Հայերեն Bahasa Indonesia Íslenska Italiano 日本語 ქართული Қазақ тілі ಕನ್ನಡ 한국어 Lietuvių Latviešu Македонски മലയാളം Монгол मराठी Bahasa Melayu မြန်မာ Norsk bokmål Nederlands ਪੰਜਾਬੀ Polski Português (Brasil) Português (Portugal) Română Русский Slovenčina Slovenščina Soomaali Shqip Svenska Kiswahili தமிழ் తెలుగు ไทย Tagalog Türkçe Українська اردو Tiếng Việt 简体中文 繁體中文(香港) 繁體中文(台灣)