Maskinen stänger av det oviktiga innan det viktiga tar skada
Varje tjänst har en resursbudget, så att ingen kan äta någon annans. En vakt läser kärnans egen tryckmätning och fryser den lägsta nivån innan sajten blir onåbar. Kopiorna läses tillbaka varje månad på en annan maskin, och går det inte stoppas utrullningarna. Hela lagret ligger öppet, inklusive det det inte klarar.
Ingen tjänst kan äta någon annans utrymme
Ett avbrott börjar nästan aldrig med att något går sönder. Det börjar med att något oviktigt tar allt, och att det viktiga står och väntar på disken. Nivåerna gör den ordningen omöjlig, eftersom golvet under nivå 0 är hårt och nivå 2 inte har något golv alls.
Det som aldrig får dö
Sajten, inloggningen, lastbalanseraren, vägen in och övervakningen. Nivån har ett hårt minnesgolv som kärnan aldrig återvinner under, ens när den är på väg att döda något.
CPUWeight 800, alltså 78 procent av fyra kärnor under full konkurrens. Minnesgolvet är hårt.
Era tjänster och era databaser
Applikationerna, databaserna och köerna. Nivån har eget golv och egen broms, och tryckvakten rör den aldrig. Ett bygge som skenar kan därför inte ta databasen med sig.
CPUWeight 200, alltså 20 procent under full konkurrens. Eget minnesgolv, egen broms.
Bygge, batch och kopiering
Det som får ta tid. Nivån har inget minnesgolv alls, ett lästak på disken och ett processortak även när maskinen står stilla i övrigt. Det är den här nivån som stängs av först.
CPUWeight 20 och CPUQuota 200 procent. Lästak 40 MB/s genom io.max, alltså oavsett schemaläggare.
Vikterna och andelarna är räknade i ops/sjalvlakning/README.md under rubriken Aritmetiken, mot fyra kärnor under full konkurrens. Räkningen står utskriven där, så att den går att göra om för en annan maskinstorlek.
Den mäter förlorad tid, inte hur många som köar
Vakten läser kärnans tryckmätning, alltså hur lång tid uppgifter blockeras. Skillnaden mot lasttalet är hela poängen. Ett högt lasttal kan komma från fyra tunga byggen som inte stör någon. Det som gör en sajt onåbar är att disktrycket ligger uppe mot hundra procent.
- 1
Stoppar timrarna på nivå 2
Inget nytt startar. Det som redan kör fortsätter, och ingenting avbryts. Steget är riskfritt och tas därför först.
- 2
Fryser hela nivå 2
Allt som kör pausas där det står. En frusen process kan tinas och fortsätta, så ingen byggkörning behöver börja om från början.
- 3
Larmar till en människa
Vakten dödar aldrig något, och den rör aldrig nivå 0 eller nivå 1. Det är inte en inställning, eftersom en inställning är något någon förr eller senare ändrar.
Hysteresen är avsiktligt bred
Tre mätningar över stopptröskeln räcker för att stoppa, men sextio mätningar under en lägre starttröskel krävs för att släppa på igen. Utan det gapet slår vakten av och på i takt med sin egen avstängning, och då blir den en vakt någon stänger av.
Trapporna, trösklarna och hysteresen står i ops/sjalvlakning/README.md under rubriken Vad tryckvakten faktiskt gör. Vakten går att köra en gång på begäran, så att ni kan kontrollera den utan att vänta på en incident.
Rader som ser rätt ut i filen och har noll verkan i maskinen
Den farligaste sortens skydd är det som ser ut att finnas. Raderna nedan låg i en konfiguration som hade granskats, och de begränsade ingenting. Därför kontrolleras varje tak efteråt i stället för att antas, och installationen säger till när kontrollen inte hittar något värde.
IOWeight utan bfq gör ingenting
Kärnans io-styrenhet fördelar bandbredd per vikt först när schemaläggaren stödjer det, och mq-deadline, som är standard för NVMe, gör inte det. Raden ser rätt ut och begränsar ingenting. Därför sätts bfq med en egen udev-regel, och lästaket sätts dessutom med io.max, som fungerar oavsett schemaläggare.
ops/sjalvlakningEn felskriven enhetssökväg accepteras tyst
Ett lästak som pekar på en enhet som inte finns ger inget fel vid start och ingen begränsning i drift. Installationen slår därför upp rotfilsystemets faktiska blockenhet och kontrollerar efteråt att taket verkligen fick ett värde. Är filen tom gäller inget tak, och då säger installationen det.
ops/sjalvlakningKomprimerat minne som skrivs vidare till disk
En komprimerad sida i minnet är mycket billigare att hämta tillbaka än en sida från disk. Skrivs den vidare till samma disk som databaserna ligger på försvinner hela vinsten, och lasten hamnar i exakt den kö som redan är för lång. Skrivningen vidare är därför avstängd, och kärnparametrarna är satta för komprimerat minne i stället för för växling på disk.
ops/sjalvlakningEtt lästak ensamt hade räckt
En kopiering läste omkring 366 megabyte i sekunden i över trettioåtta minuter och slog ut disken för alla andra. Med lästaket på 40 megabyte i sekunden tar samma kopia av en databas på 1,3 gigabyte trettiotre sekunder. Det är hela skillnaden mellan en säkerhetskopia och ett avbrott, och den ligger i en rad.
Mätvärdena och räkningen står i ops/sjalvlakning/README.md under rubriken Vad som gick sönder, och vilken rad som lagar det.
En kopia som aldrig har lästs tillbaka är inte en kopia
En frisk databas är inget bevis på att gårdagens fil går att öppna. Beviset är att någon faktiskt läser tillbaka den, på en annan maskin än den som skrev den, och att utrullningarna stoppas när det inte har gjorts.
Motorriktig kopiering, alltså inte en filkopia av en levande databas
Återställningsprov varje månad på en annan maskin
Utrullning stoppas när provet inte har körts
Kopiornas ålder syns i instrumentpanelen
Listan är tjänsten Säkerhetskopior som den står i app/lib/katalog.ts. Motorn är restic under BSD-2-Clause.
GDR-HOST-0607
Säkerhetskopian har inte kunnat läsas tillbaka i sitt senaste prov.
Kontakta supporten innan du gör något som skriver över data. Vi har spärrat utrullningar mot den här tjänsten tills provet går igenom.
- Svarsstatus
- 409
- Allvarlighetsgrad
- critical
- Grinden stänger vid
- ett prov som är äldre än trettio dagar
Texten är hämtad ur packages/errors/src/catalog.ts. Koden ändras aldrig, eftersom den hamnar i supportärenden och i skärmbilder som kunder skickar in.
Motorriktig kopiering, inte en filkopia
En filkopia av en databas som skrivs ger en fil som öppnas utan fel och saknar de sista skrivningarna, alltså den farligaste sortens trasig kopia. SQLite kopieras därför genom databasen själv, och Postgres kopieras per databas plus rollerna, som ligger utanför varje databas.
En återställning utan roller och rättigheter ger tabeller som ingen har rätt att läsa.
En trasig kopia får aldrig skriva över en hel
Varje kopia skrivs till en tillfällig fil, kontrolleras, och växlas in först därefter. Halvvägs genom en kopiering finns alltså alltid den förra kopian kvar, orörd.
En halvskriven målfil som ser ut som en säkerhetskopia är den vanligaste vägen till att båda kopiorna är borta.
Jobbet kan inte starta ovanpå sig självt
Varje jobb tar ett lås och har en tidsgräns. Ett jobb som hänger blockerar därför nästa körning i stället för att lägga sig ovanpå den, och det avbryts när tiden är slut.
Samma jobb startat på sig självt var en av sex orsaker bakom avbrottet som paketet är skrivet ur.
Tystnad är larmet
En maskin som ligger nere kan inte berätta att den ligger nere. Därför skickar den en puls varje minut till en annan maskin, och det är uteblivna pulser som larmar. Kontrollen utifrån går dessutom samma väg som en besökare, och inte genom vårt eget nät.
Larmvägen går aldrig genom vår egen mejl
Kontroll utifrån, alltså samma väg som en besökare
Puls från maskinen, där tystnaden är larmet
Koppling till Gaddr Log utan egen agent
Larmvägen går aldrig genom vår egen mejl
Ligger mejlen nere är det precis då larmet behövs. Larmet går därför en egen väg, och når det inte fram läggs det i en kö som skickas när vägen är tillbaka. Ett larm som försvann för att larmvägen delade öde med det som larmade är inget larm.
Motorerna är Prometheus (Apache-2.0), VictoriaMetrics (Apache-2.0), OpenTelemetry Collector (Apache-2.0). Grafana körs som en egen opåverkad tjänst och vävs aldrig in i vår kod, eftersom den ligger under AGPL. Källa: app/lib/katalog.ts.

