LAN’da büyük bir dosyayı kopyalamanın hızlı yolu


24

NFS ile ilgili biraz sorun yaşıyorum ve sadece eski düz TCP kullanmayı denemek istiyorum.

Yine de nereden başlayacağımı bilemiyorum.

Donanım olarak, iki netbook ağlamak için ethernet çapraz kablosu kullanıyorum.

Onları ağ için yazarım

$ sudo ifconfig eth0 192.168.1.1 up && ping -c 10 -s 10 192.168.1.2 && sudo /etc/init.d/nfs-kernel-server start

ilk netbook'ta ve

$ sudo ifconfig eth0 192.168.1.2 up
$ ping -c 10 -s 10 192.168.1.1
$ mount /mnt/network1

ikinci

burada /mnt/network1/ etc / fstab olarak belirtilir

192.168.1.1:/home /mnt/network1 nfs noauto,user,exec,soft,nfsvers=2 0 0

/etc/exportsve ilk netbook'ta olduğu gibi (o dosyanın sözdizimini kullanarak).

Yukarıdakiler iyi çalışıyor, ancak dosyalar ve dizinler çok büyük. Dosyaların ortalama bir gigabaytlık bir parçanın ortalaması ve dizinlerin tümü 15 ile 50 gigabayt arasında.

rsyncOnları aktarmak için kullanıyorum ve (on 192.168.1.2) komutu

$ rsync -avxS /mnt/network1 ~/somedir

Büyük dosyaları daha iyi işlemek için NFS ayarlarımı ayarlamanın bir yolu olup olmadığından emin değilim, ancak rsyncdüz eski TCP üzerinden bir daemon çalıştırmanın NFS'den daha iyi çalışıp çalışmadığını görmek istiyorum rsync.

Peki, yinelemek için, TCP ile benzer bir ağ nasıl kurarım?

GÜNCELLEŞTİRME:

Bu yüzden, birkaç saat sonra kendimi cehaletimin ahlaksızlığından çekip çıkarmaya çalıştıktan sonra (ya da düşündüğüm gibi, kendimi kendi önyüklemelerimle çekip çıkarmaya çalıştım), bazı yararlı gerçekler ortaya çıkardım.

Ama her şeyden önce, şu anki en iyi cevabı kabul etmek yerine beni bu tavşan yoluna yönlendiren şey şuydu: nckesinlikle benim için çalışamayan inanılmaz bir program. Denedim netcat-openbsdve netcat-traditionalhiçbir şans olursa olsun sahip paketler.

Alıcı makineye ( 192.168.1.2) ulaştığım hata :

me@netbook:~$ nc -q 1 -l -p 32934 | tar xv
Can't grab 0.0.0.0:32934 with bind
tar: This does not look like a tar archive
tar: Exiting with failure status due to previous errors

route verir:

me@netbook:~$ route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         dir-615         0.0.0.0         UG    0      0        0 wlan0
link-local      *               255.255.0.0     U     1000   0        0 eth0
192.168.0.0     *               255.255.255.0   U     2      0        0 wlan0
192.168.1.0     *               255.255.255.0   U     0      0        0 eth0

Ancak, işte iyi haber: Statik IP adresleri ayarlamak /etc/network/interfaces, ncçalışmaya çalışırken çalışmaya başladım, bütün NFS problemlerimi düzelttim ve NFS'ye olan sevgimi yeniden alevlendirdim.

Kullandığım tam yapılandırma 192.168.1.1(elbette ilk netbook için):

auto eth0
iface eth0 inet static
address 192.168.1.2
netmask 255.255.255.0

Bu ayarlarla, iki netbook, bir açılıştan hemen sonra, açılıştan hemen sonra birbirlerine ping yapabilecekler ifup.

Her neyse, hala nchareket halindeyken görmek isterdim , bu yüzden birisinin bu süreçte hata ayıklamama yardım etmesini umuyorum.


Her iki dizin de yerelse, sadece eski düz kullanıyorsanız /bin/cpveya NFS kullanmıyorsanız daha iyi olursunuz
Karlson

