Bs parametresinin dd için optimal değerini belirlemenin bir yolu var mı?


71

Zaman zaman, çevrimiçi '' bs = 'olarak ayarladığınızdan emin olun, çünkü varsayılan değer çok uzun sürecek' 've kendi son derece bilimsel olmayan deneyimlerim' boyunca çevrimiçi yorumlar gördüm, bu diğerinden daha uzun sürdü geçen hafta saat "buna dayanıyor gibi görünüyor. Bu yüzden ne zaman 'dd' kullanmalıysam (genellikle 1-2GB aralığında) bytes parametresini belirlediğimden emin oluyorum. Yaklaşık yarısı, kopyaladığım çevrimiçi kılavuzda belirtilen değeri kullanıyorum; zamanın geri kalan kısmı 'fdisk -l' listesinden daha yavaş bir ortam olduğunu düşündüğüm için mantıklı olan bir sayı seçeceğim (örneğin yazdığım SD kart).

Belirli bir durum için (medya tipi, veri yolu boyutları veya diğer hususlar), "en iyi" bir değer belirlemenin bir yolu var mı? Belirlenmesi kolay mı? Değilse, yolun% 90-95'ini almanın kolay bir yolu var mı? Yoksa "sadece 512'den büyük bir şey seç" doğru cevabı bile mi?

Deneyi kendim denemeyi düşündüm, ancak (çok fazla çalışmaya ek olarak) cevabı hangi faktörlerin etkilediğinden emin değilim, bu yüzden iyi bir deneyi nasıl tasarlayacağımı bilmiyorum.


aynı depolama ortamına yazma, farklı bir depolama ortamına yazmadan farklıdır ve farklı optimum ayarlar gerektirir, cihaz türüne, hızına, önbelleğine vb. bağlı olarak herkes için farklı olacak birçok değişken vardır. Makinemde bs = 256M en uygunudur.

Yanıtlar:


27

ddeski IBM anabilgisayar bantlarını çevirmek gerektiğinde arkadan tarihlenir ve blok boyutu, kaseti yazmak için kullanılanla eşleşmek zorunda kalır ya da veri blokları atlanır ya da kesilirdi. (9 kanallı bantlar titizdi. Uzun süre öldüklerine sevindik.) Bu günlerde, blok büyüklüğü cihaz sektörünün büyüklüğünün bir katı olmalıdır (genellikle 4KB, ancak çok yeni disklerde çok daha büyük ve çok küçük baş parmaklarda olabilir). sürücüler daha küçük olabilir, ancak 4KB ne olursa olsun makul bir temeldir) ve performans ne kadar büyükse o kadar iyidir. Sabit disklerde genellikle 1 MB'lık blok boyutları kullanırım. (Bu günlerde atmak için daha fazla hafızamız var.)


Sabit sürücüler veya USB yığın depolama aygıtları 512 veya 4096 (daha yeni) bayttır. Optik ve doğrudan erişim flaş ortamı 2048 bayttır. 4096 bayt ile yanlış gidemem.
LawrenceC

3
Kopyalama programının blok büyüklüğünün neden temel cihazın özellikleriyle (kasetler hariç) ilgisi olmalıdır? Çekirdek yine de kendi arabelleğe alma (ve bazen ön hazırlık) yapar.
Gilles

1
Kesirli tamponları en aza indirmek için; Çekirdek arabellek kullandığınızda genel olarak işler daha hızlı gider, çünkü çekirdek, sektörde (veya daha iyi, iz veya silindirde tampon okuma / yazma işlemi başlatabilir); Bir şeylerin üstünden atlamak veya fazladan şeyler okumak veya kısmi arabellekleri yönetmek Kesinlikle çekirdeğin hepsiyle uğraşmasına izin verebilirsiniz, ancak fazladan bir çalışmanın gigabayt veri kopyalarsanız kopya süresini önemli ölçüde kısaltabilir.
geekosaur

