W Y D A W N I C T W O P O L I T E C H N I K I Ś L Ą S K I E J W G L I W I C A C H ZESZYTY NAUKOWE POLITECHNIKI ŚLĄSKIEJ 2018 Seria: ORGANIZACJA I ZARZĄDZANIE z. 130 STRATEGIE TOLEROWANIA BŁĘDÓW W CZASIE PRACY SYSTEMU INFORMATYCZNEGO Ireneusz J. JÓŹWIAK 1, Jakub LEGUT 2 1 Wydział Informatyki i Zarządzania, Politechnika Wrocławska, Wrocław; ireneusz.jozwiak@pwr.edu.pl 2 Wydział Informatyki i Zarządzania, Politechnika Wrocławska, Wrocław; jakub-legut@wp.pl Streszczenie: W artykule przedstawiono metody detekcji błędów w czasie pracy systemu informatycznego. Wskazano, że techniki unikania błędów powinny być wspomagane przez narzędzia sprzętowe i programowe. W pracy zaproponowano strategię tolerowania błędów w czasie pracy systemu informatycznego. Opisano w jaki sposób identyfikuje się obszary problemowe oraz jak na ich podstawie określić można cele związane z ograniczeniem występowania błędów. Słowa kluczowe: system informatyczny, diagnostyka, tolerowanie błędu, redundancja. STRATEGIES OF TOLERATING ERRORS IN COMPUTER SYSTEM WORKING Abstract: This article presents methods of detecting errors in computer science systems during their work. It shows, that techniques of avoiding errors should be supported by program tools and processing equipment. Article offers : strategy of tolerating errors in computer science systems, describes how to find problematic areas and suggest how to define targets, that could eliminate appearing errors. Keywords: computer system, diagnostics, tolerating error, redundancy. 1. Wprowadzanie Powszechność systemów komputerowych praktycznie w każdej dziedzinie naszego życia sprawiła, że jesteśmy coraz bardziej uzależnieni od poprawności działania tych systemów. Coraz więcej rzeczy, czy decyzji opartych jest o systemy informatyczne, a w zasadzie o ich niezawodność. Jest to niewątpliwie podstawowy problem podczas eksploatacji dzisiejszych https://www.polsl.pl/wydzialy/roz/strony/zeszytynaukowe.aspx
286 I.J. Jóźwiak, J. Legut systemów informatycznych. Działanie większości takich systemów zależy od tego w jaki sposób zostały zaprogramowane przez człowieka i na jakim sprzęcie pracują. Współcześnie od systemów informatycznych oczekuje się stabilności i poprawnej pracy, czyli wiarygodności poprawności ich działania. Jest to możliwe do osiągnięcia, ale zależy to od wielu czynników. W pracy rozważa się metody detekcji błędów w czasie pracy systemu informatycznego. Opracowano strategię unikania błędów, wykrywania ich, a także ich tolerowania, gdy zaistnieją. 2. Detekcja błędów Projektując systemy informatyczne należy zadbać, aby nie pojawiały się błędy w trakcie pracy systemu lub o to, aby prawdopodobieństwo ich wystąpienia było możliwie jak najmniejsze (Wykrywanie błędów, 20.04.2018). Aby to osiągnąć korzysta się z następujących technik (Sosnowski, 2015): unikania błędów, maskowania błędów, wykrywania i tolerowania błędów. Technika unikania błędów może być wspomagana przez różnego rodzaju narzędzia, sprzętowe jak i programowe, które mogą efektywnie testować podzespoły i udoskonalać metody ich wytwarzania, unikać powstawania błędów w fazie projektowania systemu, a nawet przewidywać powstawanie błędów. Najprostsze techniki gwarantują wykrycie błędu. W przypadku oprogramowania mowa tutaj o weryfikacji na przykład sum kontrolnych, kontroli parzystości, detekcji błędów CRC, czy lokalizacji wirusów. Podstawowe klasy kodów wykrywających błędy to (PWr., 2016): kody z kontrolą parzystości, kody z podwajaniem i kody z inwersyjnym powtórzeniem, kody wykrywające błędy w bajtach: kody z sumą kontrolną, kody wykrywające błędy jednokierunkowe: o kody nieuporządkowane, to znaczy kody wykrywające błędy jednokierunkowe o dowolnej krotności, o kody wykrywające t błędów jednokierunkowych, o kody wykrywające błędy jednokierunkowe w bajtach. Najprostszą metodą detekcji błędów jest sprawdzanie sum kontrolnych. Najczęściej używa się tego podczas transmisji danych, ale nie ma przeszkód, aby używać jej również na poziomie sprzętu, czy jakiejkolwiek aplikacji. Metoda ta polega na wyliczeniu dla każdej porcji danych liczby nazywanej sumą kontrolną, która zależy od zawartości danych. Jeśli zmieni się zawartość danych, zmieniona zostanie również ich suma kontrolna. Metoda ta jest również używana przez programy antywirusowe do sprawdzania, czy zawartość plików nie została zmieniona przez wirusy.
Strategie tolerowania błędów 287 Kolejną metodą detekcji błędów jest sprawdzanie błędów za pomocą kontroli parzystości. Dla każdej grupy bitów sprawdzana jest liczba bitów o wartości 1. Daje to nam informację, czy w danej porcji danych znajduje się nieparzysta czy parzysta liczba jedynek. W zależności od wyniku zawsze dodaje się dodatkowy bit parzystości (0 albo 1), aby liczba jedynek zawsze była nieparzysta. Gdy jeden bit zostanie zmieniony metoda ta wykryje ten fakt i zgłosi go. Inną metodą detekcji błędów jest sposób detekcji błędów zwany CRC, czyli cykliczna kontrola nadmiarowa. Stosowany jest głównie podczas transmisji w sieciach LAN. Metoda CRC pobiera porcję danych przeznaczoną do wysłania i z pomocą specjalnego algorytmu wylicza wartość CRC dla tych danych. Urządzenie odbiorcze otrzymuje dane wraz z wyliczoną wartością CRC i sprawdza, czy odebrane dane są poprawne. Zaprezentowane metody detekcji błędów nie dają możliwości wykrycia błędów w chwili ich powstania. Rozwiązaniem tego problemu jest testowanie równoległe, które zapewnia stały monitoring poprawności pracy systemu oraz sygnalizację błędów. Najczęściej używane jest to podczas detekcji błędów transmisyjnych oraz pamięci RAM. Istnieje rodzaj pamięci RAM wyposażony w funkcję kodu korekcji błędów ECC (ang. Error Correction Code). Pamięć taka jest w stanie sama naprawić przekłamany bit. W technikach maskowania i tolerowania błędów dopuszcza się wystąpienie błędu. W technice maskowania efekt błędu jest maskowany, np. przez potrojenie układu i głosowanie wyniku lub zastosowanie kodu korekcyjnego. Natomiast techniki tolerowania błędów sprawdzają się do wykrycia u usunięcia jego skutków (Sosnowski, 2015). Sposoby detekcji błędów stosowane w systemach cyfrowych są podzielone na trzy techniki (Wiliams, 2006): techniki związane z poziomem układów elektronicznych, techniki związane z poziomem systemu jako całości, techniki dotyczące aplikacji. Ogromny wpływ na działanie systemów informatycznych ma ich testowanie oraz stabilność. Celem testowania jest wykrycie błędów. Często jednak jest konieczna również lokalizacja błędu (diagnostyka). Wczesne wykrycie błędu jest najlepszym sposobem ograniczenia ewentualnych zniszczeń, a także zmniejszenia strat wynikających z niepotrzebnego wykonywania programów. Dołączając odpowiednie sprzętowe mechanizmy ochrony można znacznie rozszerzyć umiejętność systemu operacyjnego na reagowanie na błędy wkrótce po ich wystąpieniu (Wykrywanie błędów, 2018). Mechanizmy ochrony mogą mieć ważny udział w polepszaniu bezpieczeństwa systemu operacyjnego, a także jego niezawodności
288 I.J. Jóźwiak, J. Legut 3. Tolerowanie błędów Projektowanie i realizacja systemów cyfrowych mających zdolność kontynuowania poprawnej pracy, mimo uszkodzeń wewnętrznych (tolerowania uszkodzeń) staje się niezbędną cechą coraz większej liczby systemów cyfrowych. Tolerowanie uszkodzeń pozwala kontynuować poprawne wykonywanie przewidzianych zadań pomimo wystąpienia uszkodzeń wewnątrz systemu. Głównym celem tolerowania uszkodzeń jest zabezpieczenie systemu przed skutkami uszkodzeń jego elementów, których wystąpienie uważa się za nieuchronne. Do przykładów zastosowań systemów tolerujących uszkodzenia należą (Piestrak, 2018): systemy sterowania procesami przemysłowymi (zakłady chemiczne, elektrownie), systemy stosowane w medycynie (wspomaganie diagnostyki chorób, zarządzanie systemem transportu pogotowia ratunkowego), serwery sieci komputerowych, systemy obsługi transakcji (systemy bankowe i rezerwacji miejsc), systemy gospodarki materiałowej (zaopatrzenie sieci supermarketów), systemy telekomunikacyjne (centrale telefoniczne, systemy telefonii komórkowej), systemy lotnicze (sterowanie lotem samolotu, zarządzanie systemem lotnisk) i satelitarne, sterowanie ruchem kolejowym, komputery samochodowe (system zabezpieczenia hamulców ABS, poduszki powietrzne), urządzenia elektroniki użytkowej (odtwarzacze płyt kompaktowych, zapis i odtwarzanie magnetowidowe). W systemach tolerujących błędy wykorzystuje się koncepcję głosowania, która uwzględnia m.in. (Sosnowski, 2015): błędy kompensacyjne, nieprecyzyjność porównywanych danych, dynamiczną modyfikację wag głosowania. Ogólna koncepcja głosowania jest stosunkowo prosta. Spośród n wyników wybiera się najbardziej prawdopodobny wynik poprawny, np. wynik średni lub wynik ważony. W najprostszym wypadku stosuje się zasadę wyboru większościowego, to znaczy wynik, który powtarza się najczęściej zostaje wybrany jako wynik końcowy. 4. Strategia tolerowania błędów Ogromnie ważnym zagadnieniem jest opracowanie strategii tolerowania błędów w czasie pracy system informatycznego. Tolerowanie uszkodzeń w systemie cyfrowym, ze szczególnym uwzględnieniem systemu informatycznego zawsze wymaga wprowadzenia do systemu pewnego typu nadmiaru, zwaną także rezerwą lub redundancją.
Strategie tolerowania błędów 289 Można zastosować pewne procedury redundancji na poziomie sprzętowym, programowym, algorytmicznym i czasowym w celu unikania błędów. Rozróżniamy następujące typy redundancji (PWr, 2016): 1. Nadmiar informacji, który polega na dodaniu nadmiarowych bitów do informacji w celu wykrycia błędów (np. bit parzystości w szynie lub pamięci, kody cykliczne nadmiarowe - CRC dla pamięci dyskowej lub taśmowej, sumy kontrolne) lub korekcji błędów (np. kody Hamminga, Reeda-Solomona, turbo, BCH, Reeda-Mullera). 2. Nadmiar sprzętu, który polega na użyciu dodatkowych układów lub rozbudowie istniejących układów w celu wykrycia błędów, diagnostyki, maskowania uszkodzeń, lub naprawy układu. Przykładami są tu realizacja układu jako samosprawdzalnego, potrojenie modułu z głosowaniem lub zapewnienie modułów zapasowych podłączanych automatycznie. 3. Nadmiar czasu polegający na wydłużeniu czasu wykonania operacji lub sekwencji operacji poprzez wielokrotne jej wykonanie w celu późniejszego porównania wyników. 4. Nadmiar oprogramowania polegający na użyciu nadmiarowego oprogramowania w celu wykrycia lub tolerowania uszkodzeń zarówno sprzętu jak i oprogramowania wykonującego to samo zadanie, ale wykonanego poprzez różnych niezależnych wykonawców (producentów). Redundancja maskująca uszkodzenia pozwala na tolerowanie uszkodzeń sprzętu. Wszystkie jej elementy nadmiarowe (łącznie z uszkodzonymi) są aktywne przez cały czas. Redundancję taką można stosować zarówno w prostych układach cyfrowych, a także na poziomie całego systemu. Rozwiązanie takie wykorzystuje zazwyczaj nieparzystą liczbę identycznych modułów, których wyjścia podaje się na układ głosujący. Dodatkowo warto zauważyć, że układ głosujący wygeneruje poprawny sygnał w przypadku jednoczesnego wystąpienia błędów kompensujących się. W przypadku jednoczesnego wystąpienia dwóch lub trzech błędów jednokierunkowych układ głosujący wygeneruje oczywiście sygnał niepoprawny. W praktyce powyższy opis strategii tolerowania błędów dotyczy rozwiązań klastrowych, w których właśnie wykorzystuje się nadmiarowe urządzenia. W przypadku awarii jednego z nich kolejne urządzenie przejmuje zadania uszkodzonej maszyny. Potrzebne do tego jest specjalne oprogramowanie zarządzające. Rozwiązania takie cechują się także tym, że potrafią rozkładać obciążenie równomiernie pomiędzy wszystkie urządzenia. Przykładem tutaj może być zastosowanie, na przykład w systemach dyskowych, następujących technik: a) mirroring - technika zapisu lustrzanego polegająca na zrealizowanym w czasie rzeczywistym dublowaniu zapisu danych na drugim urządzeniu, dzięki czemu oba urządzenia przechowują tę samą informację. Do jednego sterownika dołączane są dwa napędy dyskowe, aby na obu dane były zapisywane jednocześnie. W przypadku awarii jednego z dysków, dane są dostępne na drugim.
290 I.J. Jóźwiak, J. Legut b) duplexing - jest podobny do poprzedniego przypadku techniki z tą różnicą, że stosuje się dwa sterowniki do obu napędów dyskowych. Technika ta zapewnia większe bezpieczeństwo w stosunku do mirroringu, gdyż redundancji poddane są także sterowniki napędów dyskowych. c) RAID - (ang. Redundant Array of Inexpensive Discs), to system zwiększający niezawodność w wypadku stosowania urządzeń dyskowych. Wyróżnia się 10 typów systemów RAID, w systemach tych stosuje się mirroring, stripping (podział danych na małe bloki i rozmieszczenie na różnych dyskach), kontrolę parzystości. Aby uzyskać niezawodną sieć stosowane są różne metody poprawy niezawodności, zapewniające jej bezawaryjne działanie. Do takich metod należą: dublowanie połączeń sieciowych, co oznacza prowadzenie ich dwoma różnymi i niezależnymi trasami, stosowanie urządzeń sieciowych o podwyższonej niezawodności, urządzenia te posiadają np. zwielokrotnione zasilanie lub nawet dwa niezależne urządzenia przełączające i zarządzające ruchem w sieci. W przypadku sieci rozległych stosuje się przyłączenia korzystające z usług dwóch operatorów sieci rozległych. Daje to możliwość bezawaryjnej pracy w przypadku awarii jednego z łącz. Redundancję stosuje się również w zasilaniu awaryjnym. Do tego typu rozwiązań zalicza się zasilacze awaryjne UPS (ang. Uniterruptable Power Source) oraz generatory, które przejmują zadanie zasilania sieci i urządzeń w przypadku zaniku zasilania zewnętrznego. W najprostszym przypadku pozwala to na dokończenie pracy i bezpieczne wyłączenie urządzeń w przypadku awarii zasilania (przy zastosowaniu UPS). W przypadku zastosowania generatorów można normalnie pracować, bez konieczności przerywania pracy systemu. W przypadku stosowania generatorów należy stosować także zasilacze UPS, które podtrzymają zasilanie do czasu uruchomienia generatora. W praktyce wprowadzenie jednego (podstawowego) typu nadmiaru pociąga za sobą konieczność użycia innych rodzajów nadmiaru. Dla przykładu użycie kodu wykrywającego lub korygującego błędy (nadmiar informacji) wymaga użycia kodera i dekodera (nadmiar sprzętu) i wprowadza dodatkowe opóźnienie wnoszone poprzez proces kodowania, dekodowania i korekcji błędów (nadmiar czasu). Nie ma jednego uniwersalnego rozwiązania dla wszystkich zastosowań systemów tolerujących uszkodzenia. Główne kryteria stosowania i doboru typów nadmiaru, to skuteczność wykrywania (lub korygowania) błędów oraz koszt implementacji systemu w wersji tolerującej uszkodzenia. Dobór nadmiaru powinien być poprzedzony staranną analizą typów najczęściej występujących uszkodzeń i ich skutków. W celu ograniczenia najczęściej występujących uszkodzeń, czy możliwych błędów stosuje się testy automatyczne, które mają za zadanie sprawdzenie, czy błędy nie pojawiają
Strategie tolerowania błędów 291 się podczas normalnej pracy systemu informatycznego. Odpowiednia strategia testów wymaga dokładanego przeanalizowania jakie zasoby będą niezbędne do ich wykonania. Jednym z rozwiązań jest użycie emulatorów. Są to specjalne narzędzia pozwalające na zdalne sterowanie obiektem wykorzystując dedykowane dla danego systemu kontrolery oraz sterowniki. Aktualnie prawie każdy producent dostarcza ze środowiskiem testowym odpowiedni emulator na platformę PC. Stosując emulatory środowisk można zredukować koszty testowania, zwiększyć liczbę przypadków testowych, skoncentrować się na automatyzacji oraz wdrażać ogólnie przyjęte standardy dla wszystkich urządzeń czy układów. Następnym punktem strategii detekcji i tolerowania błędów w czasie pracy systemu informatycznego jest testowanie oprogramowania. Testowanie oprogramowania to wykonywanie kodu dla kombinacji danych wejściowych i stanów w celu wykrycia błędów. Celem testowania oprogramowania jest wykrycie jak największej liczby, niewykrytych wcześniej błędów. Najpopularniejszym testerem jest JUnit (JUnit, 2018). Jest to narzędzie służące do tworzenia powtarzalnych testów jednostkowych oprogramowania pisanego w języku Java (JUnit, 2018). Tester JUnit oddziela testy od kodu, posiada wiele mechanizmów uruchamiania, zapewnia tworzenie raportów oraz integrację z różnymi środowiskami programistycznymi. Na podstawie testera JUnit powstała cała rodzina oprogramowania zwana xunit. Powstały programy do testowania programów napisanych w przeróżnych językach, m.in cppunit na potrzeby c++, htmlunit do testowania aplikacji internetowych, sqlunit dla testowania procedur sql-owych, dunit dla delphi itd. Ogólna budowa wszystkich tych programów jest bardzo do siebie zbliżona. Różnice wynikają ze specyfiki pewnych konstrukcji w obrębie danego języka. Bardzo ciekawym systemem, w którym zastosowano na szeroką skalę test zwany w skrócie TDD (ang. Test Driven Development) jest projekt open source'owy o nazwie "Eclipse". Ma on na celu utworzenie środowiska programistycznego (IDE) ogólnego zastosowania. Dzięki zaawansowanej architekturze Eclipse pozwala rozszerzać swoją funkcjonalność przez dodawanie tzw. "wtyczek". System powstaje w języku Java i korzysta z testera JUnit jako platformy uruchamiania testów. Oprogramowanie Eclipse dostarczone jest z ogromnym zestawem testów zaimplementowanych przy użyciu własnej biblioteki. Dla każdej wersji Eclipse przygotowywany jest raport pokazujący, które testy zakończyły się pomyślnie a które nie (Sosnowski, 2015). Innym, godnym wspomnienia projektem, który jest silnie związany z testowaniem jest Fit. Pozwala definiować testy akceptacyjne poprzez tabelki HTML.
292 I.J. Jóźwiak, J. Legut 5. Podsumowanie Opisana powyżej strategia jest istotnym elementem budowy niezawodnych systemów informatycznych. Istotne jest bowiem wykrycie błędów i określenie zasad ich tolerowania lub usuwania z systemu informatycznego. Działania te powinny zostać przeprowadzone przez specjalnie przeszkolony i przygotowany do tego zespół analityków i testerów. Brak kompleksowego podejścia do tego zagadnienia może dla każdego użytkownika sprzętu informatycznego być bardzo uciążliwe. Zaproponowana strategia detekcji i tolerowania błędów pozwoli na zmniejszenie uciążliwości związanej z konsekwencjami występowania błędów. Bibliografia 1. JUnit. (dostęp 23.05.2018). https://pl.wikipedia.org/wiki/junit. 2. Pietrak, S. (dostęp 23.04.2018). Metody tolerowania uszkodzeń w układach i systemach cyfrowych. http://inf.lucc.pl/systemy_bezpieczne_i_ftc/wyklad/ftc.pdf. 3. PWr. (dostęp 23.04.2018). Metody podwyższania niezawodności systemów cyfrowych. http://education.wikia.com/wiki/pwr_metody_podwy%c5%bcszania_niezawodno%c5 %9Bci_system%C3%B3w_cyfrowych. 4. Sosnowski, J. (2015). Testowanie i niezawodność systemów komputerowych. Warszawa: Akademicka Oficyna Wydawnicza EXIT. 5. Wiliams, R. (2006). Real-Time Systems Development. Oxford: Elsevier. 6. Wykrywanie błędów. (dostęp 20.04.2018). http://kik.pcz.pl/soold/mainpage/subject18/ chapt4.htm.