11. Luento: Vikasietoisuus Tommi Mikkonen, tommi.mikkonen@tut.fi
Agenda Vikasietoisuuden käsitteistöä Vikasietoisuuden saavuttaminen Ohjelmisto- ja laitteistovioista Vika-analyysi Esimerkkejä Vikasietoisuuden luokittelua Käynnistys ja uudelleenkäynnistys Ohjelmistotyö ja ylläpito suorituksen aikana Yhteenveto
Käsitteistö ei vakiintunut kaikilta osin Vika (fault): Matalimman tason poikkeuksellinen toiminta Virhe/virhetila (error): Vian seurauksena aiheutuva järjestelmän poikkeuksellinen tila Virhetoiminto (failure): Järjestelmän väärä toiminta virhetilanteessa
Turvallisuus- ja elävyysominaisuudet Turvallisuus (safety): Järjestelmä ei tee mitään sellaista mitä se ei saisi tehdä Elävyys (liveness): Laite tekee jotakin
Vikasietoisuuden eri muodot Turvallisuus säilyy Elävyys säilyy Peittävä vikasietoisuus Elävyys ei säily Vikaturvallinen Turvallisuus ei säily Ei-peittävä vikasietoisuus Ei vikasietoisuutta
Vikasietoisuuden saavuttaminen Välttämätön ehto on varautua vikaan; geneeristä vikasietoisuusmoduulia ei ole! Tapoja useita Datan redundanssi (kaikkea tietoa ei tarvita suorituksessa); erilaiset pariteettijärjestelmät, tarkistussummat jne. Ohjelmakoodin redundanssi (erilaiset vikaantumistestit); tyypillisesti koodissa haaroja jotka ovat ylimääräisiä, defensiivinen ohjelmointi yleisenä käytäntönä
Esimerkki int i = 0; while (1) { // Jotain ihmeellistä tekemistä i++ if (i == 10) break; // Ihmeellinen laskenta jatkuu }
Esimerkki int i = 0; while (1) { // Jotain ihmeellistä tekemistä i++ if (i >= 10) break; // Ihmeellinen laskenta jatkuu }
Vikojen havaitsemisesta Virhetarkastelut Tarkistussummat Assertiot Vahtikoira (watchdog)/pulssi (heartbeat) Joskus molemmat; toinen tarkkailee ohjelman suorituksessa oloa ja toinen laskennan etenemistä tms.
Ongelmia Jatkuva tarkistussummalaskenta vie aikaa Virhetarkastelut rikkovat helposti ohjelmalogiikan, kun yhtenään joudutaan tarkastelemaan tuliko virheitä Poikkeuskäsittely on kallista Esim. normaali paluu 1/10000 ajasta verrattuna paluuseen poikkeuskäsittelijän kautta
Laitteistovioista Tyypillisesti transientti (toiminto ei onnistu yhdellä kertaa esim. ulkoisten häiriöiden takia mutta laitteessa ei kuitenkaan vikaa) Laitteisto voi sisältää logiikan tämän hoitamiselle Redundanssi vaatii laitteiden monistamista tai suunnittelua siten että yksittäisen signaalin virhe ei aiheuta virhettä Yleensä siis ylimääräistä laitteistoa! Ongelma: Jos 2 laitetta jotka ovat eri mieltä, kumpi oikeassa?
N+1- ja 2Nvaralaitteistomallit N+1: Varalaite on yleensä kylmä joten se pitää lämmittää ; vain 1 varalaite koko järjestelmälle 2N: Varalaite voi suoraan matkia päälaitetta; jokaisella laitteella oma kopionsa
Ohjelmistoviat Ohjelmiston sisäinen redundanssi Vaatii täydellisyyteen saakka vietynä eri menetelmiin perustuvan toteutuksen Sitten äänestys oikeasta tuloksesta Defensiivinen ohjelmointi
Defensiivinen ohjelmointi Laatu yleensä: Lähtökohtainen pyrkimys korkeaan laatuun; ei tilaa ohjelmointivirheille Ohjelmakoodin luettavuus: Toiminta pystytään varmentamaan helpommin esimerkiksi katselmoinnein Oletusten vähyys: Minimoidaan oletukset, joiden varaan ohjelman toiminta rakentuu; esim. varmistetaan että ohjelma toimii kaikilla syötearvoilla HUOM: Defensiivinen ohjelmointi ei välttämättä pure täysin aikakäyttäytymiseen, jossa oletuksia joudutaan väistämättä tekemään!
Vika-analyysi Vikasietoisuus vain etukäteen tunnistettuja vikoja kohtaan Analysoidaan mahdolliset viat Miten vikaan voidaan reagoida Miten viasta voidaan toipua
Esimerkki Sähkönsyöttö katoaa Akut kunnossa Aggrekaatti käynnistyy Aggrekaatti käynnistyy Siirrytään käsiajanottoon OK OK 30min jonka jälkeen käsiajanotto Pieni katkos, Ei ongelmia tuloksissa Tulokset viivästyvät mutta ne saadaan Tuloksia katoaa, kisoja tai sarjoja hylätään
Joitakin esimerkkijärjestelmiä Avaruussukkula 5 tietokonetta (laitteistoviat) 2 valmistajan ohjelmat (ohjelmistoviat) Ariane 5 avaruusraketti Alun perin määrittelyvirhe; raja-arvon ylittyminen johti siihen että laitteiston uskottiin olevan vialla ja se sammutettiin Syöksyi lopulta turvallisesti mereen
Vikaturvallisuuden luokittelua Taso 1: Normaalin toiminnan vikatilanteet Normaalit pikkuviat, esim. muistitilan ylittyminen, levyn täyttyminen Laitteistoviat transientteja Diagnostiikkajärjestelmä; käynnistystestit ainakin muisteille Taso 2: Vikaturvallinen toipuminen Vaatii tyypillisesti uudelleenkäynnistämisen vian havaitsemisen ja siitä toipumisen jälkeen Käyttöjännitteen seuranta, vahtikoira tms.
Luokittelu jatkuu Taso 3: ei-peittävä itsestabiloituva vikasietoisuus Esimerkkitapaus vikaantuneen muistin hallinta: Virhe tunnistetaan pariteettikentästä, ja vikaantunut muisti poistetaan käytöstä. Korjaus pysyvä jos muistin vaihto vaikeaa, muuten laite voi ilmoittaa huoltotarpeesta Muita vastaavia tapauksia ovat esim. ohjausvirheet ja ympäristön yllättävä käytös. Taso 4: peittävä vikasietoisuus Tärkeimät laitteet (tai osa niistä) monistettu Ongelmatilanteessa varayksikkö olemassa ja valmis astumaan remmiin nopeasti Esim. RAID, tietoliikenneyhteyksien monistaminen
Luokittelu jatkuu edelleen Taso 5: Korjaus konetta sammuttamatta Vain pieni parannus edelliseen; myös lopullinen korjaus konetta sammuttamatta Taso 6: Kaikkien laitteiden varmistus Kaikki laitteet monistettu Esim. Suurehko puhelinkeskus (pienemmät tasoja 4 ja 5) Taso 7: Koneiden monistaminen Eli siis kuten 6 mutta joka yksikkö laskee oman tuloksen ja valittu tulos saadaan äänestämällä tms. Käytännössä harvinaisia
Käynnistys ja uudelleenkäynnistys Käynnistys on aina erikoistilanne Oheislaitteet eivät ole käynnissä -> Ohjauselektroniikka saattaa tulkita tiloja miten haluaa (kytkennöistä toki riippuen, hyvällä elektroniikkasuunnittelulla voidaan saada ihmeitä aikaan!) Ulkoisten liittymien tulee toimia turvallisesti; ei satunnaiskäyttäytymistä edes käynnistyksen aikana Yleissääntöä turvalliseen käynnistämiseen ilman laitteistotukea ei ole; ohjelmoija voi toki luoda lisää ongelmia väärillä alustusrutiineilla Ajossa olevan järjestelmän käynnistys (varsinkin esim. jotain aktiivisesti ohjaavan) on muutenkin harkittava huolellisesti vaikkei ohjelmoijien mielenkiinto ja ohjelmointityyli työläitä tarkistuksia suosisikaan
Ohjelmistotyö ohjelman suorituksen aikana Järjestelmä voi olla jatkuvasti käytössä Alasajo ei vaihtoehto, jos toimintaa ei saa keskeyttää Ainoa mahdollisuus toteuttaa ylläpitotoimenpiteen ajon aikana Ääritapauksisssa sekä ohjelmisto- että laitteistotuki tarpeen
Ohjelmiston muuntelu suorituksen aikana Yksinkertainen tapaus: Parametrein tapahtuva ohjaus Esim. joku diagnostiikkaa häiritsevä toiminto kytketään pois päältä diagnostiikan käytön ajaksi Paikko-ohjelmistot (patch) Joku muistialue varataan patcheille Uudelleenkäynnistys/initialisointi jolloin patchit ladataan käyttöön Joskus voidaan toteuttaa komponentti kerrallaan, jolloin saadaan aikaiseksi hienorakeisempi päivitettävyys Joskus koko ohjelmiston uudelleenlataus ja uudelleenkäynnistys DISCLAIMER: Lähtökohtaisesti mitä ilmeisimmin virheherkkääeikämissään nimessäsuositeltava yleinen käytäntö
Laitteistotuesta Laitteisto voi olla rakennettu siten, että se sallii kahden ohjelmiston ajamisen rinnakkaisesti kahdella eri tietokoneella Tällöin ohjelmisto voidaan päivittää tietokoneeseen A, ja päivityksen + toiminnan varmentamisen aikana tietokone B hoitaa toimintaa Jos A vaikuttaa toimivan hyvin, myös B voidaan päivittää Yleensä huomioitu järjestelmätason vaatimuksissa Ongelma: Mitä jos vanhaa versiota ajava B vikaantuu kun A:ta ollaan päivittämässä?
Yhteenveto Vikasietoinen järjestelmä kykenee jatkamaan toimintaansa itsenäisesti myös silloin kun siinä on vikaa Vikaturvallisen järjestelmän suunnittelussa on huomioitu erikseen ettei vikaantumisesta ettei tule vaaraa Vikasietoisuus voi kohdistua vain vikoihin jotka on otettu huomioon osana suunnittelua Ohjelmistojen sisäisen vikasietoisuuden toteutuskeinoina Ohjelman toiminnan tarkkailu Defensiivinen ohjelmointi