@GillesYorum yanıtınızdan haberdar olmamı istiyorsanız , (genellikle) eklemeniz gerekir , bkz. Yorum yanıtları nasıl çalışır? . Geçtiğimden beri: çekirdek yine de onunla ilgilenecek. “Ekstra iş, kopya zamanını önemli ölçüde azaltabilir” iddiası kriterlerime uymuyor, ancak farklı sistemler farklı davranışlara sahip olabilir, bu yüzden lütfen zamanlamalara da katkıda bulunun!
Gilles

@Gilles: pardon, seni asıl asker ile karıştırmıştım.
geekosaur

60

Optimum blok boyutunu belirlemenin tek yolu var ve bu bir kıyaslama. Sadece hızlı bir kıyaslama yaptım. Test makinesi, çekirdek 2.6.32 ve coreutils 8.5 ile Debian GNU / Linux çalıştıran bir bilgisayardır. Her iki dosya sistemi de sabit disk bölümündeki LVM birimlerinde ext3'dür. Kaynak dosya 2GB’tır (kesin olması gereken 2040000kB). Önbelleğe alma ve arabelleğe alma etkindir. Her koşmadan önce önbelleği boşalttım sync; echo 1 >|/proc/sys/vm/drop_caches. Çalışma süreleri synctamponları yıkamak için bir son içermez ; final sync1 saniyelik siparişi alır. Çalışmalar sameaynı dosya sistemine kopyalandı; diffishal, farklı bir sabit disk üzerinde bir dosya sistemine kopyalar idi. Tutarlılık için, bildirilen süreler,timeyarar, saniyeler içinde. Her bir komutu yalnızca bir kez koştum, bu yüzden zamanlamada ne kadar değişkenlik olduğunu bilmiyorum.

             same   diff
dd bs=64M    71.1   51.3
dd bs=1M     73.9   41.8
dd bs=4k     79.6   48.5
dd bs=512    85.3   48.9
cat          76.2   41.7
cp           77.8   45.3

Sonuç: Büyük bir blok boyutu (birkaç megabayt) yardımcı olur, ancak önemli ölçüde değil (aynı sürücü kopyalar için beklediğimden çok daha az). Ve catve cpçok kötü yapmazlar. Bu sayılarla dduğraşmaya değmez. Git hadi cat!


OP'ye kendi kıyaslamasını yapmalarını öneririm, ama yine de iyi cevap!
ninjalj

5
@Nikhil >|, aşağıdakiler >dışında olduğu gibi aynıdır set -o noclobber, kullanırsanız kabuk dosyanın mevcut olduğundan şikayet edecektir >.
Gilles

2
@Masi Evet, bir diski klonlamak istersem, kullanırım cat. Neden daha iyi bir yol arıyorsun? Neyin var cat?
Gilles

5
@Masi catgirişini çıkışına kopyalar. Güvenilmez ortamlardan kopyalamak ve okunamayan kısımları atlamak veya birden çok kez yeniden denemek istiyorsanız, bu ddrescueoldukça iyi çalışan farklı bir sorun .
Gilles,

1
@sudo Kopyalanan veri miktarını alabilirsiniz lsof. Anlık hız, bir disk kopyasıyla çok ilgili değildir çünkü üniformdır, böylece geçen zaman tarafından aktarılan baytları bölebilirsiniz; daha iyi bir şey istiyorsanız, kullanabilirsiniz pv.
Gilles

8

Geekosaur ile boyutun, 4K olan blok boyutunun bir katı olması gerektiğine katılıyorum.

Blok boyutunu bulmak istiyorsanız stat -c "%o" filenamemuhtemelen en kolay seçenektir.

Ama söylediğini yap dd bs=4K, demek istediğin read(4096); write(4096); read(4096); write(4096)...

