Dlaczego „/ dev / rdisk” jest około 20 razy szybszy niż „/ dev / disk” w Mac OS X

129

Zgodnie z dokumentacją rasbery pi , możesz załadować swój system operacyjny na kartę flash za pomocą / dev / disk lub / dev / rdisk.

rdisk oznacza surowy dysk.

/ dev / disk jest urządzeniem na poziomie bloku, dlaczego rdisk miałby być 20 razy szybszy?

Używam Mac OSX

Uwaga: W OS X każdy dysk może mieć dwa odwołania do ścieżki w / dev: / dev / disk # to urządzenie buforowane, co oznacza, że ​​wszelkie przesyłane dane podlegają dodatkowemu przetwarzaniu. / dev / rdisk # to surowa ścieżka, która jest znacznie szybsza i doskonale OK, gdy używasz programu dd. Na karcie SD klasy 4 różnica była około 20 razy szybsza przy użyciu ścieżki rdisk.

Spuder
źródło
3
Na marginesie, przeprowadziłem test i rdisk faktycznie trwał znacznie dłużej.
spuder
4
Inna dodatkowa uwaga: czułem, że muszę też wtedy przetestować, i odkryłem, że kopia rdisk (przez dd) była prawie dokładnie 4 razy szybsza niż użycie odpowiednika dysku.
Travis Griggs,
Mac OSX 10.9.1 (MacBook Pro 15-calowy, początek 2011 r.)
Travis Griggs
2
Myślałem, że „rdisk” to literówka w niektórych instrukcjach dla czytanego przeze mnie obrazu karty SD Raspberry Pi. Po dalszym dochodzeniu przejrzałem różnicę i znalazłem ten wątek. Okazuje się, że w moim przypadku zapisanie obrazu 1,7 GB na karcie SD było 13 razy szybsze przy użyciu / dev / rdisk zamiast / dev / disk! Macbook Pro Retina 13 ", model z początku 2015 r.
tobias.mcnulty
2
Jako kolejny sidenote, właśnie dodałem obraz Ubuntu ARM do mojej nowo zakupionej karty Sandisk Extreme Pro MicroSD. / dev / disk1 zapisał z prędkością 2,3 MB / s, podczas gdy / dev / rdisk1 zapisał z prędkością 83,7 MB / s, czyli 36,4 razy szybciej.
DanielSmedegaardBuus

Odpowiedzi:

93

Od man hdiutil:

Węzły / dev / rdisk są urządzeniami specjalnymi dla znaków, ale są „surowe” w sensie BSD i wymuszają wyrównane do bloku we / wy. Są bliżej fizycznego dysku niż bufor bufora. Z kolei węzły / dev / disk są buforowanymi urządzeniami blokowymi i są używane głównie przez kod systemu plików jądra.

Mówiąc w skrócie, laik /dev/rdiskprzechodzi prawie bezpośrednio na dysk i /dev/diskpodąża dłuższą, droższą drogą

Daniël W. Crompton
źródło
14
po co używać dysku, skoro można korzystać z rdisk?
user391339,
20
@ user391339 Ponieważ buforowanie jest nadal pożądaną rzeczą. Jeśli masz nośnik wymienny, chcesz uzyskać dane na urządzeniu fizycznym tak szybko, jak to możliwe, ponieważ chcesz je w innym miejscu fizycznym. Wewnętrzne dyski twarde to inna historia. Zazwyczaj nie nosisz ich przy sobie, więc nie obchodzi Cię, kiedy dane są faktycznie zapisywane na urządzeniu. Gdy buforujesz dane zapisane na / odczytywane z urządzeń, jest to droższy sposób zapisu na dysk, ale twoje programy są nadal szybsze, ponieważ nie muszą czekać, aż wszystkie dane, które chcą zapisać, zostaną zapisane na dysku.
Kritzefitz,
@ Dan, Re „force”; znaczenie?
Pacerier
Nie jestem pewien, czy wyjaśnienie Krit działa dla mnie. Mój przypadek może być trochę szczególny, gdy chcę wykonać szybsze skanowanie dużego dysku zewnętrznego jednorazowo i nie jestem pewien, która metoda działa lepiej, ale w przeciwnym razie nadal czuję się dobrze przy normalnym użyciu i czekam, aż zostanie wysunięty, jak to zwykle bywa ćwiczyć. W systemie Windows zawsze jednak wolałem profil „szybkiego odłączania”, który, jak sądzę, odzwierciedla bardziej „surowy” tryb Maca, ponieważ reklamuje mniej uszkodzeń systemu plików w przypadku nieoczekiwanych zdarzeń utraty połączenia.
Pysis
96

