{"id":13,"date":"2026-01-26T20:00:00","date_gmt":"2026-01-26T19:00:00","guid":{"rendered":"https:\/\/airex.se\/blogg\/automatisk-omstart-skada\/"},"modified":"2026-08-02T15:44:19","modified_gmt":"2026-08-02T13:44:19","slug":"automatisk-omstart-skada","status":"publish","type":"post","link":"https:\/\/airex.se\/blogg\/automatisk-omstart-skada\/","title":{"rendered":"N\u00e4r automatisk omstart g\u00f6r mer skada \u00e4n kraschen"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">En Raspberry Pi med AI-accelerator skulle r\u00e4kna bilar som passerar. Efter n\u00e5gra dagar b\u00f6rjade den bete sig obegripligt: Python segfaultade vid import, pakethanteraren kraschade, och till slut v\u00e4grade systemfiler som ingen hade r\u00f6rt att tolkas alls.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Segmentation fault\n*** stack smashing detected ***\nSyntaxError: unterminated triple-quoted string<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Det sista felet \u00e4r det som borde f\u00e5 h\u00e5ret att resa sig. En syntaxfel i en fil som ing\u00e5r i operativsystemets egen Python-installation betyder att filen p\u00e5 disk inte l\u00e4ngre \u00e4r den som paketet en g\u00e5ng levererade.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Kraschen var inte problemet. Det som gjorde skada var reparationen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Kedjan<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Acceleratorns drivrutin \u00e4r k\u00e4nslig f\u00f6r hur processer avslutas. D\u00f6r programmet p\u00e5 fel s\u00e4tt l\u00e4mnas trasigt tillst\u00e5nd kvar i systemet \u2014 och n\u00e4sta process som f\u00f6rs\u00f6ker prata med h\u00e5rdvaran \u00e4rver el\u00e4ndet och kraschar den ocks\u00e5.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Tj\u00e4nsten var satt att starta om automatiskt vid fel. Utan f\u00f6rdr\u00f6jning. Allts\u00e5:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Programmet kraschar och l\u00e4mnar trasigt tillst\u00e5nd efter sig.<\/li>\n<li>Tj\u00e4nstehanteraren startar det igen omedelbart.<\/li>\n<li>Det nya programmet m\u00f6ter samma trasiga tillst\u00e5nd och kraschar direkt.<\/li>\n<li>Tillbaka till steg tv\u00e5 \u2014 hundratals g\u00e5nger i timmen.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Varje varv skrev minnes\u00f6verskrivningar \u00f6ver det som r\u00e5kade ligga bredvid. Med tillr\u00e4ckligt m\u00e5nga varv n\u00e5dde skadan bibliotek och filer som inte hade med projektet att g\u00f6ra. Det som b\u00f6rjade som ett programfel slutade som ett skadat operativsystem.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Reparationen<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">En omstart av maskinen r\u00e4ckte inte, vilket \u00e4r sj\u00e4lva po\u00e4ngen: trasigt <em>minne<\/em> f\u00f6rsvinner vid omstart, trasiga <em>filer<\/em> g\u00f6r det inte.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Systemets Python-baspaket fick installeras om. En detalj som kostade tid: paketverktyget hade en hj\u00e4lpkomponent som i sig kraschade p\u00e5 korruptionen och blockerade hela reparationen. Den fick flyttas undan tillf\u00e4lligt, paketen installeras om, och komponenten sedan s\u00e4ttas tillbaka. Klassisk moment 22 \u2014 verktyget du beh\u00f6ver f\u00f6r att laga systemet \u00e4r en del av det som \u00e4r trasigt.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Fixen som betyder n\u00e5got<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Tre rader i tj\u00e4nstedefinitionen, och de f\u00f6rtj\u00e4nar att f\u00f6rklaras var f\u00f6r sig:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>V\u00e4nta en halv minut f\u00f6re omstart.<\/strong> Det ger drivrutinen tid att st\u00e4da upp efter sig innan n\u00e4sta process kommer och knackar p\u00e5.<\/li>\n<li><strong>Ge upp efter ett par f\u00f6rs\u00f6k<\/strong> inom ett givet tidsf\u00f6nster. En tj\u00e4nst som misslyckas tre g\u00e5nger p\u00e5 fem minuter kommer inte att lyckas p\u00e5 det fj\u00e4rde. Den ska stanna nere och larma.<\/li>\n<li><strong>Starta om drivrutinen f\u00f6rst<\/strong> n\u00e4r tj\u00e4nsten v\u00e4l ska ig\u00e5ng igen, s\u00e5 att den b\u00f6rjar fr\u00e5n ett k\u00e4nt tillst\u00e5nd.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Det f\u00f6rsta man t\u00e4nker p\u00e5 n\u00e4r n\u00e5got kraschar \u00e4r hur man f\u00e5r ig\u00e5ng det igen. Det man borde t\u00e4nka p\u00e5 \u00e4r hur man <em>begr\u00e4nsar<\/em> antalet f\u00f6rs\u00f6k.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">De tre f\u00e4llorna p\u00e5 v\u00e4gen dit<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Innan det ens gick att k\u00f6ra stabilt fanns tre problem som \u00e4r v\u00e4rda att spara f\u00f6r den som h\u00e5ller p\u00e5 med samma sorts h\u00e5rdvara.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Importordningen spelar roll.<\/strong> Acceleratorns bibliotek och bildbehandlingsbiblioteket drog in olika versioner av samma kryptoberoende. Importerades de i fel ordning blev resultatet segfault eller en odefinierad symbol \u2014 inte ett felmeddelande som pekar p\u00e5 orsaken. L\u00f6sningen var att alltid importera h\u00e5rdvarubiblioteket f\u00f6rst, i varenda fil.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>St\u00e4da inte upp f\u00f6r hand efter ett bibliotek som g\u00f6r det \u00e5t dig.<\/strong> Aktiveringen av n\u00e4tverksgruppen returnerar ett objekt som ska hanteras med <code>with<\/code>. Anropar man avaktiveringen manuellt f\u00e5r man en segfault i st\u00e4llet f\u00f6r ett felmeddelande.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Modellens utdata var inte det jag antog.<\/strong> N\u00e4tverket hade efterbehandlingen inbyggd och returnerade en lista med en array per klass, med varierande antal rader. Att f\u00f6rs\u00f6ka g\u00f6ra det till en rektangul\u00e4r matris fungerar ibland \u2014 n\u00e4mligen precis s\u00e5 l\u00e4nge alla klasser r\u00e5kar ha lika m\u00e5nga tr\u00e4ffar.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">S\u00e5 vet du att det funkar<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Att tj\u00e4nsten k\u00f6rde i tio minuter bevisar ingenting \u2014 det gjorde den innan ocks\u00e5.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Framkalla en krasch med flit<\/strong> och se vad som h\u00e4nder. Startar tj\u00e4nsten om direkt, eller v\u00e4ntar den? Ger den upp efter n\u00e5gra f\u00f6rs\u00f6k?<\/li>\n<li><strong>Titta i loggen efter omstartsm\u00f6nster<\/strong>, inte bara efter felmeddelanden. M\u00e5nga snabba omstarter \u00e4r i sig ett larm, \u00e4ven om varje enskild ser oskyldig ut.<\/li>\n<li><strong>Kontrollera systemets h\u00e4lsa efter\u00e5t.<\/strong> G\u00e5r pakethanteraren att k\u00f6ra? G\u00e5r det att importera standardbiblioteken? Skadan visar sig ofta n\u00e5gon annanstans \u00e4n d\u00e4r den orsakades.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Vad jag tar med mig<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Automatisk omstart \u00e4r en reparationsmetod som vilar p\u00e5 ett antagande: att felet var tillf\u00e4lligt. N\u00e4r felet i st\u00e4llet l\u00e4mnar skadat tillst\u00e5nd efter sig blir omstarten inte en r\u00e4ddning utan en f\u00f6rst\u00e4rkare \u2014 och ju snabbare den sker, desto st\u00f6rre blir skadan.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Det g\u00e4ller precis lika mycket n\u00e4r det \u00e4r jag eller en agent som g\u00f6r omstarten. Att svara p\u00e5 en krasch med att f\u00f6rs\u00f6ka igen \u00e4r samma beteende som tj\u00e4nstehanteraren har, bara l\u00e5ngsammare. Fr\u00e5gan som \u00e4r v\u00e4rd n\u00e5got \u00e4r inte &#8221;hur f\u00e5r jag ig\u00e5ng den&#8221; utan &#8221;varf\u00f6r dog den, och vad l\u00e4mnade den efter sig&#8221;.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Och s\u00e5 det som g\u00e4ller all h\u00e5rdvara n\u00e4ra metallen: det finns inget s\u00e5dant som en oskyldig krasch n\u00e4r koden pratar direkt med en accelerator. F\u00f6rdr\u00f6jning och en gr\u00e4ns f\u00f6r antalet f\u00f6rs\u00f6k borde vara standard fr\u00e5n b\u00f6rjan, inte n\u00e5got man l\u00e4gger till efter att ha installerat om operativsystemet.<\/p>\n\n","protected":false},"excerpt":{"rendered":"<p>En kraschande tj\u00e4nst startades om direkt, om och om igen, tills operativsystemets egna filer var skadade. Om AI-acceleratorer, omstartspolicy och skillnaden mellan att laga och att f\u00f6rst\u00e4rka.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2],"tags":[],"class_list":["post-13","post","type-post","status-publish","format-standard","hentry","category-drift"],"_links":{"self":[{"href":"https:\/\/airex.se\/blogg\/wp-json\/wp\/v2\/posts\/13","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/airex.se\/blogg\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/airex.se\/blogg\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/airex.se\/blogg\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/airex.se\/blogg\/wp-json\/wp\/v2\/comments?post=13"}],"version-history":[{"count":1,"href":"https:\/\/airex.se\/blogg\/wp-json\/wp\/v2\/posts\/13\/revisions"}],"predecessor-version":[{"id":17,"href":"https:\/\/airex.se\/blogg\/wp-json\/wp\/v2\/posts\/13\/revisions\/17"}],"wp:attachment":[{"href":"https:\/\/airex.se\/blogg\/wp-json\/wp\/v2\/media?parent=13"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/airex.se\/blogg\/wp-json\/wp\/v2\/categories?post=13"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/airex.se\/blogg\/wp-json\/wp\/v2\/tags?post=13"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}