Płukanie w tle w Linuksie ma miejsce, gdy albo oczekuje się zbyt dużej ilości zapisanych danych (można to zmienić za pomocą / proc / sys / vm / dirty_background_ratio) lub upłynął limit czasu dla zapisów oczekujących (/ proc / sys / vm / dirty_expire_centisecs). O ile nie zostanie przekroczony inny limit (/ proc / sys / vm / dirty_ratio), więcej zapisanych danych może być buforowanych. Dalsze zapisy zostaną zablokowane.
Teoretycznie powinno to stworzyć proces w tle, wypisujący brudne strony bez zakłócania innych procesów. W praktyce przeszkadza to procesowi, który dokonuje odczytu niebuforowanego lub zapisu synchronicznego. Źle. Wynika to z faktu, że opróżnianie w tle faktycznie zapisuje przy 100% prędkości urządzenia, a wszelkie inne żądania urządzeń w tym czasie będą opóźnione (ponieważ wszystkie kolejki i pamięci podręczne zapisu na drodze są zapełnione).
Czy istnieje sposób na ograniczenie liczby żądań na sekundę wykonywanych przez proces płukania lub w inny sposób skutecznie nadać priorytet innym urządzeniom we / wy?
źródło
Odpowiedzi:
Po wielu testach porównawczych z sysbench doszedłem do tego wniosku:
Aby przeżyć (pod względem wydajności) sytuację, w której
po prostu zrzuć wszystkie windy, kolejki i brudne pamięci podręczne stron. Prawidłowe miejsce dla brudnych stron znajduje się w pamięci RAM tego sprzętowego bufora zapisu.
Dostosuj dirty_ratio (lub nowe dirty_bytes) tak nisko, jak to możliwe, ale miej oko na sekwencyjną przepustowość. W moim szczególnym przypadku 15 MB było optymalne (
echo 15000000 > dirty_bytes
).Jest to bardziej hack niż rozwiązanie, ponieważ gigabajty pamięci RAM są teraz używane tylko do buforowania odczytu zamiast brudnej pamięci podręcznej. Aby brudna pamięć podręczna działała dobrze w tej sytuacji, moduł czyszczący w tle jądra systemu Linux musiałby uśredniać, z jaką prędkością urządzenie bazowe akceptuje żądania i odpowiednio dostosowywać czyszczenie tła. Niełatwe.
Dane techniczne i testy porównawcze:
Testowany podczas
dd
zerowania dysku, sysbench wykazał ogromny sukces , zwiększając 10 wątków fsync zapisuje przy 16 kB z 33 do 700 IOPS (limit bezczynności: 1500 IOPS) i pojedynczy wątek od 8 do 400 IOPS.Bez obciążenia IOPS pozostały bez zmian (~ 1500), a przepustowość nieznacznie zmniejszona (z 251 MB / s do 216 MB / s).
dd
połączenie:w przypadku sysbench plik_pliku testowego.0 został przygotowany do rozrzedzenia za pomocą:
sysbench call dla 10 wątków:
wywołanie sysbench dla jednego wątku:
Mniejsze rozmiary bloków pokazały jeszcze bardziej drastyczne liczby.
- file-block-size = 4096 z 1 GB dirty_bytes:
- file-block-size = 4096 z 15 MB dirty_bytes:
- file-block-size = 4096 z 15 MB dirty_bytes w bezczynnym systemie:
sysbench 0.4.12: test porównawczy wielowątkowej oceny systemu
System testowy:
Podsumowując, jestem teraz pewien, że ta konfiguracja będzie działać dobrze w sytuacjach bezczynności, dużego obciążenia, a nawet pełnego obciążenia dla ruchu w bazie danych, który w innym przypadku byłby zagłodzony przez ruch sekwencyjny. Przepustowość sekwencyjna jest wyższa niż dwa łącza gigabitowe, które i tak można dostarczyć, więc nie ma problemu, aby ją nieco zmniejszyć.
źródło
dirty_bytes
powinno być wystarczająco wysokie, aby nie blokować procesorów podczas pisania procesów, jeśli proces pisze średnio z przepustowością urządzenia. Jeśli kod aplikacji wykonuje cykle wielkich obliczeń, a następnie zapisuje ogromne ilości danych, to bardzo trudno będzie je zoptymalizować, ponieważ średnie krótkookresowe znacznie różnią się od średnich średnich długookresowych. Prawidłowym rozwiązaniem byłoby dostosowaniedirty_bytes
ustawień specyficznych dla procesu , ale Linux nie obsługuje takich rzeczy, o ile wiem.Chociaż dostrajanie parametrów jądra zatrzymało problem, w rzeczywistości możliwe są problemy z wydajnością wynikające z błędu kontrolera Adaptec 5405Z, który został naprawiony w aktualizacji oprogramowania układowego z 1 lutego 2012 r. Informacje o wersji mówią „Naprawiono problem, w wyniku którego oprogramowanie układowe mogło się zawieszać podczas dużego obciążenia we / wy”. Być może rozłożenie I / O tak jak ty wystarczyło, aby zapobiec uruchomieniu tego błędu, ale to tylko przypuszczenie.
Oto informacje o wersji: http://download.adaptec.com/pdfs/readme/relnotes_arc_fw-b18937_asm-18837.pdf
Nawet jeśli nie dotyczyło to konkretnej sytuacji, pomyślałem, że może to przynieść korzyści użytkownikom, którzy napotkają ten post w przyszłości. W naszym wydaniu dmesg zobaczyliśmy kilka takich komunikatów, które ostatecznie doprowadziły nas do aktualizacji oprogramowania układowego:
Oto numery modeli kontrolerów Adaptec RAID, które są wymienione w informacjach o wersji oprogramowania układowego z wysoką poprawką zawieszenia we / wy: 2045, 2405, 2405Q, 2805, 5085, 5405, 5405Z, 5445, 5445Z, 5805, 5805Q, 5805Z, 5805ZQ, 51245, 51645, 52445.
źródło
Jądro zawierające „WBT”:
WBT nie wymaga przejścia na nową warstwę blokową blk-mq. To powiedziawszy, nie działa z programami planującymi We / Wy CFQ lub BFQ. Możesz używać WBT z harmonogramami deadline / mq-deadline / noop / none. Wierzę, że działa również z nowym harmonogramem we / wy „kyber”.
Oprócz skalowania rozmiaru kolejki w celu kontrolowania opóźnienia, kod WBT ogranicza liczbę żądań zapisu zwrotnego w tle jako proporcję obliczonego limitu kolejki.
Konfiguracja środowiska wykonawczego jest w
/sys/class/block/*/queue/wbt_lat_usec
.Dostępne są opcje konfiguracji kompilacji
Zgłoszenie problemu zostało potwierdzone w 100% przez autora WBT - dobra robota :-).
źródło
Jaka jest Twoja średnia dla Dirty in / proc / meminfo? Zwykle nie powinno to przekraczać twojego / proc / sys / vm / dirty_ratio. Na dedykowanym serwerze plików mam parametr dirty_ratio ustawiony na bardzo wysoki procent pamięci (90), ponieważ nigdy go nie przekroczę. Twoja brudna_racja jest zbyt niska, kiedy ją uderzysz, wszystko wyskakuje, podnieś ją.
źródło