Przyjęta odpowiedź jest słuszna, ale nie zawiera zbyt wielu szczegółów.

Jedną z kluczowych różnic między /dev/diski /dev/rdisk, gdy uzyskujesz do nich dostęp z przestrzeni użytkownika, /dev/diskjest buforowanie. Ścieżka odczytu / zapisu dla /dev/diskpodziału I / O na fragmenty 4KB, które odczytuje do bufora pamięci podręcznej, a następnie kopiuje do bufora przestrzeni użytkownika (a następnie wydaje następny odczyt 4KB…). Jest to miłe, ponieważ możesz wykonywać nieprzystosowane odczyty i zapisy, i po prostu działa. W przeciwieństwie do tego, /dev/rdiskpo prostu przekazuje odczyt lub zapis bezpośrednio do urządzenia, co oznacza, że ​​początek i koniec wejścia / wyjścia muszą być wyrównane na granicach sektora.

Jeśli wykonasz odczyt lub zapis do większego niż jeden sektor /dev/rdisk, to żądanie zostanie przekazane bezpośrednio. Niższe warstwy mogą go rozerwać (np. USB rozbija go na 128 KB ze względu na maksymalny rozmiar ładunku w protokole USB), ale ogólnie można uzyskać większe i bardziej wydajne wejścia / wyjścia. Podczas przesyłania strumieniowego, np. Przez dd, od 128 KB do 1 MB są dość dobrych rozmiarów, aby uzyskać prawie optymalną wydajność na obecnym sprzęcie innym niż RAID.

Buforowanie wykonywane przez /dev/diskścieżki odczytu i zapisu jest bardzo proste i prawie martwy. Buforuje, nawet jeśli nie jest to absolutnie konieczne; na przykład, jeśli urządzenie może mapować pamięć i bezpośrednio przenieść do bufora aplikacji. Robi małe we / wy (4KB), co prowadzi do dużego obciążenia na wejściu / wyjściu. Nie wykonuje żadnych odczytów ani zapisów z tyłu.

astruct
źródło
6

