Czy Linux może szorować pamięć?

10

Czy Linux ma mechanizm „szorowania” pamięci? np. testowanie pamięci i zaznaczanie obszarów jako brudnych, jeśli ulegną awarii, aby system mógł dalej „bezpiecznie” działać nawet przy zainstalowanych złych układach pamięci RAM ?!

Waxhead
źródło

Odpowiedzi:

2

Odpowiedź brzmi „tak” i odbywa się to w sposób przejrzysty (pod warunkiem, że masz pamięć ECC do wykrywania błędów, a wersja jądra ma wersję co najmniej 2.6.30, aby nadal bezpiecznie działać).

Zasadniczo pamięć jest sprawdzana przy każdym odczycie z procesora i okresowo szorowana * w celu sprawdzenia zgodności z kodami korekcji błędów (ECC). Jeśli wystąpił błąd, pojawia się wyjątek sprawdzania maszyny, który jest następnie rejestrowany i pobierany przez mcelog ( http://www.mcelog.org/ ).

Jeśli błąd można naprawić, zwiększa licznik „nieszczelnego wiadra”, co powoduje, że fizyczny moduł DIMM, który zbyt często zawodzi, nie może zostać w przejrzysty sposób zastąpiony innym. W ten sposób strona pamięci jest kopiowana do nowej lokalizacji, adres pamięci wirtualnej jest aktualizowany, aby wskazywał na nową stronę, a stara strona jest oznaczona przez system operacyjny jako nieużywana.

W Linuksie nazywa się to „soft-offlining” (i wycofanie strony pamięci w Solarisie, nie wiem o innych systemach operacyjnych).

Jeśli jednak błędu nie da się naprawić, dzieje się tak zwane „hard-offlining”, tzn. Twoja strona pamięci jest usuwana z normalnego zarządzania pamięcią systemu operacyjnego i twoja aplikacja zostaje zabita (NB: przez jakiś chwytliwy sygnał SIGBUS, który mówi ci gdzie błąd się zdarzył, ale rzadko zdarza się, aby się tym nie przejmować i spróbować go złapać). Jeśli twoja strona pamięci jest zmapowana z pliku i wyczyszczona, system operacyjny może również przeładować ją w przejrzysty sposób w innej fizycznej lokalizacji zamiast zabijać proces.

Możesz przeczytać więcej o mcelogu, istnieje wiele opcji konfiguracji, możesz uzyskać inne zachowania, które mają być wyzwalane, opcje i inne informacje o tym, co czytać i jak upewnić się, że mcelog działa w twoim systemie.


* Szorowanie lub „szorowanie patrolowe” polega na czytaniu pamięci, sprawdzaniu jej pod kątem błędów ECC i zastępowaniu poprawionymi słowami pamięci, gdy błąd zostanie wykryty. Termin „szorowanie patrolu” jest używany w przeciwieństwie do nadpisywania niepoprawnych danych o błędach w odczytach pamięci, które czasami nazywane są „szorowaniem popytu”. Czyszczenie to procedura sprzętowa, którą można włączyć, zwykle poprzez BIOS.

Cimbali
źródło
1
Dotyczy to tylko sytuacji, gdy masz droższą pamięć ECC.
psusi
Dotyczy to wszystkich wspomnień z ECC. Czy to parzystość (ale wtedy nie da się tego poprawić), USZKODZONY, droższy Chipkill lub nowszy. DDR1 może już implementować ECC, ale wszystko zależy od tego, jakiego modelu używasz. Rynek „macierzysty” tradycyjnie mniej potrzebuje odporności, ale superkomputery są wyposażone w nie od ponad 20 lat - serwery są między nimi.
Cimbali,
1
Miałem na myśli, że pamięć ECC jest droższa (niż non-ECC), więc większość ludzi jej nie ma.
psusi
1
Cóż, „większość ludzi” jest dość niejasna. Jak powiedziałem, powszechne jest płacenie ceny inwestycji i energii zależy od rynku. Mój przeciętny laptop Dell, który ma teraz 2 lata, jest w niego wyposażony (standardowo, bez specjalnych opcji). To staje się coraz bardziej powszechne, ponieważ miniaturyzacja funkcji sprawia, że ​​moduły DIMM są bardziej wrażliwe na różne promieniowanie.
Cimbali,
1
Cimbali, który wykonuje „Patrol Scrubbing” (w systemach z pamięcią ECC) - oprogramowanie bios (prawdopodobnie w trybie smm, transparentnie dla jądra systemu operacyjnego) lub jądro Linux w jakimś trybie oprogramowania (który moduł wykonuje szorowanie patrolu)? Pamięć ECC nie sprawdzała sum ECC; aby sprawdzić ecc, dane muszą zostać odczytane (a schemat ecc w kontrolerze pamięci sprawdzi sumę). Część pamięci jest często odczytywana (przez normalne programy na procesorze), inna może nie być czytana przez tygodnie. Oczyszczanie patrolu będzie odczytywało całą pamięć każdego dnia (dane wywiadowcze) lub co 1-48 godzin, aby wykonać kontrolę ecc - electronics.stackexchange.com/q/73546#comment911379_73573
osgx
7

To właściwie zły pomysł. Pamięć nie może być niezawodnie przetestowana w krótkim czasie. Dlatego oprogramowanie takie jak memtest86 używa wielu przebiegów z różnymi wzorami bitów do testowania pamięci. Rozwiązanie:

  1. Testuj pamięć za pomocą memtest86 , najlepiej długi test, pozostaw go na noc, zajmie to dużo czasu.

  2. Jeśli wykryta zostanie zła pamięć, użyj memmap parametru jądra, aby zmusić jądro do nieużywania tej pamięci:

   memmap = nn [KMG] $ ss [KMG]
            [KNL, ACPI] Oznacz określoną pamięć jako zarezerwowaną.
            Region pamięci do wykorzystania, od ss do ss + nn.
            Przykład: wyklucz pamięć z 0x18690000-0x1869ffff
                     memmap = 64 tys. 0x18690000
                     lub
                     memmap = 0x10000 $ 0x18690000

Ponadto można użyć pamięci ECC, która automatycznie poprawi błędy 1-bitowe i automatycznie wykryje błędy 2-bitowe w pamięci (a otrzymasz komunikaty dziennika z jądra o problemach z pamięcią, których nie można naprawić)

haimg
źródło
Dzięki za wskazówkę dotyczącą tych parametrów jądra. Czy uważasz, że możesz wyjaśnić, dlaczego jest to tak zły pomysł i dlaczego nie możesz sprawdzić fragmentu pamięci przy użyciu tych samych metod, co memtest86 (+)? Zdaję sobie sprawę, że bardziej niezawodne testowanie wymaga więcej czasu procesora (i prawdopodobnie większej ilości pamięci RAM za jednym razem), ale dlaczego miałby to być zatrzymanie pokazu? Czas procesora może nie stanowić problemu, jeśli jest rozłożony na wystarczająco długi okres, a poza tym wiele procesorów staje się coraz bardziej popularne.
Waxhead
Cóż, technicznie rzecz biorąc, jeśli zrobione wystarczająco długo, może to być możliwe. Ale wąskim gardłem tutaj nie są procesory, ale szyna pamięci i oczywiście „zatruwasz” pamięć podręczną procesora. Nie wiedziałbym o takim module jądra, a pomysł wydaje mi się bardzo kruchy (organizowanie powtarzania zapisu wzorców w dowolnym regionie pamięci w systemie na żywo itp.)
haimg
haimg: pytanie: czy VFS będzie zarządzał stronicowaniem dla tej zarezerwowanej pamięci? myślę, że nie może, ponieważ nie będzie dla niego widoczny.
Jay D
1
@ Czyszczenie pamięci Waxhead odbywa się zwykle na poziomie systemu BIOS przy użyciu sprzętu. Jeśli włączone, powinieneś znaleźć opcje szorowania patrolu i szorowania na żądanie. Jeśli integralność pamięci jest dla Ciebie ważna, co z pewnością ma miejsce w przypadku korzystania z pamięci ECC, to niewielki spadek wydajności uzyskany dzięki włączeniu tych opcji jest opłacalny.
Ian
1
Myślę, że interesujące może być tutaj odniesienie do modułu jądra badram . Używa memtest86, jak proponujesz, ale zamiast powstrzymywać jądro od korzystania ze złej pamięci, przydziela go do jądra, aby nie używało, skutecznie gwarantując, że ani jądro, ani aplikacje nie będą działały w tej pamięci.
Cimbali,
2

Post i odpowiedź źle zrozumiały problem. Czyszczenie pamięci ma na celu zapobieganie przekształceniu poprawialnych błędów pojedynczych bitów w nieskorygowalne błędy podwójne. Płuczka jedynie cała pamięć fizyczna (zmuszając pamięć podręczną, aby to zrobić) od czasu do czasu. Jeśli wystąpią błędy jednobitowe, zostaną one poprawione (a korekta musi przepisać poprawną wartość za pomocą porównania i zamiany), usuwając w ten sposób błąd.

W przeciwnym razie, jeśli wystąpi drugi błąd w słowie, które ma już jeden błąd, całe słowo będzie niemożliwe do naprawienia, a system operacyjny będzie musiał zrobić coś drastycznego.

Czyszczenie jest ważne, ponieważ bez niego pamięć, która jest odczytywana, ale nie zapisywana (jak strony kodowe) może z czasem gromadzić błędy.

Larry Stewart
źródło
Jak myślisz, dlaczego brakująca odpowiedź zrozumiała problem, gdy został on oznaczony jako odpowiedź?
Dave
1
Pomimo odpowiedzi Dave'a, Larry jest całkiem poprawny, odpowiedź / robi / źle rozumie pytanie. Pytanie dotyczy tego, czy Linux może wykonać szorowanie pamięci, używane, jak dokładnie wyjaśnia Larry, aby zapobiec wykrywaniu i korygowaniu błędów jednobitowych i korygowanych przez ECC h / w w niepoprawne błędy 2-bitowe. Odpowiedź mówi o tym, jak przede wszystkim wykryć te błędy za pomocą aplikacji.
Ian
Myślę, że źle zrozumiałeś tu cel. Oczywiście masz rację w opisie szorowania, ale jeśli na przykład uruchamiasz (niekrytyczny) serwer plików na ramce innej niż ecc i masz cykle procesora, aby go oszczędzić, to dobry pomysł, aby wcześniej lub później móc wykryć uszkodzony pamięć i oznaczyć ją jako złą i wiedzieć o niej, niż nie wiedzieć o złym układzie pamięci. Być może lepszym sformułowaniem byłoby walidacja / weryfikacja pamięci. Może nie technicznie szorowanie, ale wciąż realny sposób na zmniejszenie szkód wyrządzonych przez potencjalnie złą pamięć.
Waxhead
1

Jeśli masz pamięć ECC, możesz przyjrzeć się bliżej https://www.kernel.org/doc/Documentation/ABI/testing/sysfs-devices-edac . (Uważam, że „sdram_scrub_rate” jest szczególnie interesujący.)

(Jeśli ten link zepsuje się w pewnym momencie (naprawdę nie powinien), sugeruję pobranie odpowiedniej dokumentacji systemu Linux i wyszukanie słowa „scrub”.)

Kai
źródło