1
NFS üzerinden erişilen bir dosyaya karşı rsync çalıştırmak, dosyanın tüm içeriğinin ağ üzerinden en az bir kez kopyalanması gerektiği anlamına gelir. Bir istemci / sunucu rsync'i çağırmak için bir servete ihtiyacınız yok - sadece ssh üzerinden çalıştırın. (uzak ucunu telnet / rsh üzerinden çağırmak teorik olarak mümkündür - ancak pratikte böyle bir hizmeti çalıştırmak aptalca - ssh fazla yük getirmez).
symcbean 17:12

NFSv2 oldukça eski. Hangi işletim sistemini kullanıyorsunuz?
Nils,

sırasıyla en son Debian ve en son Ubuntu. tüm bu komutları (dahil nfsvers=2) bu
dersten aldım

5
Aslında, ssh oldukça fazla miktarda ek yük ekler, kripto ucuz değildir. Normal İnternet hızları üzerinden farketmez, ancak bir LAN üzerinden (veya bu durumda doğrudan çapraz bağlanmayı) fark edebilirsiniz. Gigabit üzerinde, en hızlı makineler hariç (ya da SSH kullanıyorsa AES-NI talimatlarına sahip olanlar hariç), dikkat çekici olacağından eminim.
derobert 17:12

Yanıtlar:


43

Hızlı yolu

En hızlı birkaç değişiklik olmadığı sürece bir LAN üzerinden dosya aktarmak için bir yol rsync olası değildir. birden uygulama vardır: rsync sadece bu (not böyle bir şey yapmak, yine de verilerin en aktarılması olacak yaptığınızdan eminseniz zaman vb farkların hesaplanması, toplamlarını yapmanın adil biraz harcıyor netcat; manuel kontrol Doğru seçenekler, özellikle, sizin istemeyebilir -p):

user@dest:/target$ nc -q 1 -l -p 1234 | tar xv

user@source:/source$ tar cv . | nc -q 1 dest-ip 1234

Bu, nc1234 numaralı bağlantı noktasındaki ham TCP bağlantısı üzerinden tar göndermek için netcat ( ) işlevini kullanır. Şifreleme, özgünlük denetimi vb. Yoktur, bu yüzden çok hızlıdır. Çapraz bağlantınız gigabit'te veya daha az çalışıyorsa, ağı kurtaracaksınız; daha fazla ise, diski temizleyeceksiniz (bir depolama diziniz veya hızlı diskiniz yoksa). vKatran bayrakları o (mod ayrıntılı) gider gibi dosya adları yazdırmak olun. Büyük dosyalarda pratik olarak ek yükü yoktur. Tonlarca küçük dosya yapıyor olsaydınız, bunu kapatırdınız. Ayrıca, pvbir ilerleme göstergesi almak için boru hattına benzer bir şey ekleyebilirsiniz :

user@dest:/target$ nc -q 1 -l -p 1234 | pv -pterb -s 100G | tar xv