Wygląda /dev/diski /dev/rdiskdziała inaczej w przypadku dysków HDD i SSD. Chcę sprawdzić, czy nie ma karty MicroSD. Właśnie napisałem obraz dysku 2 GB do Sandisk Ultra MicroSD 64 GB ( https://www.amazon.com/gp/product/B073JYVKNX ).

Kilkakrotnie powtórzono testy, ale wyniki były stabilne: 17 MB / s dla /dev/diskvs 20 MB / s dla /dev/rdisk. Zmiana bs=1mna nie bs=16mdaje absolutnie żadnej różnicy w szybkości pisania.

  1. Piszę do /dev/disk2

    sudo dd if=~/Downloads/ubuntu-18.04-4.14-minimal-odroid-xu4-20180531.img of=/dev/disk2 bs=1m
    2094006272 bytes transferred in 121.860007 secs (17183704 bytes/sec)
    
  2. Piszę do /dev/rdisk2

    $ sudo dd if=~/Downloads/ubuntu-18.04-4.14-minimal-odroid-xu4-20180531.img of=/dev/rdisk2 bs=1m
    2094006272 bytes transferred in 102.743870 secs (20380839 bytes/sec)
    

Potem postanowiłem przetestować prędkość odczytu: 26 MB / s dla /dev/diskvs 87 MB / s dla /dev/rdisk. Zmiana bs=1mna nie bs=16mdaje absolutnie żadnej różnicy w szybkości odczytu.

  1. Czytanie z /dev/disk2

    sudo dd if=/dev/disk2 of=~/Downloads/ubuntu-18.04-4.14-minimal-odroid-xu4-20180531-2.img bs=1m
    257949696 bytes transferred in 9.895572 secs (26067184 bytes/sec)
    
  2. Czytanie z /dev/rdisk2

    $ sudo dd if=/dev/rdisk2 of=~/Downloads/ubuntu-18.04-4.14-minimal-odroid-xu4-20180531.img bs=1m
    877658112 bytes transferred in 10.021974 secs (87573377 bytes/sec)
    
k06a
źródło
2

Wiem, że to stary wątek, ale inni ludzie mogą być zainteresowani implikacjami prędkości, jakie próbowałem. Chcę wykonać kopię zapasową wewnętrznego dysku SSD w Retina MacBooka Pro 13 "(z dyskiem SSD Silicon Power 1 TB) na zewnętrzny dysk twardy USB 3.0 2,5", chcąc przechwycić zarówno partycje macOS, jak i BOOTCAMP. Mój początkowy wiersz poleceń brzmiał:

sudo dd if=/dev/disk0 of=/dev/disk2 bs=1m

Wyniki były z szybkością kopiowania ~ 31,3 MB / sekundę. To było zbyt długo, by czekać. Tak więc przy drugiej próbie wiersz polecenia brzmiał:

sudo dd if=/dev/rdisk0 of=/dev/rdisk2 bs=1m

Używanie /dev/rdiskzamiast /dev/diskznacznie przyspieszonych rzeczy, do około 98,4 MB / sekundę! Jednak robi się jeszcze lepiej. Tak więc dla trzeciej próby użyłem tego wiersza poleceń:

sudo dd if=/dev/rdisk0 of=/dev/rdisk2 bs=1m conv=sparse

Opcja rzadka mówi DD, aby nie zawracał sobie głowy zapisywaniem do bloków wyjściowych, które są zerami na wejściu. Fajne jest to, że robi się to znacznie szybciej, niż mogłoby się wydawać, nawet w środku „pełnych” obszarów dysku. Na każdym dysku, który nie jest pełny, będziesz mieć duże zera, co dodatkowo przyspieszy DD. Do tej pory przynajmniej DD polega na teoretycznej szybkości transferu mojego dysku twardego: ~ 116,4 MB / s, i nie osiągnął jeszcze tak dużych pustych obszarów.

Wypróbuj te opcje - działają! Uwaga: ostrożnie zmień if=of=odpowiednio wskaż odpowiednie dyski wymienione przez (dla komputerów Mac):

diskutil list
Mark J Foster
źródło
1
conv=sparsejest świetny, gdy kopiujesz pliki.    Byłbym zaniepokojony, że może przedstawić korupcji przy kopiowaniu całego dysku, partycji lub do  systemu plików , chyba że wiesz, ze 100% pewnością, że dysk docelowy zawiera nic poza zerami.
G-Man
1

Dla przypomnienia, przynajmniej w macOS High Sierra / dev / disk wydaje się być znacznie szybszy niż / dev / rdisk. Uruchamiając dd lub ddrescue, moje porównanie przepustowości kopiowania z magnetycznego HD na dysk SSD wyniosło 3,7 MB / s przy użyciu / dev / rdisk i 45 MB / s przy użyciu / dev / disk. Dlatego w późniejszych wersjach systemu macOS najlepszym rozwiązaniem może być użycie / dev / disk zamiast / dev / rdisk.

JLG
źródło
2
Podczas zapisywania obrazu o pojemności 4,6 GB w formacie raspbian z wewnętrznego dysku SSD na kartę SD z dd i bs 1 MB / dev / rdisk nadal działa znacznie szybciej niż / dev / dysk na MacBooku Pro z końca 2013 roku z systemem macOS 10.13.2. Zajęło 27,16 minut przy użyciu / dev / disk i tylko 5,18 minut przy użyciu / dev / rdisk.
digitaladdictions
@digitaladdictions właśnie wykonał kilka testów na najnowszym systemie macOS: superuser.com/a/1346063/126537
k06a
0

Myślę, zanim zastanowię się, który węzeł ścieżki jest szybszy, lub zanurzę się w testach seryjnych. Powinniśmy wziąć pod uwagę inny czynnik, który dramatycznie wpłynie na końcową prędkość odczytu / zapisu.

jak specyfikacja karty Micro SD, klasa 4/10 / HC I ... chip czytnika kart SD i interfejs, USB 1.1 / 2.0 / 3.0 / 3.1 OS całkowita pamięć / wolna pamięć, obciążenie systemu operacyjnego, typ dysku twardego OS, HDD / SSD, HDD prędkość wirowania i rozmiar pamięci podręcznej, rozmiar dysku SSD / pamięć podręczna / wolne miejsce / interfejs dysku twardego, ata / sata / esata,

jeśli jakikolwiek czynnik stanie się wąskim gardłem, otrzymamy fałszywy wniosek.

oto mój wynik: osx 10.12.6, ssd,

odczyt microSD 16G za pomocą karty USB 2.0 odczyt i zapis na zewnętrzny dysk twardy 3,5 cala przez USB 3.0,

15193+1 records in
15193+1 records out
15931539456 bytes transferred in 1423.067033 secs (11195214 bytes/sec)

zapis microSD 32G poprzez odczyt karty wewnętrznej, a źródłem danych jest zewnętrzny dysk twardy 3,5 cala USB 3.0,

0+253945 records in
0+253945 records out
15931539456 bytes transferred in 440.093686 secs (36200336 bytes/sec)

widać, prędkość zapisu> prędkość odczytu !!

Cyfrowe życie
źródło