“Dd” deki “bs” seçeneği gerçekten hızı arttırıyor mu?


58

Her şimdi ve sonra, bir "dd" nin hızını arttırmak için dikkatlice uygun bir "blok boyutu" seçmem gerektiğini söyledim.

Burada bile, ServerFault'da bir başkası " ... optimum blok boyutunun donanıma bağlı olduğunu ... " (iain) veya " ... mükemmel boyutun sistem veriyoluna, sabit sürücü denetleyicisine, özel sürücüye bağlı olacağını yazdı kendisi ve bunların her biri için sürücüler ... " (chris-s)

Benim hislerim biraz farklı olduğu için ( BTW: bs parametresini derinlemesine ayarlamak için gereken zamanın, zaman kazanımı açısından kazancımdan çok daha yüksek olduğunu ve varsayılanın makul olduğunu düşündüm), bugün gittim. bazı hızlı ve kirli ölçütler aracılığıyla.

Dışsal etkileri azaltmak için okumaya karar verdim:

  • harici bir MMC kartından
  • dahili bir bölümden

ve:

  • ilgili dosya sistemleriyle birlikte
  • "yazma hızı" ile ilgili sorunlardan kaçınmak için çıktının / dev / null'a gönderilmesi;
  • En azından HDD'yi kullanırken, temel HDD önbellekleme sorunlarından kaçınmak.

Aşağıdaki tabloda, "bs" nin farklı değerlerine sahip 1 GB veri okuduğumda bulgularımı bildirdim ( ham sayıları bu mesajın sonunda bulabilirsiniz ):

görüntü tanımını buraya girin

Temelde bu şöyle diyor:

  • MMC: bs = 4 (evet! 4 bayt) ile 12 MB / sn verim elde ettim. Çok uzak olmayan değerler, bs = 5 ve üstü değerlerden elde ettiğim maksimum 14.2 / 14.3;

  • HDD: bs = 10 ile 30 MB / s'ye ulaştım. Elbette 95.3 MB'den daha düşük olan varsayılan bs = 512 ile aldım ama ... önemli.

Ayrıca, CPU sys zamanının bs değeri ile ters orantılı olduğu çok açıktı (ancak bu kulağa ne kadar düşük olursa, dd tarafından üretilen sys çağrılarının sayısı o kadar yüksek olur) çok açıktı.

Yukarıdakilerin hepsini söyledikten sonra, şimdi soru: Birisi (bir çekirdek korsanı mı?) Böyle bir işlemle ilgili ana bileşen / sistemler nelerdir ve varsayılandan daha yüksek bir bs belirtme çabasına değerse açıklayabilir mi?


MMC çantası - ham sayılar

bs = 1M

root@iMac-Chiara:/tmp# time dd if=/dev/sdc of=/dev/null bs=1M count=1000
1000+0 record dentro
1000+0 record fuori
1048576000 byte (1,0 GB) copiati, 74,1239 s, 14,1 MB/s

real    1m14.126s
user    0m0.008s
sys     0m1.588s

bs = 1k

root@iMac-Chiara:/tmp# time dd if=/dev/sdc of=/dev/null bs=1k count=1000000
1000000+0 record dentro
1000000+0 record fuori
1024000000 byte (1,0 GB) copiati, 72,7795 s, 14,1 MB/s

real    1m12.782s
user    0m0.244s
sys     0m2.092s

bs = 512

root@iMac-Chiara:/tmp# time dd if=/dev/sdc of=/dev/null bs=512 count=2000000
2000000+0 record dentro
2000000+0 record fuori
1024000000 byte (1,0 GB) copiati, 72,867 s, 14,1 MB/s

real    1m12.869s
user    0m0.324s
sys     0m2.620s

bs = 10

root@iMac-Chiara:/tmp# time dd if=/dev/sdc of=/dev/null bs=10 count=100000000
100000000+0 record dentro
100000000+0 record fuori
1000000000 byte (1,0 GB) copiati, 70,1662 s, 14,3 MB/s

real    1m10.169s
user    0m6.272s
sys     0m28.712s

bs = 5

root@iMac-Chiara:/tmp# time dd if=/dev/sdc of=/dev/null bs=5 count=200000000
200000000+0 record dentro
200000000+0 record fuori
1000000000 byte (1,0 GB) copiati, 70,415 s, 14,2 MB/s

real    1m10.417s
user    0m11.604s
sys     0m55.984s

bs = 4

root@iMac-Chiara:/tmp# time dd if=/dev/sdc of=/dev/null bs=4 count=250000000
250000000+0 record dentro
250000000+0 record fuori
1000000000 byte (1,0 GB) copiati, 80,9114 s, 12,4 MB/s

real    1m20.914s
user    0m14.436s
sys     1m6.236s

bs = 2