Elbette başka şeyler de gzip -1ekleyebilirsiniz (ve zbayrağı alıcı ucuna ekleyin; zgönderici ucundaki bayrak tabii ki GZIP ortam değişkenini ayarlamadıysanız, 1'den daha yüksek bir sıkıştırma düzeyi kullanır). Verileriniz gerçekten sıkıştırılmadığı sürece, gzip muhtemelen daha yavaş olacaktır .

Gerçekten rsync'e ihtiyacınız varsa

Değişen verilerin yalnızca küçük bir kısmını aktarıyorsanız, rsync daha hızlı olabilir. Ayrıca daha hızlı olabilen gerçekten hızlı bir ağda (çapraz bağlantı gibi) -W/ --whole-fileseçeneğine bakmak isteyebilirsiniz .

Rsync'i çalıştırmanın en kolay yolu ssh'nin üzerindedir. Çipinizin Intel'in AES'sine bağlı olarak, hangisinin en hızlı olduğunu görmek için ssh şifreleriyle denemek isteyeceksiniz, bunun AES, ChaCha20 veya Blowfish (Blowfish'in 64-bit blok boyutuyla ilgili bazı güvenlik kaygıları olmasına rağmen) olacak. -NI talimatları (ve OpenSSL'niz bunları kullanır). Yeterince yeni bir ssh'de, rsync-over-ssh şuna benzer:

user@source:~$ rsync -e 'ssh -c aes128-gcm@openssh.com' -avP /source/ user@dest-ip:/target

Daha eski ssh / sshd için, deneyin aes128-ctrveya aes128-cbcyerine aes128-gcm@openssh.com.

ChaCha20 chacha20-poly1305@openssh.com(ayrıca yeterince yeni bir ssh / sshd'ye ihtiyaç duyar) ve Blowfish blowfish-cbc olacaktır. OpenSSH, şifre olmadan çalışmaya izin vermez. Elbette yerine istediğiniz rsync seçeneklerini kullanabilirsiniz -avP. Ve elbette diğer yöne gidebilir ve rsync'i kaynak makine (hedef) yerine hedef makineden (çekerek) çalıştırabilirsiniz.

Rsync'i daha hızlı yapmak

Bir rsync daemon çalıştırırsanız, kripto ek yükünden kurtulabilirsiniz. İlk önce, /etc/rsyncd.conförneğin kaynak makinede bir daemon yapılandırma dosyası ( ) oluşturacaktınız ( detaylar için rsyncd.conf manpage sayfasını okuyun):

[big-archive]
    path = /source
    read only = yes
    uid = someuser
    gid = somegroup

Ardından, hedef makinede çalıştırırsınız:

user@dest:~$ rsync -avP source-ip::big-archive/ /target

Bunu diğer yollarla da yapabilirsiniz (ancak elbette salt okunur olarak ayarlamak zorundasınız). Kimlik doğrulama, vb. Seçenekleri vardır, ayrıntılar için kılavuz sayfasına bakın.


2
Bu mükemmel bir cevap. Diğeri de harika. Asker aralarında seçim yapamadığı için kabul edilmiş bir cevap yok mu?
sudo

netcatYaklaşım ne kadar sağlam ? Ağ paketleri bırakırsa, dosyaların rasgele parçalarını kaybedecek gibi görünüyor.
sudo

1
@sudo, TCP'yi kullanıyor ve bu da gerektiğinde yeniden iletiliyor. Bu nedenle, paket kaybına, rastgele bozulmaya (TCP ve Ethernet sağlama toplamlarının yakaladığı ölçüde) vb. Karşı iyi olması gerekir. Tabii ki, ssh üzerinden tünel açma gibi saldırılara karşı güvenli değil.
derobert

1
@sudo hepsini aynı anda yapabilirsiniz tee, sağlama toplamlarını hesaplamak için her iki taraftaki boruya bazı komutlar ekleyin .
derobert,

1
@ TheStoryCoder Parçadaki nokta, targeçerli dizin yapmasını söylüyor. Bu aslında nckomutun bir parçası değil , tar, netcat'e aktarılan bir tar arşivi oluşturmak için kullanılıyor (ve diğer tarafta, netcat, arşivi çıkarmak için tar'a aktarılıyor). Korkarım bir yorumu boruları açıklamak için yeterli değil, ama inşallah başlamanız için yeterlidir ...
derobert

17

Nasıl? Veya TL; DR

Bulduğum en hızlı yöntem bir kombinasyonudur tar, mbufferve ssh.

Örneğin:

tar zcf - bigfile.m4p | mbuffer -s 1K -m 512 | ssh otherhost "tar zxf -"

Bunu kullanarak 1 Gb bağlantılarda 950 Mb / sn'den fazla yerel ağ aktarımı gerçekleştirdim. Aktardıklarınız için uygun olacak şekilde her tar komutundaki yolları değiştirin.

Niye ya? mbuffer!

Bir ağ üzerinden büyük dosyaları aktarmada en büyük tıkanıklık, bugüne kadar, disk G / Ç'dir. Bunun cevabı mbufferya da buffer. Büyük ölçüde benzerler ancak mbufferbazı avantajları var. Varsayılan arabellek boyutu 2 MB mbufferve 1 MB'dir buffer. Daha büyük tamponlar asla boş kalmaz. Hem hedef hem de hedef dosya sistemindeki yerel blok boyutunun en düşük ortak katı olan bir blok boyutu seçmek en iyi performansı verecektir.

Tamponlama kılan şeydir bütün farkı! Elinizde varsa kullanın! Eğer yoksa, al! (m}?bufferArtı bir şey kullanmak , her şeyden daha iyidir. neredeyse tam anlamıyla yavaş ağ dosya transferleri için bir derde devadır.

Birden fazla dosya aktarıyorsanız, tarbunları tek bir veri akışında bir araya getirerek "toplayın". Tek bir dosya ise catveya G / Ç yönlendirme kullanabilirsiniz. Bir havai tarvs. cathep kullanmak bu yüzden istatistiksel olarak anlamsız olduğu tar(ya da zfs -sendnerede can) zaten bir sürece tarball . Bunların hiçbirinin size meta veri vermesi garanti catedilmez (özellikle de vermeyecektir). Meta veri istiyorsanız, bunu sizin için bir egzersiz olarak bırakacağım.

Son olarak, sshbir taşıma mekanizması için kullanmak hem güvenlidir hem de çok az yükü taşır. Yine, bir havai sshvs. ncistatistiksel önemsizdir.


4
openssl speedi7-3770'de blowfish CBC için ~ 126–146 MB / sn ve AES CBC için ~ 138–157 MB / sn verir (bu yonga AES-NI talimatlarına sahiptir). Ardından sha256 için ~ 200–300 MB / sn. Bu yüzden sadece 1 gigabit zorlayabilir. OpenSSH 6.1+ ile, körleme hızında yapabileceği AES GCM'yi kullanabilirsiniz (mesaj boyutuna bağlı olarak 370–1320 MB / sn). Bu nedenle, AES-NI ile bir çip üzerinde 6.1+ çalıştırıp AES-GCM kullanıyorsanız, OpenSSH’nin ek yükü olmadığı tek doğru olduğunu düşünüyorum.
derobert

1
Son dakikada 6.2+ yerine 6.1+ olarak değiştirip hızlı bir şekilde tekrar kontrol ettim. Tabii ki bu bir hataydı, 6.1'den beri değişiyor . Yani OpenSSH 6.2+ doğru versiyondur. Artık yorum düzenlememe izin vermiyor. 5 dakikadan eski yorumlar yanlış kalmalıdır. Tabii ki, OpenSSH 6.4'ten azsa, openssh.com/txt/gcmrekey.adv dosyasını bir yama olmadan bakın , OpenSSH'nin AES-GCM uygulamasında istismar edilebilir bir kusur vardı.
derobert

ssh(Ya da ssh üzerinden rsync) yükü çok önemlidir. Intel Atom CPU kullanan bir NAS'ım var. SSH şifrelemesi, aktarım hızını KESİNLİKLE TANKLAR. RSA için sürekli olarak <400 Mbit / sn elde ediyorum, RC4'e manuel olarak basmak bana ~ 600 Mbits / sn alıyor ve eğer bir daemon olarak cetvel kullanıyorsam, yerel bağlantı hızında (> 900 MBit / sn, bir gigabit üzerinde çalışıyor) bağ).
Sahte İsim