13 kontroller mellan bygget och starten
En utrullning på en maskin som redan är trång gör felet värre. Grinden kör därför 13 kontroller innan något nytt får starta, och alla 13 måste vara gröna. Den första är att grinden själv är oförändrad, eftersom de övriga bara är värda något om koden som kör dem är den vi installerade. Säger en av dem nej fortsätter den gamla versionen köra och utrullningen svarar med en kod ni kan söka på.
- 1
Lagret självt är oförändrat, kontrollerat mot ett manifest med summa, rättighet och ägare.
- 2
Trycket ligger under stopptrösklarna.
- 3
Tryckvakten har inte redan stängt av nivå 2.
- 4
Ingen process har väntat på disken i över en minut.
- 5
Över tolv procent ledigt utrymme och över tio procent lediga inoder.
- 6
Ingen strypning och ingen underspänning sedan start.
- 7
Inga trasiga systemtjänster.
- 8
Nivå 0 svarar på sina portar, alltså att tjänsten svarar och inte att behållaren kör.
- 9
Vägen in är uppe, så maskinen går att nå när något går fel.
- 10
Maskinen har inte just startat om utan att någon vet varför.
- 11
Växlingsutrymmet är inte fullt, alltså kastar inte varje ny allokering något annat först.
- 12
Tryckvakten kör och mäter. En vakt som är aktiverad men står stilla är en vakt som saknas.
- 13
Kopiorna är inom sin ålder och återställningsprovet har körts.
GDR-HOST-0603
Driftgrinden stoppade utrullningen.
Läs vilken av kontrollerna som sa nej i utrullningsloggen. En utrullning under lagringstryck gör felet värre, inte bättre.
Koden är densamma i loggen, i instrumentpanelen och i supportärendet, så att alla tre tittar på samma händelse. Så ser utrullningen ut.
Kontroll sju är den som kostade mest att lära sig
Grinden kontrollerar att tjänsten svarar på sin port, inte att behållaren kör. Den skillnaden är precis vad som gjorde att en hälsokontroll lyste grönt framför en död väg. En kontroll som mäter processen och inte svaret är en kontroll som ljuger.
Provet körs efter varje ändring
Fjorton fall, utan root och utan att röra en riktig tjänst. Ett av fallen är de exakta mätvärdena från den natt paketet skrevs ur, så att just den kombinationen aldrig ska kunna passera vakten tyst igen. Provet kontrollerar också att varje starttröskel ligger under sin stopptröskel, och att ingen tjänst står på två nivåer samtidigt.
Provet står i ops/sjalvlakning/README.md under Provet.
En maskin är en felzon, och ingen självläkning ändrar det
Går kortet, strömmen eller nätanslutningen sönder finns ingen andra maskin som tar över. Varje påstående om hög tillgänglighet kräver en andra felzon, ett mätt återställningsmål och en övervakning som inte står på samma maskin. Paketet ger de två sista. Den första köper ni.
| Vad | Vad vi kan säga i dag | Vad som krävs för mer |
|---|---|---|
| Tillgänglighet | Vi mäter den och publicerar mätningen på statussidan. | En andra felzon och en väg in som växlar över av sig själv. |
| Dataförlust, nivå 0 | Högst ett dygn tillbaka, och det är mätt och inte uppskattat. | WAL-arkivering, som tar samma tal till under en minut. |
| Dataförlust, nivå 1 | Högst ett dygn tillbaka, mätt på samma sätt. | WAL-arkivering, som ingår i tjänsten Databaser. |
| Tid till återställning | Timmar, med en människa som gör arbetet. | En varm reserv, som tar samma tal till minuter. |
| Kopiorna går att läsa tillbaka | Bevisat varje månad, på en annan maskin än den som skrev dem. | Oftare, och utan att någon startar provet. |
Tabellen är skriven för att kunna klistras in i ett avtal, och den står ordagrant i ops/sjalvlakning/README.md under rubriken Vad vi kan lova, och vad vi inte kan. Ett tal som 99,99 är ett avtalsvillkor med ett skadestånd i andra änden, och därför står inget sådant tal på den här sidan utan mätningen bakom sig.
Vägen till en andra felzon
Ordningen är vald så att varje steg ger nytta ensamt. Ni behöver inte gå hela vägen för att få något av den.
- 1
Arkivera skrivloggen till en annan plats
Ger återställning till vilken sekund som helst i stället för till senaste natten. Det kräver ingen ny maskin, och det ingår i tjänsten Databaser.
- 2
En andra maskin som bara tar emot
En maskin som tar kopiorna och skrivloggen. Den ger en plats att återställa till, och den gör det månatliga provet möjligt att köra utan att någon startar det.
- 3
Läskopia av databaserna på den maskinen
Strömmande replikering. Nu ligger data på två ställen i samma stund och inte en gång per natt.
- 4
En väg in som kan peka om
Först här får ordet redundans användas. Det är en annan produkt och ett annat pris, och det står i avtalet innan ni skriver på.
Steg ett ligger i tjänsten Databaser: WAL-arkivering, alltså återställning till vilken sekund som helst. Steg två och tre kräver en maskin till, och steg fyra är en egen produkt med ett eget pris. Läs om databaserna.
Vad drift betyder i pengar
Självläkningen körs på varje maskin, i varje plan. Det som skiljer planerna åt är hur snabbt ni når en människa när maskinen har gjort allt den kan göra själv.
| Plan | Vad ni får när det brinner | För vem | Pris |
|---|---|---|---|
| Fri | Forum och dokumentation, och samma självläkning som alla andra | Den som provar, den som bygger på fritiden, och studenten. | 0 kr |
| Utvecklare | Svarstid 8 arbetstimmar, larm till chatt eller webhook, kopior med bevisat återställningsprov | Den som har något i drift och vill kunna nå en människa. | 19 € per månad |
| Team | Svarstid 1 timme, dygnet runt, jour med telefonnummer och namn, kvarhållning 90 dagar | Ett företag med kunder som märker när något ligger nere. | 99 € per månad |
| Suverän | Avtalad svarstid med kompensation om vi missar den, och utpekad maskinvara | Myndighet, koncern och den som har ett säkerhetsskyddsavtal. | Offert |
Svarstiderna och beloppen läses ur HOSTING_PLANS i packages/pricing, och de står i samma fil som kassan läser. Hela prislistan.
Fyra saker som avgör om maskinen står kvar i morgon
Drift är inte en lovad siffra, den är fyra fysiska beroenden. Kylan fallerar först, kraften näst, disken tredje, och maskinen själv sist. Vi mäter dem i den ordningen.