root@iMac-Chiara:/tmp# time dd if=/dev/sdc of=/dev/null bs=2 count=500000000
500000000+0 record dentro
500000000+0 record fuori
1000000000 byte (1,0 GB) copiati, 161,974 s, 6,2 MB/s

real    2m41.976s
user    0m28.220s
sys     2m13.292s

bs = 1

root@iMac-Chiara:/tmp# time dd if=/dev/sdc of=/dev/null bs=1 count=1000000000
1000000000+0 record dentro
1000000000+0 record fuori
1000000000 byte (1,0 GB) copiati, 325,316 s, 3,1 MB/s

real    5m25.318s
user    0m56.212s
sys     4m28.176s

HDD kutusu - ham numaralar

bs = 1

root@iMac-Chiara:/tmp# time dd if=/dev/sda3 of=/dev/null bs=1 count=1000000000
1000000000+0 record dentro
1000000000+0 record fuori
1000000000 byte (1,0 GB) copiati, 341,461 s, 2,9 MB/s

real    5m41.463s
user    0m56.000s
sys 4m44.340s

bs = 2

root@iMac-Chiara:/tmp# time dd if=/dev/sda3 of=/dev/null bs=2 count=500000000
500000000+0 record dentro
500000000+0 record fuori
1000000000 byte (1,0 GB) copiati, 164,072 s, 6,1 MB/s

real    2m44.074s
user    0m28.584s
sys 2m14.628s

bs = 4

root@iMac-Chiara:/tmp# time dd if=/dev/sda3 of=/dev/null bs=4 count=250000000
250000000+0 record dentro
250000000+0 record fuori
1000000000 byte (1,0 GB) copiati, 81,471 s, 12,3 MB/s

real    1m21.473s
user    0m14.824s
sys 1m6.416s

bs = 5

root@iMac-Chiara:/tmp# time dd if=/dev/sda3 of=/dev/null bs=5 count=200000000
200000000+0 record dentro
200000000+0 record fuori
1000000000 byte (1,0 GB) copiati, 66,0327 s, 15,1 MB/s

real    1m6.035s
user    0m11.176s
sys 0m54.668s

bs = 10

root@iMac-Chiara:/tmp# time dd if=/dev/sda3 of=/dev/null bs=10 count=100000000
100000000+0 record dentro
100000000+0 record fuori
1000000000 byte (1,0 GB) copiati, 33,4151 s, 29,9 MB/s

real    0m33.417s
user    0m5.692s
sys 0m27.624s

bs = 512 (önbelleğe almamak için okumayı dengelemek)

root@iMac-Chiara:/tmp# time dd if=/dev/sda3 of=/dev/null bs=512 count=2000000 skip=6000000
2000000+0 record dentro
2000000+0 record fuori
1024000000 byte (1,0 GB) copiati, 10,7437 s, 95,3 MB/s

real    0m10.746s
user    0m0.360s
sys 0m2.428s

bs = 1k (önbelleğe almamak için okumayı dengelemek)

root@iMac-Chiara:/tmp# time dd if=/dev/sda3 of=/dev/null bs=1k count=1000000 skip=6000000
1000000+0 record dentro
1000000+0 record fuori
1024000000 byte (1,0 GB) copiati, 10,6561 s, 96,1 MB/s

real    0m10.658s
user    0m0.164s
sys 0m1.772s

bs = 1k (önbelleğe almamak için okumayı dengelemek)

root@iMac-Chiara:/tmp# time dd if=/dev/sda3 of=/dev/null bs=1M count=1000 skip=7000
1000+0 record dentro
1000+0 record fuori
1048576000 byte (1,0 GB) copiati, 10,7391 s, 97,6 MB/s

real    0m10.792s
user    0m0.008s
sys 0m1.144s

11
Gerçekten güzel olan şey , cihazdaki optimal bs parametresini tespit edip kullanacak bir bs=autoözelliğe sahip ddolmak.

4
Ne olurdu , son derece güzel birkaçının bir grafiktir bshız yerine tek soru 15 düzine kod blokları karşı çizilen boyutlarda. Az yer alıp misiniz olmak sonsuz okumak için daha hızlı. Bir resim gerçekten olan bir thoursand kelime değerinde.
MDMoore313

2
@BigHomie - Bir grafik sağlama hakkında düşündüm ama ... birkaç "ölçeklendirme" sorunu var. Muhtemelen, her iki eksende de logaritmik bir skalaya ihtiyaç duyardı ve ... bunu düşünürken, çözmesi kolay (ve hızlı) bir sorun olmadığını düşündüm. Bu yüzden "tablo" versiyonuna geçtim. "... 15 düzine kod bloğu" na gelince, herkesin herhangi bir (kişisel, benim) müdahaleyi önlemek için "ham sayıları" kontrol etme şansı olmasını istedim.
Damiano Verzulli,