Her sistem çağrısı, bir miktar ek yük içeren bir bağlam anahtarını içerir ve G / Ç programlayıcısına bağlı olarak, serpiştirilmiş yazma işlemleriyle okunan diskin çok sayıda arama yapmasına neden olabilir. (Muhtemelen Linux zamanlayıcı ile ilgili önemli bir sorun değil, yine de düşünülmesi gereken bir şey.)

Bu nedenle bs=8K, diski bir seferde iki blok okumasına izin verin, muhtemelen disk üzerinde birbirine yakın olan ve aynı zamanda yazma işlemini yapacak başka bir yer aramadan (veya başka bir işlem için G / Ç servisini yapmadan) önce disk üzerinde okumaya izin verirsiniz.

Bu mantıkla, bs=16Kdaha da iyi, vb.

Öyleyse bilmek istediğim, performansın kötüleşmeye başladığı bir üst sınır varsa ya da sadece hafıza ile sınırlandırılmışsa.


4
Profil, spekülasyon yapma!
Gilles

1
Linux Programlama Arabirimi benimle aynı fikirde. Bkz. Bölüm 13 - Dosya G / Ç Arabelleğe Alma.
Mikel

4
İlginçtir ki, kıyaslamaları 4K'nın üzerinde çok az fayda olduğunu göstermektedir.
Mikel

4
Ayrıca, görünüşe göre öntanımlı dosya okuma penceresi 128 KB'dir, bu yüzden bu değer faydalı olabilir.
Mikel

6
Burada 24 sürücülü RAID50'ye erişebiliyorum, burada bs = 8K bana 197 MB / s alıyor, ancak bs = 1M , RAID'in teorik verimine yakın olan 2.2 GB / sn alıyor . Yani bs çok önemlidir. Ancak bs = 10M kullanıldığında sadece 1.7GB / sn elde ediyorum. Öyleyse bazı eşiklere göre daha da kötüleşiyor, ama neden olduğundan emin değil.
Joseph Garvin

5

Gilles söylediği gibi sizin için en uygun parametreyi belirleyebilir bs seçeneği dd kıyaslama yoluyla. Bununla birlikte, şu soru soruluyor: Bu parametreyi nasıl uygun bir şekilde kıyaslayabilirsiniz?

Bu soruya geçici cevabım şudur: son zamanlarda tam olarak bu sorunu çözmek için üzerinde çalışmaya başladığım yardımcı program olan dd-opt'i kullanın :)


1
Çıktının hassasiyeti nedir? % 90-95 veya>% 95? Bunu değiştirebileceğini anlamıyorum.
Léo Léopold Hertz 준영

1
@Masi, korkarım dd-optuzun zamandır üzerinde çalışmamıştım . Ancak, AGPLv3 kapsamında lisanslı ücretsiz bir yazılımdır . Bu yüzden, onu geliştirmek ve hassasiyetini / doğruluğunu değerlendirmekten çekinmeyin!
sampablokuper

0

En iyi çalışıyor gibi görünüyor sdcard okuyucu usb2.0 için optimize edilmiş bs=10M. Ben 4k, 16M'ye kadar, 8-10M'den sonra gelişme olmadı. Aktarım hızı ölçümünün büyük olasılıkla cihazda tamponları yükledikten sonra ... cihazın asıl ortama aktarılmasını beklediğinden dolayı nasıl bozulduğunu görebilirsiniz.

angstrom/sdcard# dd if=/dev/zero of=/dev/sdb bs=10M
123+0 records in
123+0 records out
1289748480 bytes (1.3 GB) copied, 21.4684 s, 60.1 MB/s
341+0 records in
341+0 records out
3575644160 bytes (3.6 GB) copied, 117.636 s, 30.4 MB/s
816+0 records in
816+0 records out
8556380160 bytes (8.6 GB) copied, 326.588 s, 26.2 MB/s
955+0 records in
955+0 records out
10013900800 bytes (10 GB) copied, 387.456 s, 25.8 MB/s
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.