Kylan är det som fallerar först när något går fel. 
Kraften har två vägar in, inte en. 
Kopian prövas genom att läsas tillbaka, inte genom att finnas. 
Maskinen mäter sig själv och fryser sin lägsta nivå.
Det ni vill veta innan ni flyttar in något viktigt
Vanliga frågor
Vad gör tryckvakten med mina tjänster?
Ingenting, om de ligger på nivå 0 eller nivå 1. Vakten stoppar timrarna på nivå 2, fryser den nivån om trycket står kvar, och larmar. Den dödar aldrig en process och den rör aldrig de två övre nivåerna. Ett bygge som frystes kan tinas och fortsätta där det stod.
Kan ett bygge ta ned vår databas?
Nej. Bygget ligger på nivå 2 med ett processortak, ett lästak på disken och inget minnesgolv. Databasen ligger på nivå 1 med eget golv. Under full konkurrens får nivå 2 två procent av kärnorna, och det taket gäller även när maskinen står stilla i övrigt.
Vad händer om en säkerhetskopia inte går att läsa tillbaka?
Provet körs på en annan maskin varje månad. Går det inte svarar vi GDR-HOST-0607 och spärrar utrullningar mot den tjänsten. Kontakta supporten innan du gör något som skriver över data. Vi har spärrat utrullningar mot den här tjänsten tills provet går igenom.
Varför stoppas vår utrullning ibland?
Driftgrinden kör 13 kontroller innan något nytt får starta, och svarar GDR-HOST-0603 när en av dem säger nej. Läs vilken av kontrollerna som sa nej i utrullningsloggen. En utrullning under lagringstryck gör felet värre, inte bättre. Kontrollerna står utskrivna längre upp på den här sidan.
Ger ni ett tal för tillgänglighet?
Vi mäter tillgängligheten och publicerar mätningen på statussidan. Ett tal som 99,99 är ett avtalsvillkor med ett skadestånd i andra änden, och ett sådant villkor skrivs i avtalet i planen Suverän och inte i en rubrik på en säljsida.
Hur mycket data kan vi förlora i värsta fall?
Med kopior en gång per dygn är svaret högst ett dygn, och det talet är mätt. Med arkiverad skrivlogg blir samma tal under en minut, och det ingår i tjänsten Databaser. Tabellen ovanför säger vilket som gäller för vad.
Kör ni allt på en maskin?
Nej, men varje enskild maskin är en felzon, och det är den punkt som avgör vad som får lovas. Ni väljer region när projektet skapas, och en tjänst som ska överleva att en hel region faller kräver att den ligger i två. Se regionerna.
Får vi läsa hur självläkningen fungerar?
Ja. Lagret ligger i ops/sjalvlakning tillsammans med sin beskrivning, sina trösklar, sin räkning och sitt prov. Där står också vad det inte klarar, eftersom ett skydd som beskrivs utan sina gränser är ett skydd ingen kan planera runt.
Larmar ni oss, eller får vi upptäcka det själva?
Larmet går ut ur maskinen och aldrig genom vår egen mejl, eftersom mejlen kan ligga nere av samma orsak. Planen Utvecklare har larm till chatt, Slack, Teams eller webhook, och planen Team har jour dygnet runt med telefonnummer och namn.
Kan vi stänga av självläkningen på våra maskiner?
Nivåerna sätts per tjänst, så ni väljer själva vad som ligger var. Det som inte går att stänga av är att en tjänst måste ligga på exakt en nivå. Två nivåer för samma tjänst betyder att radordningen avgör, och den som läser filen ser inte vilken rad som vann.
Flytta in något litet först, och läs mätningen i en vecka
Planen Fri kostar 0 kr och har samma självläkning som varje annan plan. Taket står på noll från början, så det finns ingenting att ångra.