1
@DamianoVerzulli masa harika, lütfen rantımı boşver, sana batıl inançlarımızı kanıtlamak için sana bir nezaket verdim, ve ilk önce bayt boyutuyla uğraşmanın hızı değiştireceğini biliyorum, ben de bir cevaba koyabilirim.
MDMoore313

1
@ warren - 4G almak için de yapabilirsin bs=8k count=512Kveya bs=1M count=4K65536 geçmişinden
2'in

Yanıtlar:


24

Yaptığınız sadece bir okuma hızı testidir. aslında blokları başka bir cihaza kopyalıyorsanız, diğer cihaz yazmak istediğiniz verileri kabul ederken, okuma sırasında duraklatırsınız, bu olduğunda, okuma cihazındaki dönme gecikme sorunlarına (eğer bir sabit disk ise) basabilirsiniz. dönme gecikme süresine karşı daha az sıklıkta karşılaştığınızda, 1M’nin HDD’sindeki parçalarını okumak genellikle daha hızlı olur.

Sabit diskleri kopyalarken , varsayılanı veya bs=1Mkullanmaktan daha hızlı bir şekilde belirttiğimi biliyorum bs=4k. Yüzde 30 ila 300'lük hız geliştirmelerinden bahsediyorum. Her gün yaptığınız tek şey olmadıkça, en iyisini yapmanıza gerek yok. ancak varsayılandan daha iyi bir şey seçmek, yürütme süresinden saati kesebilir.

Bunu gerçek için kullanırken, birkaç farklı numara deneyin ve ddişleme SIGUSR1, durum raporu vermesini sağlamak için bir sinyal gönderin.

✗ killall -SIGUSR1 dd
1811+1 records in
1811+1 records out
1899528192 bytes (1.9 GB, 1.8 GiB) copied, 468.633 s, 4.1 MB/s

2014 Macbook Pro Retina USB3 belleğe kopyalama 90 MB / sn yazma: $ sudo dd if=~/Downloads/Qubes-R4.0-rc4-x86_64.iso of=/dev/rdisk2 status=progressgösteriyor 6140928 bytes (6.1 MB, 5.9 MiB) copied, 23 s, 267 kB/s. Bunu çok uzun sürdüğü için iptal ettim. Şimdi byteize belirten: $ sudo dd if=~/Downloads/Qubes-R4.0-rc4-x86_64.iso of=/dev/rdisk2 bs=1M status=progressshows4558159872 bytes (4.6 GB, 4.2 GiB) copied, 54 s, 84.4 MB/s
Eric Duncan

9

Dahili sabit disk ile ilgili olarak, en azından - cihazdan okurken blok katmanı en az 512 bayt olan bir sektörü almak zorundadır.

Bu nedenle, 1 baytlık bir okuma ile uğraşırken, yalnızca sektördeki bayt alımı ile ilgili diskten gerçekten okuyabilirsiniz. Kalan 511 kez önbellek tarafından servis edilir.

Bunu aşağıdaki şekilde ispatlayabilirsiniz, bu örnekte sdbilgilenilen bir disktir:

# grep sdb /proc/diskstats
8      16 sdb 767 713 11834 6968 13710 6808 12970792 6846477 0 76967 6853359
...
# dd if=/dev/sdb of=/dev/null bs=1 count=512
512+0 records in
512+0 records out
512 bytes (512 B) copied, 0.0371715 s, 13.8 kB/s
# grep sedb /proc/diskstats
8      16 sdb 768 713 11834 6968 13710 6808 12970792 6846477 0 76967 6853359
...

Dördüncü sütun (okumaları sayar), 1 byte okuma talebinde bulunmanıza rağmen sadece 1 okuma gerçekleştiğini gösterir. Bu beklenen davranış, çünkü bu aygıt (bir SATA 2 diski) en azından sektör boyutuna geri dönmek zorunda . Çekirdek basitçe tüm sektörü önbelleğe alıyor.

Bu büyüklük taleplerinde en büyük etken, bir okuma veya yazma için bir sistem çağrısı düzenlemenin ek yüküdür. Aslında, çağrıyı <512'ye yapmak yetersizdir. Çok büyük okumalar, daha fazla bellek kullanmanın maliyeti karşılığında daha az sistem çağrısı gerektirir.

4096 genellikle okumak için 'güvenli' bir sayıdır, çünkü:

  • Önbelleğe alma ile okurken (varsayılan) sayfa 4k'dir. Bir sayfayı <4k okuma ile doldurmak, okuma ve sayfa boyutunu aynı tutmaktan daha karmaşıktır.
  • Çoğu dosya sistemi blok boyutu 4k olarak ayarlanmıştır.
  • Syscall tepegöze neden olacak kadar küçük bir sayı değil (belki de SSD'ler için) ancak çok fazla bellek tüketecek kadar büyük sayıya neden olmaz.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.