Pek çok durumda, taşımacılığın kritik olmadığı doğru olsa da, özellikle de son derece gelişmiş bir donanım kullanmıyorsanız, bunu dikkate almak kesinlikle önemlidir. Benim durumumda, Atom (bu bir D525, çift çekirdekli 1.8 GHz), SMB için çok hızlı bir şekilde tamamen iyi bir NAS yapıyor, ancak şifreleme onu kesinlikle öldürüyor.
Sahte İsim

2
Mbuffer'ın parametreleştirilmesi nedeniyle önemli bir hata alıyorum: 'mbuffer: fatal: toplam bellek, blok boyutundan büyük olmalı \ n Sonlandırıldı'. Düzeltmek için, 'mbuffer -s 1K -m 512M' gibi bir şey okuması gerektiğinden şüpheleniyorum, son 'M' MByte için duruyor (kaynak: man mbuffer)
Peter Lustig

1

TCP kullanmanıza bile gerek yok. AoE, Ethernet üzerinden bir ATA uygulamasıdır, katman 2'dir ve TCP / IP yığını hakkında hiçbir bilgisi olmayan daha düşük bir genel gider yaklaşımıdır. Size en az ek yük ile mümkün olan en hızlı transferi sağlayacaktır. ***

https://en.wikipedia.org/wiki/ATA_over_Ethernet

*** eğer ağ tıkanıklık ise, sıkıştırılmış veri gönderdiğinizden emin olun.


Vay bu zor çekirdek! :) herhangi kriterler var Wonder eğer ...
rogerdpack
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.