it-swarm-tr.com

Bd parametresinin dd'ye en uygun değeri belirlemenin bir yolu var mı?

Bazen "bs =" ayarını yaptığınızdan emin olun çünkü varsayılan değer çok uzun sürecek "ve kendi son derece bilimsel olmayan deneyimlerim" Geçen haftaki zaman "buna dayanıyor gibi görünüyor. Bu yüzden 'dd' (tipik olarak 1-2GB aralığında) kullandığımda bayt parametresini belirttiğinizden emin olurum. Kopyaladığım çevrimiçi kılavuzda belirtilen değeri yaklaşık yarısı kullanıyorum; geri kalanı daha yavaş medya olduğunu varsayalım 'fdisk -l' listesinden mantıklı bir sayı seçeceğim (örneğin yazdığım SD kart).

Belirli bir durum için (ortam türü, veri yolu boyutları veya başka önemli olan şeyler), "en iyi" değeri belirlemenin bir yolu var mı? Belirlenmesi kolay mı? Değilse, yolun% 90-95'ini almanın kolay bir yolu var mı? Yoksa doğru cevap bile "sadece 512'den büyük bir şey seç" mi?

Deneyi kendim denemeyi düşündüm, ancak (çok fazla işin yanı sıra) cevabı hangi faktörlerin etkilediğinden emin değilim, bu yüzden iyi bir deney tasarlamayı bilmiyorum.

74
user4443

dd eski IBM anabilgisayar kasetlerini çevirmek gerektiğinde arkadan gelir ve blok boyutu kaseti yazmak için kullanılan blokla eşleşmek zorunda kaldı veya veri blokları atlanacak ya da kesilecekti. (9 kanallı bantlar titizdi. Uzun zaman öldüklerinden memnun olun.) Bu günlerde blok boyutu, cihaz sektörü boyutunun katı olmalıdır (genellikle 4KB, ancak son zamanlarda disklerde çok daha büyük ve çok küçük bir başparmak olabilir. sürücüler daha küçük olabilir, ancak 4KB ne olursa olsun makul bir orta yoldur) ve daha büyük performans için daha iyidir. Sıklıkla sabit disklerle 1MB blok boyutları kullanıyorum. (Bugünlerde atmak için çok daha fazla belleğimiz var.)

29
geekosaur

En uygun blok boyutunu belirlemenin tek bir yolu vardır ve bu bir ölçüttür. Kısa bir değerlendirme yaptım. Test makinesi, çekirdek 2.6.32 ve coreutils 8.5 ile Debian GNU/Linux çalıştıran bir bilgisayardır. İlgili her iki dosya sistemi de bir sabit disk bölümündeki LVM birimlerinde ext3'tür. Kaynak dosya 2GB'dir (kesin olarak 2040000kB). Önbellekleme ve arabelleğe alma etkin. Her çalıştırmadan önce önbelleği sync; echo 1 >|/proc/sys/vm/drop_caches. Çalışma süreleri, arabellekleri temizlemek için bir son sync içermez; son sync 1 saniye sürer.

same çalıştırmaları aynı dosya sisteminde kopyalardı; diff çalıştırmaları farklı bir sabit diskteki dosya sistemine kopyalandı. Tutarlılık için, bildirilen süreler, time yardımcı programıyla elde edilen duvar saati süreleridir. Her komutu sadece bir kez çalıştırdım, bu yüzden zamanlamada ne kadar varyans olduğunu bilmiyorum.

             same   diff
             t (s)  t (s)
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ı disk kopyaları için beklediğimden çok daha az). Ve cat ve cp çok kötü performans göstermiyor. Bu sayılarla, uğraşmaya değer dd bulamıyorum. cat ile git!

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

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

Ama diyelim ki dd bs=4K, Yani read(4096); write(4096); read(4096); write(4096)...

Her sistem çağrısı, bazı ek yükler içeren bir bağlam anahtarı içerir ve G/Ç zamanlayıcısına bağlı olarak, serpiştirilmiş yazma işlemleriyle okumalar 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 Yaparsanız, yazma işlemi için başka bir yer aramadan (veya başka bir işlem için G/Ç'ye hizmet vermeden önce) diskin her seferinde iki blok okumasına izin verirsiniz. ).

Bu mantıkla, bs=16K Daha da iyi, vs.

Bilmek istediğim şey, performansın kötüleşmeye başladığı bir üst sınır olup olmadığı veya sadece bellekle sınırlı olması.

8
Mikel

Gilles'in dediği gibi, bs seçeneği için dd kıyaslama yaparak. Bu yine de şu soruyu akla getiriyor: bu parametreyi nasıl rahatlıkla kıyaslayabilirsiniz?

Bu soruya geçici cevabım şudur: dd-opt , son zamanlarda bu sorunu tam olarak çözmek için üzerinde çalıştığım yardımcı program :)

5
sampablokuper

Ben en iyi bs=10M Gibi görünüyor sdcard okuyucu usb2.0 için optimize. 8-10M'den sonra iyileşme olmadan 16M'ye kadar 4k denedim. Aktarım hızı ölçümünün nasıl düştüğünü görebilirsiniz ... büyük olasılıkla aygıttaki arabelleklerin yüklenmesi ve ardından aygıtın gerçek ortama aktarılmasını beklemesi nedeniyle.

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
0
wwright