Blog

Den manglende swap-fil, der frøs vores servere

Den 24. september holdt en af vores produktionsservere op med at svare. Load balanceren markerede den som usund, og vores fjernkommando-værktøj kunne ikke nå den — men intet var gået ned, og intet var blevet dræbt for at bruge for meget hukommelse. Serveren thrashede: uden swap-plads, og med containere tilladt at bruge mere hukommelse, end maskinen havde, brugte Linux sin tid på at fjerne og genindlæse de filer, den havde brug for for at køre, og kom næsten ingen vegne. At tilføje en 2 GB swap-fil på hver server løste det. Den mere interessante lektie handlede om health checks.

Hvordan "hængt" så ud

  • Load balancerens health checks timede ud på den server.
  • Kommandoer sendt gennem AWS Systems Manager stod i "Pending" og blev aldrig kørt.
  • Der var ingen out-of-memory-dræbning i logs. Ingen proces døde.

En uge tidligere havde vi flyttet produktion til mindre ARM-servere med 2 GB RAM hver. Vores staging-server — endnu mindre — var frosset på samme måde under udpakning af et container-image under en udrulning.

Hvorfor ingen hukommelsesfejl?

Linux dræber kun en proces, når den reelt er løbet tør for hukommelse, den kan genvinde. Før det punkt genvinder den hukommelse fra page cache — kopierne af filer, den holder i RAM, herunder koden for hvert kørende program.

På vores servere lagde containernes samlede hukommelsesgrænser sig op til omkring 3,3 GB på en maskine med omkring 1,8 GB brugbar. Normalt bruger de ikke alle deres grænse på én gang. Når de gjorde, blev programkode hele tiden fjernet fra cachen af kernen for at skabe plads, og så skulle den læses tilbage fra disken i samme øjeblik, koden kørte igen. Den cyklus — thrashing — kan gøre en maskine næsten fuldstændig uresponsiv, uden at den teknisk set løber tør for hukommelse. Så intet bliver dræbt, og intet kommer sig.

Uden swap har kernen ingen steder at placere hukommelse, der er allokeret, men sjældent brugt, så den må tage den fra cachen i stedet.

Rettelsen

Serverens bootstrap-script opretter nu en 2 GB swap-fil med en lav swappiness-indstilling (10) hver gang en server starter eller repareres. Lav swappiness betyder, at kernen stadig foretrækker at holde arbejdshukommelse i RAM, men sjældent berørte sider kan flyttes til disken i stedet for at tvinge programkode ud af cachen. Vi anvendte det live på begge produktionsservere og staging, og udrulningspipelinen udgiver bootstrap-scriptet igen ved hver produktionsudrulning, så en udskiftet server også får det.

Det der bekymrede os mere: den usunde server blev

Vores servergruppe brugte EC2 health checks — "kører maskinen?" — ikke load balancer health checks — "svarer den på forespørgsler?". Så en server, load balanceren havde givet op på, var stadig sund set fra gruppens perspektiv. Den ville aldrig blive erstattet. Produktion ville stille og roligt køre på én server, indtil nogen lagde mærke til det og genstartede den anden.

At skifte gruppen til load balancer health checks lyder som den åbenlyse rettelse, men det er ikke ligetil for os: under en udrulning svarer servere bevidst deres health-endpoint med en fejl, så balanceren dræner dem (se hvordan vi fik udrulninger ned til nul 502'er). En gruppe, der erstatter servere på det signal, ville erstatte dem midt i hver udrulning.

Så for nu tilføjede vi et trin til vores udrulningstjekliste: efter hver udrulning, tjek hvert mål's health på load balanceren, ikke kun om udrulningsjobbet bestod. Hvis kommandoer til en server står i "Pending", thrasher den — genstart den; den er allerede ude af rotation.

Det vi tog med

  • "Ikke gået ned" er ikke "sund". Thrashing giver ingen fejl, kun langsomhed så ekstrem, at maskinen holder op med at svare.
  • Små servere har brug for swap. Selv lidt, med lav swappiness, giver kernen et sted at placere kold hukommelse.
  • Hukommelsesgrænser, der lægger sig op til mere end maskinen, er et væddemål. Nogle gange taber du det. Vid, hvornår du har lavet det.
  • Ved hvilket health check din autoskalering stoler på. Et health check, der kun spørger "er VM'en tændt?", erstatter ikke en server, der er holdt op med at virke.

Mythex · Pricing · Byg hvad som helst med AI · Skabeloner til websites og apps · Mythex sammenlignet · Ordliste for app-bygning med AI · Gratis værktøjer til app-bygning med AI · English

English አማርኛ العربية Български বাংলা Bosanski Català Čeština 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 Srpski Svenska Kiswahili தமிழ் తెలుగు ไทย Tagalog Türkçe Українська اردو Tiếng Việt 简体中文 繁體中文(香港) 繁體中文(台灣)