Powolny sekwencyjny odczyt puli ZFS

10

Mam powiązane pytanie dotyczące tego problemu, ale stało się to zbyt skomplikowane i zbyt duże, więc postanowiłem podzielić problem na NFS i problemy lokalne. Próbowałem również zapytać o to na liście dyskusyjnej ZFS-omówić bez większego powodzenia.

Powolne kopiowanie między katalogami NFS / CIFS na tym samym serwerze

Zarys: Jak się konfiguruję i czego oczekuję

  1. Mam pulę ZFS z 4 dyskami. 2 TB RED skonfigurowany jako 2 lustrzane paski (RAID 10). W systemie Linux: zfsonlinux. Nie ma urządzeń pamięci podręcznej ani dzienników.
  2. Dane są równoważone między serwerami lustrzanymi (ważne dla ZFS)
  3. Każdy dysk może odczytywać (nieprzetworzony w / dd) z prędkością 147 MB ​​/ s równolegle, co daje łączną przepustowość 588 MB / s.
  4. Oczekuję około 115 MB / s zapisu, 138 MB / s odczytu i 50 MB / s przepisania kolejnych danych z każdego dysku, w oparciu o testy porównawcze podobnego dysku RED o pojemności 4 TB. Oczekuję nie mniej niż 100 MB / s odczytu lub zapisu, ponieważ każdy dysk może to zrobić w dzisiejszych czasach.
  5. Myślałem, że zobaczę 100% wykorzystania IO na wszystkich 4 dyskach, gdy pod obciążeniem odczytuje lub zapisuje dane sekwencyjne. I że dyski pracowałyby z prędkością ponad 100 MB / s przy 100% wykorzystaniu.
  6. Myślałem, że pula da mi około 2x zapisu, 2x przepisywania i 4x odczytu na jednym dysku - czy się mylę?
  7. NOWOŚĆ Myślałem, że Zvol ext4 na tej samej puli będzie miał mniej więcej taką samą prędkość jak ZFS

Co właściwie dostaję

Uważam, że wydajność odczytu puli nie jest tak wysoka, jak się spodziewałem

test porównawczy bonnie ++ na basenie sprzed kilku dni

Wersja 1.97 ------ Wyjście sekwencyjne ------ - Wejście równoważne - - Losowo -
Współbieżność 1 -Per Chr- --Block-- -Rewrite- -Per Chr- --Block-- --Seeks--
Rozmiar maszyny K / s% CP K / s% CP K / s% CP K / s% CP K / s% CP / s% CP
igor 63G 99 99 232132 47 118787 27 336 97 257072 22 92,7 6

bonnie ++ na pojedynczym dysku RED o pojemności 4 TB samodzielnie w zpool

Wersja 1.97 ------ Wyjście sekwencyjne ------ - Wejście równoważne - - Losowo -
Współbieżność 1 -Per Chr- --Block-- -Rewrite- -Per Chr- --Block-- --Seeks--
Rozmiar maszyny K / s% CP K / s% CP K / s% CP K / s% CP K / s% CP / s% CP
igor 63G 101 99 115288 30 49781 14 326 97 138250 13 111,6 8

Zgodnie z tym prędkości odczytu i przepisywania są odpowiednie na podstawie wyników z jednego napędu RED o pojemności 4 TB (są dwa razy większe). Jednak oczekiwana prędkość odczytu wynosiłaby około 550 MB / s (4x prędkość napędu 4 TB) i miałbym przynajmniej nadzieję na około 400 MB / s. Zamiast tego widzę około 260 MB / s

bonnie ++ w puli od teraz, zbierając poniższe informacje. Nie do końca taki sam jak wcześniej i nic się nie zmieniło.

Wersja 1.97 ------ Wyjście sekwencyjne ------ - Wejście równoważne - - Losowo -
Współbieżność 1 -Per Chr- --Block-- -Rewrite- -Per Chr- --Block-- --Seeks--
Rozmiar maszyny K / s% CP K / s% CP K / s% CP K / s% CP K / s% CP / s% CP
igor 63G 103 99 207518 43 108810 24 342 98 302350 26 256,4 18

zpool iostat podczas zapisu. Wydaje mi się OK.

                                                 przepustowość operacji przepustowości
przydział puli bezpłatny odczyt zapis odczyt odczyt zapis
-------------------------------------------- ----- - ---- ----- ----- ----- -----
pool2 1,23 t 2,39 t 0 1,89 tys. 1,60 tys. 238 mln
  lustro 631G 1.20T 0979 1.60K 120M
    ata-WDC_WD20EFRX-68AX9N0_WD-WMC300004469 - - 0 1007 1,60 K 124M
    ata-WDC_WD20EFRX-68EUZN0_WD-WCC4MLK57MVX - - 0 975 0 120 M
  lustro 631G 1,20T 0 953 0 117 mln
    ata-WDC_WD20EFRX-68AX9N0_WD-WCC1T0429536 - - 0 1,01 K 0 128 M
    ata-WDC_WD20EFRX-68EUZN0_WD-WCC4M0VYKFCE - - 0 953 0 117 mln

zpool iostat podczas przepisywania. Wydaje mi się, że to dla mnie w porządku .

                                                 przepustowość operacji przepustowości
przydział puli bezpłatny odczyt zapis odczyt odczyt zapis
-------------------------------------------- ----- - ---- ----- ----- ----- -----
pool2 1,27 t 2,35 t 1015 923 125 mln 101 mln
  lustro 651G 1,18T 505465 62,2M 51,8M
    ata-WDC_WD20EFRX-68AX9N0_WD-WMC300004469 - - 198438 24,4M 51,7M
    ata-WDC_WD20EFRX-68EUZN0_WD-WCC4MLK57MVX - - 306 384 37,8M 45,1M
  lustro 651G 1,18T 510 457 63,2M 49,6M
    ata-WDC_WD20EFRX-68AX9N0_WD-WCC1T0429536 - - 304371 37,8M 43,3M
    ata-WDC_WD20EFRX-68EUZN0_WD-WCC4M0VYKFCE - - 206 423 25,5M 49,6M

Zastanawiam się, co się dzieje

zpool iostat podczas odczytu

                                                 przepustowość operacji przepustowości
przydział puli bezpłatny odczyt zapis odczyt odczyt zapis
-------------------------------------------- ----- - ---- ----- ----- ----- -----
pool2 1,27 T 2,35 T 2,68 K 32 339 M 141 K.
  lustro 651G 1,18 T 1,34 K 20 169 M 90,0 K.
    ata-WDC_WD20EFRX-68AX9N0_WD-WMC300004469 - - 748 9 92,5M 96,8K
    ata-WDC_WD20EFRX-68EUZN0_WD-WCC4MLK57MVX - - 623 10 76,8M 96,8K
  lustro 651G 1,18 T 1,34 K 11 170 M 50,8 K.
    ata-WDC_WD20EFRX-68AX9N0_WD-WCC1T0429536 - - 774 5 95,7M 56,0K
    ata-WDC_WD20EFRX-68EUZN0_WD-WCC4M0VYKFCE - - 599 6 74,0 M 56,0 K

iostat -x podczas tej samej operacji odczytu. Zauważ, że IO% nie wynosi 100%.

Urządzenie: rrqm / s wrqm / sr / sw / s rkB / s wkB / s avgrq-sz avgqu-sz czekają r_await w_await svctm% util
sdb 0,60 0,00 661,30 6,00 83652,80 49,20 250,87 2,32 3,47 3,46 4,87 1,20 79,76
sdd 0,80 0,00 735,40 5,30 93273.20 49,20 251,98 2,60 3,51 3,51 4,15 1,20 89,04
sdf 0,50 0,00 656,70 3,80 83196,80 31,20 252,02 2,23 3,38 3,36 6,63 1,17 77,12
sda 0,70 0,00 738,30 3,30 93572.00 31,20 252,44 2,45 3,33 3,31 7,03 1,14 84,24

ustawienia zpool i test zestawu danych:

  • atime jest wyłączony
  • kompresja jest wyłączona
  • ashift ma wartość 0 (autodetekcja - rozumiem, że było w porządku)
  • zdb mówi, że wszystkie dyski są przesunięte w poprzek = 12
  • moduł - opcje zfs zvol_threads = 32 zfs_arc_max = 17179869184
  • sync = standard

Edycja - 30 października 2015 r

Zrobiłem trochę więcej testów

  • zestaw danych bonnie ++ w / recordsize = 1M = 226 MB zapisu, 392 MB odczytu znacznie lepiej
  • zestaw danych dd w / record size = 1M = 260 MB zapisu, 392 MB odczytu znacznie lepiej
  • zvol w / ext4 dd bs = 1M = 128 MB zapisu, 107 MB odczytu, dlaczego tak wolno?
  • zestaw danych 2 równolegle przetwarzanych = 227 MB zapisu, 396 MB odczytu
  • dd direct io nie różni się ani w zbiorze danych, ani w zvol

Jestem znacznie bardziej zadowolony z wydajności dzięki zwiększonemu rozmiarowi płyty. Prawie każdy plik w puli ma ponad 1 MB. Więc zostawię to w ten sposób. Dyski wciąż nie są w 100% wykorzystywane, co sprawia, że ​​zastanawiam się, czy mogłoby to być znacznie szybsze. A teraz zastanawiam się, dlaczego wydajność Zvola jest tak kiepska, ponieważ tego (lekko) używam.

Z przyjemnością udzielę wszelkich informacji wymaganych w komentarzach / odpowiedziach. W moim drugim pytaniu jest także mnóstwo informacji: powolne kopiowanie między katalogami NFS / CIFS na tym samym serwerze

Jestem w pełni świadomy, że po prostu coś nie rozumiem i że może to wcale nie stanowić problemu. Z góry dziękuję.

Aby to wyjaśnić, pytanie brzmi: dlaczego pula ZFS nie jest tak szybka, jak się spodziewam? A może coś jeszcze jest nie tak?

Ryan Babchishin
źródło
1
Podejrzewam, że nie ma tuningu ... Czy dostosowałeś Ashift do swoich dysków? Jakieś ustawienia zfs.conf? Czy atime jest włączone / wyłączone? Jakieś dziwne ustawienia synchronizacji?
ewwhite
@ewwhite Dodałem kilka szczegółów do pytania, dzięki
Ryan Babchishin
Zobacz: tomshardware.com/reviews/red-wd20efrx-wd30efrx-nas,3248-5.html Dyski WD Red mają fatalny czas wyszukiwania. Przesyłają strumieniowo dobrze, ale w rzeczywistym użyciu będą musieli szukać, a statystyki IO pokazują wystarczającą liczbę operacji IO / s, że czas wyszukiwania prawie na pewno wpływa na wydajność. Utwórz Zvol i użyj, ddaby zobaczyć, jaki rodzaj wydajności uzyskasz. Możesz także wypróbować bezpośrednie we / wy w miarę zwiększania prędkości przesyłania strumieniowego, gdzie podwójne buforowanie z buforowania może mieć wpływ na wydajność. FWIW, 3/4 teoretycznej wydajności odczytu surowego 4 dysków jest dobra.
Andrew Henle,
(zabrakło miejsca) Masz również wystarczającą liczbę dysków, aby jednowątkowe operacje we / wy mogą nie wystarczyć, aby zapewnić pełne zajęcie dysków. To może wyjaśniać twoje %utilliczby.
Andrew Henle,
@AndrewHenle Dziękujemy. To wszystko brzmi bardzo rozsądnie. Zajmę się tym teraz.
Ryan Babchishin

Odpowiedzi:

10

Udało mi się uzyskać prędkości bardzo zbliżone do oczekiwanych liczb.

Szukałem 400 MB / s i zarządzałem 392 MB / s . Mówię więc, że problem został rozwiązany. Dzięki późniejszemu dodaniu urządzenia pamięci podręcznej udało mi się odczytać 458 MB / s (chyba w pamięci podręcznej).

1. Początkowo zostało to osiągnięte poprzez zwiększenie recordsizewartości zestawu danych ZFS do1M

zfs set recordsize=1M pool2/test

Uważam, że ta zmiana powoduje tylko mniejszą aktywność dysku, a tym samym bardziej wydajne duże synchroniczne operacje odczytu i zapisu. Właśnie o to prosiłem.

Wyniki po zmianie

  • bonnie ++ = 226 MB zapisu, 392 MB odczytu
  • dd = 260 MB zapisu, 392 MB odczytu
  • 2 równoległe procesy = 227 MB zapisu, 396 MB odczytu

2. Udało mi się jeszcze lepiej, gdy dodałem urządzenie pamięci podręcznej (dysk SSD 120 GB). Pisanie jest trochę wolniejsze, nie jestem pewien dlaczego.

Version  1.97       ------Sequential Output------ --Sequential Input- --Random-
Concurrency   1     -Per Chr- --Block-- -Rewrite- -Per Chr- --Block-- --Seeks--
Machine        Size K/sec %CP K/sec %CP K/sec %CP K/sec %CP K/sec %CP  /sec %CP
igor            63G           208325  48 129343  28           458513  35 326.8  16

Sztuczka z urządzeniem pamięci podręcznej polegała na ustawieniu l2arc_noprefetch=0w /etc/modprobe.d/zfs.conf . Pozwala ZFS buforować dane strumieniowe / sekwencyjne. Zrób to tylko wtedy, gdy twoje urządzenie pamięci podręcznej jest szybsze niż macierz, jak moje.

Po skorzystaniu ze zmiany rekordów w moim zbiorze danych pomyślałem, że może to być podobny sposób radzenia sobie ze słabą wydajnością Zvola.

Natknąłem się na ludzi, którzy wspominali, że osiągnęli dobrą wydajność za pomocą a volblocksize=64k, więc spróbowałem. Brak szczęścia.

zfs create -b 64k -V 120G pool/volume

Ale potem przeczytałem, że ext4 (system plików, z którym testowałem) obsługuje opcje RAID, takie jak stridei stripe-width, których nigdy wcześniej nie używałem. Więc użyłem tej strony do obliczenia potrzebnych ustawień: https://busybox.net/~aldot/mkfs_stride.html i sformatowałem ponownie zvol.

mkfs.ext3 -b 4096 -E stride=16,stripe-width=32 /dev/zvol/pool/volume

Pobiegłem bonnie++wykonać prosty test porównawczy, a wyniki były doskonałe. Niestety nie mam przy sobie wyników, ale były one co najmniej 5-6 razy szybsze w przypadku zapisów, o ile pamiętam. Zaktualizuję tę odpowiedź ponownie, jeśli ponownie przeprowadzę test porównawczy.

Ryan Babchishin
źródło
1
Gdybym mógł dać ci dodatkową +1 za powrót prawie rok później i napisanie tak szczegółowej odpowiedzi, zrobiłbym to. Dzięki!
Jed Daniels
0

Twoje wyniki są całkowicie rozsądne, a twoje oczekiwania nie są: przeceniasz poprawę wydajności odczytu zapewnianą przez RAID1 (a przez to RAID10). Chodzi o to, że dwukierunkowe odbicie lustrzane daje najwyżej 2x szybkość odczytu / IOP pojedynczego dysku, ale wydajność w świecie rzeczywistym może wynosić od 1x do 2x.

Wyjaśnijmy na przykładzie. Wyobraź sobie, że masz system z dwukierunkowym lustrem, z każdym dyskiem zdolnym do 100 MB / s (sekwencyjnie) i 200 IOPS. O głębokości kolejki 1 (max jeden, wybitny żądanie) tej tablicy będzie miał żadnej przewagi nad jednym dysku: RAID1 dzieli żądania IO w kolejce dwóch twardego nie, ale to nie nie podzielić pojedynczego żądania nad dwoma dyskami (przynajmniej każde wdrożenie, które widziałem, zachowuje się w ten sposób). Z drugiej strony, jeśli twoja kolejka IO jest większa (np .: masz 4/8 zaległych żądań), całkowita przepustowość dysku będzie znacznie wyższa niż na jednym dysku.

Podobny punkt można zrobić dla RAID0, ale w tym przypadku to, co określa średnie ulepszenia, jest funkcją nie tylko wielkości kolejki, ale także wielkości żądania IO : jeśli twój średni rozmiar IO jest mniejszy niż rozmiar fragmentu, to nie zostanie rozłożony na dwóch (lub więcej) dyskach, ale będzie obsługiwany przez jeden. Twoje wyniki ze zwiększonym rozmiarem Bonnie ++ pokazują dokładnie to zachowanie: rozkładanie ma ogromne zalety z większego rozmiaru IO.

Teraz powinno być jasne, że połączenie dwóch poziomów RAID w macierzy RAID10 nie doprowadzi do liniowego skalowania wydajności, ale ustanawia dla niego górną granicę . Jestem prawie pewien, że jeśli uruchomisz wiele instancji dd / bonnie ++ (lub użyjesz fiodo bezpośredniej manipulacji kolejką We / Wy), wyniki będą bardziej zgodne z pierwotnymi oczekiwaniami, po prostu dlatego, że opodatkujesz swoją tablicę We / Wy w pełniejszy sposób ( wiele zaległych sekwencyjnych / losowych żądań We / Wy), zamiast ładowania pojedynczych, sekwencyjnych żądań We / Wy.

Shodanshok
źródło
Moje oczekiwania były prawie identyczne z tym, co dostałem - 400 MB / s. Dostaję 392 MB / s. Wydaje się rozsądne. bardzo rozsądne. Uruchomiłem też wiele procesów dd i bonnie ++ równolegle i nie zauważyłem żadnej poprawy wydajności. Nie wyjaśniłeś też, dlaczego wydajność zvol jest tak niska.
Ryan Babchishin
Dostajesz 392 MB / s tylko przy użyciu Bonnie ++ z dużym rozmiarem (> = 1 MB / s), a ja ci wyjaśniłem, dlaczego. EXT4 w porównaniu z ZVOL to konfiguracja, której nigdy nie testowałem, więc zostawiłem ją komentowaniu.
shodanshok