Skróć czas ponownych prób / oczekiwania na złe blokowanie w Ubuntu

10

Jak mogę skrócić czas oczekiwania IO i ponowić próbę, aby system operacyjny nie próbował ciągle zapisywać na uszkodzonym dysku?

Mam system, którego używam do tworzenia kopii treści demonstracyjnych, które są pożyczane klientom na zwykłych komputerowych dyskach twardych SATA. Łączymy wiele dysków jednocześnie za pośrednictwem SAS i kopiujemy do nich zawartość za pomocą skryptu.

Ponieważ dyski są wypożyczone, czasami niektóre wrócą uszkodzone, ale nie wiem, czy są uszkodzone, więc następnym razem, gdy dysk zostanie ponownie użyty w operacji kopiowania, spowalnia inne dyski, gdy system próbuje IO na tym dysku. Czasami zauważenie nieprawidłowego dysku i usunięcie go może potrwać kilka godzin. Po usunięciu dysku pozostałe dyski zaczynają pisać z normalną prędkością.

Nie dbam o odzyskiwanie złych dysków. Muszę je tylko usunąć, żeby nie spowalniały wszystkiego innego.

Badam też badblocks i smartmontools i zastanawiam się nad napisaniem wstępnej kontroli dysków, zanim zacznę pisać.

System operacyjny: Ubuntu Linux (12,04 lts)

Ryan Sorensen
źródło
Co jest złego w sprawdzaniu danych SMART przez udisks/ smartmonctl? To klasyczny problem XY.
Deer Hunter
2
Dzięki, będę więcej badał smartmonctl. Z mojego doświadczenia wynika, że ​​jeśli złe sektory wystąpiły podczas ostatniej wysyłki, status SMART pokazuje, że dysk jest nadal dobry i działa dobrze, dopóki nie pojawi się jakaś losowa część podczas kopiowania, a następnie spowalnia do indeksowania, wpływając również na inne dyski, dopóki jest usunięty.
Ryan Sorensen
Pytanie nie otrzymało bezpośredniej odpowiedzi, więc nie wiemy, czy jest to możliwe w Linuksie: Jak mogę skrócić czas oczekiwania IO i ponowić próbę?
imz - Ivan Zachharyaschev
@ imz - IvanZakharyaschev unix.stackexchange.com/a/147304/25985 Jednak jądro rejestruje te błędy, więc jeśli wszystko, co chcesz zrobić, to złapać uszkodzony dysk, zanim stanie się więcej problemów, możesz przeskanować dzienniki systemowe pod adresem regularne odstępy.
goldilocks
@ gol Co jeśli chcę to złapać szybciej? Bez czekania Bóg wie, ile czasu przed operacją IO odblokowuje zgłoszenie błędu? (Właściwie próbuję zapisać dane z dysku z błędami, ale mój problem jest podobny: napotkanie tych „błędnych” sektorów powoduje ogromne opóźnienia. Być może mógłbym również postępować zgodnie z radą i wynaleźć sposób na ddrescue
podaj

Odpowiedzi:

7

Nie korzystałem wcześniej z tego przestrajania, ale prawdopodobnie chcesz dostosować eh_timeout (limit czasu obsługi błędów) dla danego napędu:

[root@localhost device]# cat /sys/block/sda/device/eh_timeout
10
[root@localhost device]# 

Powyższe pokazuje sdaustawiony na 10 sekund. Z bazy wiedzy Red Hat:

W niektórych konfiguracjach pamięci masowej (na przykład w konfiguracji z wieloma jednostkami LUN) kod obsługi błędów SCSI może poświęcić wiele czasu na wydawanie poleceń, takich jak GOTOWA JEDNOSTKA TESTOWA, na niereagujące urządzenia pamięci masowej. Dodano nowy parametr sysfs, eh_timeout, do obiektu urządzenia SCSI, który umożliwia konfigurację wartości limitu czasu dla komend TEST UNIT READY i REQUEST SENSE używanych przez kod obsługi błędów SCSI. Zmniejsza to czas spędzony na sprawdzaniu tych nieodpowiadających urządzeń. Domyślna wartość eh_timeout to 10 sekund, która była wartością limitu czasu używaną przed dodaniem tej funkcji.

Bratchley
źródło
Sprawdzam to teraz. Ubuntu nie ma eh_timeout, ale ma plik limitu czasu, który może być taki sam. Domyślna wartość Ubuntu wydaje się wynosić 30 sekund. Skróci go do 5 sekund i zgłoś się.
Ryan Sorensen
1
Z ciekawości, jaki był twój wynik?
Bratchley,
Ustawienie flagi limitu czasu na 12.04 najwyraźniej nic nie robiło. Planuję uaktualnić system testowy do 14.04 w ten weekend, ponieważ ma on eh_timeout (a także limit czasu).
Ryan Sorensen
@RyanSorensen, więc czy miałeś szansę sprawdzić, czy ten parametr kiedykolwiek działa?
Nat
Nie byłem w stanie zmodyfikować, eh_timeoutale mogłem się zmienić, timeoutaby wykonać dane zadanie.
GuitarPicker,
2

Monitoruj /sys/block/<dev>/staturządzenia, które Cię interesują, i porównaj 10. parametr (io_ticks).

na przykład, ticks = io_ticks - prev_ticks / seconds_deltatime / 10

Jest to procent dostępnego czasu, jaki dysk spędził na oczekiwaniu na dysk io.

Oczywiście blisko 100% byłoby warte sprawdzenia, w przeciwnym razie bądź naprawdę sprytny i porównaj go ze średnią wszystkich dysków i wybierz dowolny dysk (dyski) powyżej średniej.

Zobacz dokumentację statystyk warstwy blokowej .

W przeciwnym razie użyj czegoś takiego jak Munin i zrób to na wykresie. Możesz sprawić, by Munin zaalarmował, jeśli przekroczy próg, np. 90% lub cokolwiek, co pokazuje twój wykres, jest dobrym sygnałem ostrzegawczym.

np. zobacz te dwa wykresy Munin pokazujące, że / dev / sdi musi się przyjrzeć. W tym przykładzie, jeśli / dev / sdi jest częścią tablicy, cała tablica ucierpiałaby z tego powodu.

Wykorzystanie dysku na urządzenie - w dzień

Wykorzystanie dysku na urządzenie - według tygodnia

Jeśli spojrzysz na wykres tygodnia, zobaczysz, że / dev / sdc może być również powolny.

Powinienem dodać, że powyższy / dev / sdi nie jest zepsuty, to po prostu wolny dysk (właściwie zielony dysk, który ktoś dodał do macierzy dysków sata klasy korporacyjnej), co spowolniło macierz. Rzeczywisty uszkodzony dysk wystaje jak obolały kciuk.

Podsumowując, prawdopodobnie miałbym skrypt, gdybym miał czas, ale Munin, gdybym chciał tylko szybkiego rozwiązania, a połączenie z serwerem było łatwe.

Ian Macintosh
źródło
Dzięki! Informacje o statystykach io w Linuksie są naprawdę nowe i wydają się przydatne (dla mnie) w takich sytuacjach.
imz - Ivan Zakharyaschev