Onze watchdog heeft de services opnieuw gestart die we bewust hadden gestopt

Ops

Eén van onze watchdogs start elke service die is ingeschakeld maar niet draait. Twee keer in oktober startte hij services die we bewust hadden gestopt. De tweede keer kregen bezoekers van een van onze sites ongeveer 45 minuten lang fouten te zien.

Waarom die watchdog bestaat

Een service die netjes afsluit bij SIGTERM, bijvoorbeeld omdat iets hem bij naam heeft afgesloten, wordt door systemd niet als "failed" gemarkeerd. Restart=on-failure start hem niet opnieuw op, en systemctl --failed toont hem niet. Hij blijft down totdat iemand het toevallig merkt. De watchdog zoekt daarom naar services die zijn ingeschakeld maar niet draaien, en start ze.

Het probleem is dat een service die je handmatig hebt gestopt er precies hetzelfde uitziet.

De eerste keer

Op 7 oktober stopten we een video-worker met systemctl stop om 12:47 om zijn wachtrij te bewerken. Om 12:55 draaide hij weer: de watchdog had hem gestart.

De tweede keer

Op 21 oktober hadden we het geheugen nodig van de machine die ook twee van onze sites bedient voor een modeltest. Een script stopte de webapps van de sites, een sync-job en een databasecontainer, opnieuw met systemctl stop. Ongeveer vijf minuten later bracht een timer die de sites bewaakt, en om 19:14 de watchdog, de tunnel en de webapps weer terug.

De tunnel nam weer verkeer over, maar de webapps konden niet antwoorden: het geteste model hield 114 GiB van het geheugen van de machine vast. Van ongeveer 19:14 tot 20:00 kregen sommige bezoekers 502-fouten. Om 20:00 schakelden we de tunnel, de webapps en de sync-job uit, en stopten we de bewaaktimer.

De regel die we nu gebruiken

Twee extra systemd-valkuilen uit dezelfde maanden

Factory Floor houdt ingeschakelde services bij die niet draaien. Standaard meldt het ze alleen, en start het ze alleen als je dat inschakelt. Sinds versie 1.0.3 vermeldt de melding ook hoe je een service bewust pauzeert, en het runbook zegt hetzelfde.

Bijgewerkt: