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ę
- 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.
- Dane są równoważone między serwerami lustrzanymi (ważne dla ZFS)
- 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.
- 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.
- 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.
- Myślałem, że pula da mi około 2x zapisu, 2x przepisywania i 4x odczytu na jednym dysku - czy się mylę?
- 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?
dd
aby 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.%util
liczby.Odpowiedzi:
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
recordsize
wartości zestawu danych ZFS do1M
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
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.
Sztuczka z urządzeniem pamięci podręcznej polegała na ustawieniu
l2arc_noprefetch=0
w /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.Ale potem przeczytałem, że ext4 (system plików, z którym testowałem) obsługuje opcje RAID, takie jak
stride
istripe-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.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.źródło
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
fio
do 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.źródło