Jak obliczyć optymalny rozmiar bloku podczas uruchamiania dd
? Trochę to zbadałem i nie znalazłem nic, co sugerowałoby, jak można to osiągnąć.
Mam wrażenie, że większy rozmiar bloku skutkowałby szybszym dd
... czy to prawda?
Mam zamiar dd
dwa identyczne dyski twarde Hitachi 500 GB, które działają z prędkością 7200 obr./min na pudełku z procesorem Intel Core i3 z 4 GB pamięci RAM DDR3 1333 MHz, więc próbuję dowiedzieć się, jakiego rozmiaru bloków użyć. (Mam zamiar uruchomić Ubuntu 10.10 x86 z dysku flash i uruchomić go z tego).
dd
dodanie funkcji umożliwiającej znalezienie optymalnego rozmiaru bloku podczas przesyłania plikuOdpowiedzi:
Optymalny rozmiar bloku zależy od różnych czynników, w tym systemu operacyjnego (i jego wersji) oraz różnych magistral sprzętowych i dysków. Kilka systemów uniksopodobnych (w tym Linux i przynajmniej niektóre odmiany BSD) definiuje
st_blksize
członka w tym,struct stat
który daje to, co jądro uważa za optymalny rozmiar bloku:Najlepszym sposobem może być eksperymentowanie: skopiuj gigabajt z różnymi rozmiarami bloków i czasem. (Pamiętaj, aby wyczyścić bufory jądra przed każdym uruchomieniem:)
echo 3 > /proc/sys/vm/drop_caches
.Jednak z reguły stwierdziłem, że wystarczająco duży rozmiar bloku pozwala
dd
wykonać dobrą robotę, a różnice między, powiedzmy, 64 KiB i 1 MiB są niewielkie, w porównaniu do 4 KiB w porównaniu z 64 KiB. (Chociaż, co prawda, minęło trochę czasu, odkąd to zrobiłem. Domyślnie używam teraz mebibajta lub po prostudd
wybieram rozmiar).źródło
Jak powiedzieli inni, nie ma uniwersalnie poprawnego rozmiaru bloku; to, co jest optymalne dla jednej sytuacji lub jednego elementu sprzętu, może być strasznie nieefektywne dla innego. Ponadto, w zależności od kondycji dysków, może być lepsze użycie innego rozmiaru bloku niż „optymalny”.
Jedną z rzeczy, która jest dość niezawodna na nowoczesnym sprzęcie, jest to, że domyślny rozmiar bloku 512 bajtów jest prawie o rząd wielkości wolniejszy niż bardziej optymalna alternatywa. W razie wątpliwości stwierdziłem, że 64K to całkiem solidna, nowoczesna opcja domyślna. Chociaż 64K zwykle nie jest optymalnym rozmiarem bloku, z mojego doświadczenia wynika, że jest o wiele bardziej wydajny niż domyślny. 64K ma również dość solidną historię niezawodnej wydajności: Możesz znaleźć wiadomość z listy mailingowej Eug-Lug z około 2002 roku, zalecającą rozmiar bloku 64K tutaj: http://www.mail-archive.com/eug- [email protected]/msg12073.html
Aby określić optymalny rozmiar bloku wyjściowego, napisałem następujący skrypt, który testuje zapisywanie pliku testowego 128 MB z dd w zakresie różnych rozmiarów bloków, od domyślnych 512 bajtów do maksymalnie 64 MB. Ostrzegamy, ten skrypt używa dd wewnętrznie, więc używaj go ostrożnie.
dd_obs_test.sh:
Zobacz na GitHub
Testowałem ten skrypt tylko w systemie Debian (Ubuntu) i na OSX Yosemite, więc prawdopodobnie zajmie to trochę poprawek, aby działać na innych odmianach Uniksa.
Domyślnie polecenie utworzy plik testowy o nazwie dd_obs_testfile w bieżącym katalogu. Alternatywnie możesz podać ścieżkę do niestandardowego pliku testowego, podając ścieżkę po nazwie skryptu:
Wynikiem skryptu jest lista testowanych rozmiarów bloków i odpowiadające im szybkości przesyłania, takie jak:
(Uwaga: jednostka szybkości przesyłania różni się w zależności od systemu operacyjnego)
Aby przetestować optymalny rozmiar bloku odczytu, możesz użyć mniej więcej tego samego procesu, ale zamiast czytać z / dev / zero i zapisywać na dysku, czytasz z dysku i zapisujesz do / dev / null. Skrypt, który to zrobi, może wyglądać następująco:
dd_ibs_test.sh:
Zobacz na GitHub
Istotną różnicą w tym przypadku jest to, że plik testowy jest plikiem zapisywanym przez skrypt. Nie kieruj tego polecenia na istniejący plik lub istniejący plik zostanie nadpisany zerami!
W przypadku mojego konkretnego sprzętu stwierdziłem, że 128 KB było najbardziej optymalnym rozmiarem bloku wejściowego na dysku twardym, a 32 KB było najbardziej optymalne na dysku SSD.
Chociaż ta odpowiedź obejmuje większość moich ustaleń, napotkałem tę sytuację wystarczająco dużo razy, że napisałem o niej post na blogu: http://blog.tdg5.com/tuning-dd-block-size/ Możesz znaleźć więcej szczegółów na testach, które tam przeprowadziłem.
źródło
dd_obs_test.sh
conv=fsync
nie działa na MacOS i mogą być usunięte.Okazało się, że mój optymalny rozmiar bloku to 8 MB (równy pamięci podręcznej dysku?). Musiałem wyczyścić (niektórzy mówią: umyć) puste miejsce na dysku przed utworzeniem jego skompresowanego obrazu. Użyłem:
Eksperymentowałem z wartościami od 4K do 100M.
Po dłuższym uruchomieniu dd zabiłem go (Ctlr + C) i przeczytałem wyjście:
Ponieważ dd wyświetla szybkość wejścia / wyjścia (w tym przypadku 19,1 MB / s), łatwo jest sprawdzić, czy wybrana wartość działa lepiej niż poprzednia, czy gorzej.
Moje wyniki:
Uwaga: Aby sprawdzić, jaki jest rozmiar pamięci podręcznej / bufora dysku, możesz użyć
sudo hdparm -i /dev/sda
źródło
8M
jest trudny do pokonania.Jest to całkowicie zależne od systemu. Należy poeksperymentować, aby znaleźć optymalne rozwiązanie. Spróbuj zacząć od
bs=8388608
. (Ponieważ dyski twarde Hitachi wydają się mieć 8 MB pamięci podręcznej).źródło
bs=8M
na GNU / Linuksie lubbs=8m
na BSDbs=8388608
i zmniejszaj raz na każdy krok”źródło
źródło