Neden 'ggip aracılığıyla' dd 'bağlantısı doğrudan kopyadan çok daha hızlı?


79

Ağımdaki bir bilgisayardan 100 Mbit / s'lik bir hat üzerinden aynı ağdaki başka bir bilgisayara bir yolu yedeklemek istedim. Bunun için yaptım

dd if=/local/path of=/remote/path/in/local/network/backup.img

bu da bana sonsuza dek sürecek olan yaklaşık 50 ila 100 kB / s'lik bir ağ aktarım hızını verdi. Bu yüzden onu durdurdum ve daha küçük hale getirmek için anında çekmeye karar verdim, böylece transfer edilecek miktar daha azdı. Ben de yaptım

dd if=/local/path | gzip > /remote/path/in/local/network/backup.img.gz

Ama şimdi 1 MB / sn ağ aktarım hızı gibi bir şey alıyorum, bu yüzden 10 ila 20 arasında bir faktör var. Bunu farkettikten sonra, bunu birkaç yol ve dosya üzerinde test ettim ve her zaman aynıydı.

Neden boru mu ddyoluyla gzipaynı zamanda büyük bir faktörle transferi oranlarını artırmak yerine sadece büyük bir faktörle akışının bytelength azaltarak? Sıkıştırma sırasında daha yüksek CPU tüketimi nedeniyle transfer oranlarında küçük bir düşüş olmasını beklerdim ama şimdi iki kat artı alıyorum. Mutlu olmadığımdan değil ama merak ediyorum. ;)


1
512 bayt, Unix'in başındaki dosya depolaması için standart blok boyutuydu. Unix / Linux'ta her şey bir dosya olduğundan, hemen hemen her şey için varsayılan oldu. Çoğu yardımcı programın daha yeni sürümleri bunu arttırdı ancak dd'yi artırmadı.
DocSalvager

Basit cevap şu ki dd, 1MB / s'de ... doğrudan bekleme gzipborusuna çıkıyor. Blok büyüklüğü ile yapacak çok az şey var.
Tullo_x86 21:16

Yanıtlar:


100

ddvarsayılan olarak çok küçük bir blok boyutu kullanır - 512 bayt (!!). Yani, birçok küçük okuma ve yazma. Gibi görünüyor dd, bu nedenle verimi azaltmaktadır çok küçük bir yük ile ağ paketlerinin büyük bir sayı üretmek edildi ilk örnekte naif kullanılır.

Öte yandan, gzipdaha büyük arabelleklerle G / Ç yapmak için yeterince akıllıdır. Yani, ağ üzerinden daha az sayıda büyük yazı.

ddDaha büyük bir bs=parametre ile tekrar deneyebilir ve bu sefer daha iyi çalışıp çalışmadığını görebilir misiniz?


20
Teşekkürler, direkt kopya çalıştı olmadan gzip ve bir blok boyu bs=10M-> şey hakkında 3 ya da 4 MB / sn hızla ağ transferi. Daha yüksek blok boyutu + gzip, küçük blok boyutu + ile karşılaştırıldığında hiçbir şeyi değiştirmedi gzip.
Foo Bar

7
Hangi yüksek blok boyutlarını görmek istiyorsanız, gzip'ten sonra başka bir gg deneyin.
Joshua,

Gzip kendi çıktı tamponlamasını yapıyor mu, yoksa sadece stdio kullanıyor mu?
Barmar

@Barmar Kaynağı doğru okuyorsam, sadece write(3)tampon belleğe yazılır .

@CongMa ayrıca gzip yerine pigz kullanmayı deneyebilir, daha da hızlı çalışacaktır
GioMac

4

Buna biraz geç kaldım ama ekleyebilir miyim ...

Bir röportajda bir keresinde bit-bit verilerini ve kaba malzemelerin klonlanması için mümkün olan en hızlı yöntemin ne olacağı sorulmuştu ddya da dc3dd( DoD tarafından finanse edilen ) kullanımı ile cevap verilmişti . Görüşmeci boru doğruladı ddiçin ddbu basitçe izin verdiği, daha verimlidir eşzamanlı Okuma / Yazma veya programcı açısından stdin/stdout, dolayısıyla ultimatly iki katına yazma hızları ve Halfing transfer süresi.

dc3dd verb=on if=/media/backup.img | dc3dd of=/dev/sdb

1
Bunun doğru olduğunu sanmıyorum. Şimdi denedim. dd status=progress if=/dev/zero count=100000 bs=1M of=/dev/null22.5 dd status=progress if=/dev/zero count=100000 bs=1M | dd of=/dev/null bs=1MGB / sn idi, 2.7 GB idi. Böylece boru yavaşlatır.
falsePockets

0

Cong haklı. Uzak bir ana bilgisayara sıkıştırılmamış disk bloklarını akıyorsunuz. Ağ arayüzünüz, ağınız ve uzak sunucunuz sınırlamadır. İlk önce DD'nin performansını arttırmanız gerekir. Bs = belirlediğinizde, disk tampon belleğiyle aynı hizada olan bir parametre diskten en yüksek performansı alır. Örneğin bs = 32M deyin. Bu daha sonra gzip'in arabelleğini sata veya sas line rate boğazı üzerinden sürücüler arabelleğinden dolduracaktır. Disk, sırayla aktarıma daha meyilli olacak şekilde daha fazla eğimli olacaktır. Gzip, verileri akışta sıkıştıracak ve bulunduğunuz yere gönderecektir. NFS kullanıyorsanız, nfs iletiminin minimial olmasına izin verir. SSH kullanıyorsanız, SSH kapsülleme ve şifreleme ek yükünü kuşatın. Netcat kullanıyorsanız, baş üzerinde şifreleme olmaz.


0

Burada, atıfta bulunduğunuz "aktarım hızının" bildirildiğini farz ediyorum dd. Bu gerçekten mantıklı, çünkü ddaslında saniyede 10 kat veri aktarıyor ! Ancak, ddağ üzerinden aktarım yapılmıyor - bu iş işlem tarafından gerçekleştiriliyor gzip.

Bazı bağlamlar: gzipgiriş borusundaki verileri, iç arabelleğini temizleyebildiği kadar hızlı tüketir. gzipTamponun boşaldığı hız birkaç faktöre bağlıdır:

  • G / Ç yazma bant genişliği (bu ağ tarafından tıkanmış ve sabit kalmıştır)
  • G / Ç okuma bant genişliği (bu, modern bir makinedeki yerel bir diskten 1 MB / sn'den daha yüksek olacak, bu nedenle olası bir tıkanıklık olmaz)
  • Sıkıştırma oranı (10x hızınızın% 10 civarında olduğunu varsayacağım, bu da bir günlük dosyası ya da XML gibi bir tür yüksek oranda tekrarlanan metni sıkıştırdığınızı gösterir)

Bu durumda, ağ 100kB / s'yi idare edebilir gzipve verileri 10: 1 civarında sıkıştırabilir (ve CPU tarafından engellenmez). Bu 100kB / s üretirken, yani gzipolabilir tüketmek 1MB / sn ve tüketim oranı nedir ddgörebilirsiniz.

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.