Czasami widziałem komentarze online w stylu „upewnij się, że ustawiłeś„ bs = ”, ponieważ wartość domyślna potrwa zbyt długo”, i moje własne, bardzo nienaukowe doświadczenia, „cóż, wydawało się, że zajęło to dłużej niż inne czas w zeszłym tygodniu ”wydaje się to potwierdzać. Dlatego za każdym razem, gdy używam „dd” (zwykle w zakresie 1-2 GB), muszę podać parametr bajtów. Mniej więcej w połowie przypadków używam wartości określonej w dowolnym internetowym przewodniku, z którego kopiuję; przez resztę czasu wybiorę liczbę, która ma sens z listy „fdisk -l” dla tego, co zakładam, że jest wolniejszym nośnikiem (np. karta SD, na której piszę).
Czy w danej sytuacji (rodzaj nośnika, rozmiary magistrali lub cokolwiek innego ma znaczenie), czy istnieje sposób na określenie „najlepszej” wartości? Czy łatwo to ustalić? Jeśli nie, to czy istnieje prosty sposób na uzyskanie 90-95% drogi? A może „po prostu wybierz coś większego niż 512” to nawet poprawna odpowiedź?
Myślałem o samodzielnym wypróbowaniu eksperymentu, ale (oprócz tego, że mam dużo pracy) nie jestem pewien, jakie czynniki wpływają na odpowiedź, więc nie wiem, jak zaprojektować dobry eksperyment.
źródło
Odpowiedzi:
dd
pochodzi z przeszłości, kiedy trzeba było tłumaczyć stare taśmy na komputerach mainframe IBM, a rozmiar bloku musiał odpowiadać rozmiarowi użytemu do zapisu taśmy, w przeciwnym razie bloki danych zostaną pominięte lub obcięte. (Taśmy 9-ścieżkowe były wybredne. Ciesz się, że już dawno nie żyją.) Obecnie rozmiar bloku powinien być wielokrotnością rozmiaru sektora urządzenia (zwykle 4KB, ale na bardzo niedawnych dyskach może być znacznie większy i bardzo mały kciuk dyski mogą być mniejsze, ale 4KB jest rozsądnym środkowym punktem niezależnie), a im większy, tym lepsza wydajność. Często używam bloków wielkości 1 MB z dyskami twardymi. (Mamy także o wiele więcej pamięci, którą można teraz rozrzucać.)źródło
@Gilles
Jeśli chcesz, żebym był powiadamiany o odpowiedzi na komentarz, musisz (ogólnie) podać , patrz Jak działa komentarz @ odpowiedzi? . Odkąd przechodziłem obok: jądro i tak sobie z tym wszystkim poradzi. Twierdzenie, że „ta dodatkowa praca może znacznie skrócić czas kopiowania” nie zgadza się z moimi testami porównawczymi, ale różne systemy mogą mieć różne zachowania, więc proszę również podać czas!Jest tylko jeden sposób na określenie optymalnego rozmiaru bloku, i to jest punkt odniesienia. Właśnie zrobiłem szybki test porównawczy. Komputer testowy to komputer z systemem Debian GNU / Linux, z jądrem 2.6.32 i coreutils 8.5. Oba zaangażowane systemy plików to ext3 na woluminach LVM na partycji dysku twardego. Plik źródłowy ma 2 GB (a dokładniej 2040000 kB). Buforowanie i buforowanie są włączone. Przed każdym uruchomieniem opróżniłem pamięć podręczną
sync; echo 1 >|/proc/sys/vm/drop_caches
. Czasy przebiegu nie obejmują finałusync
do opróżnienia buforów; finałsync
zajmuje 1 sekundę. Tesame
przebiegi były kopie na tym samym systemie plików; tediff
przebiegi były kopie do plików na innym dysku twardym. W celu zachowania spójności podane czasy to czasy zegara ściennego uzyskane ztime
narzędzie w kilka sekund. Uruchomiłem każdą komendę tylko raz, więc nie wiem, jak duża jest rozbieżność w czasie.Wniosek: duży rozmiar bloku (kilka megabajtów) pomaga, ale nie dramatycznie (znacznie mniej niż się spodziewałem dla kopii na tym samym dysku). A
cat
icp
nie działają tak źle. Z tymi liczbami niedd
warto się przejmować. Idź zcat
!źródło
>|
jest taki sam jak>
poza tymset -o noclobber
, że pod powłoką narzeka, że plik istnieje, jeśli go używasz>
.cat
. Dlaczego szukasz lepszego sposobu? Co jest nie tak zcat
?cat
po prostu kopiuje dane wejściowe na dane wyjściowe. Jeśli chcesz kopiować z niewiarygodnych nośników i pomijać nieczytelne części lub próbować wiele razy, jest to inny problem, któryddrescue
działa całkiem nieźle.lsof
. Szybkość natychmiastowa nie jest zbyt istotna w przypadku kopii dysku, ponieważ jest jednolita, dzięki czemu można dzielić bajty przesyłane przez upływ czasu; jeśli chcesz czegoś lepszego, możesz użyćpv
.Zgadzam się z geekozaurem, że rozmiar powinien być wielokrotnością rozmiaru bloku, który często wynosi 4K.
Jeśli chcesz znaleźć rozmiar bloku,
stat -c "%o" filename
jest to prawdopodobnie najłatwiejsza opcja.Ale powiedz, że tak
dd bs=4K
, to znaczy, żeread(4096); write(4096); read(4096); write(4096)
...Każde wywołanie systemowe wymaga przełącznika kontekstu, co wiąże się z pewnym narzutem i, w zależności od harmonogramu we / wy, odczytywanie z rozproszonymi zapisami może spowodować, że dysk wykona wiele prób. (Prawdopodobnie nie jest to poważny problem z harmonogramem Linuksa, ale mimo to coś do przemyślenia.)
Jeśli to zrobisz
bs=8K
, pozwalasz dyskowi na odczyt dwóch bloków naraz, które prawdopodobnie są blisko siebie na dysku, zanim zaczniesz szukać innego miejsca do zapisu (lub obsługi I / O dla innego procesu).Zgodnie z tą logiką
bs=16K
jest jeszcze lepsza itp.Chciałbym więc wiedzieć, czy istnieje górna granica, w której wydajność zaczyna się pogarszać, lub jeśli ogranicza ją tylko pamięć.
źródło
Jak mówi Gilles, możesz określić optymalny parametr dla opcji bs do dd poprzez testowanie. To jednak nasuwa pytanie: w jaki sposób można wygodnie przeprowadzić analizę porównawczą tego parametru?
Moja wstępna odpowiedź na to pytanie brzmi: użyj dd-opt , narzędzia, nad którym niedawno zacząłem pracować, aby dokładnie rozwiązać ten problem :)
źródło
dd-opt
dawna. Jest to jednak bezpłatne oprogramowanie na licencji AGPLv3 . Dlatego możesz go ulepszyć i ocenić jego czułość / dokładność!Zoptymalizowałem czytnik kart SD usb2.0, który wydaje się działać najlepiej
bs=10M
. Próbowałem 4k, do 16M, po 8-10M bez poprawy. Możesz zobaczyć, jak zmniejsza się szybkość przesyłania danych ... najprawdopodobniej z powodu załadowania buforów na urządzeniu, a następnie oczekiwania na przeniesienie urządzenia na rzeczywisty nośnik.źródło