Dosya aktarımını hızlandırmak için ters çoğullama


19

Bir makineden diğerine büyük miktarda veri gönderdim. Eğer rsync (veya başka bir yöntem) ile gönderirsem, sabit bir 320kb / sn gider. Bir kerede iki veya üç aktarım başlatırsam, her biri 320'de gider ve bir kerede dört tane yaparsam bağlantıyı en üst düzeye çıkarırlar.

Dosya aktarımları ile ters çoğullama yapabilen bir araca ihtiyaç duyduğum için mümkün olduğunca hızlı veri gönderebilmeliyim. Genel bir çözüme ihtiyacım var, bu yüzden kaynak makinede bölünmüş çalışma ve diğer uçta onları birleştirmek pratik değil. Otomatik bir şekilde çalışmak için buna ihtiyacım var.

Bunu yapan bir araç var mı yoksa kendiminkini yapmam gerekiyor mu? Gönderen CentOS, alıcı FreeBSD.

Yanıtlar:


29

Her şeyin bir kanıtı var - uzaktan ayna komutlarının 'kutsal kasesini' sunuyorum. Öneri için davr'a teşekkürler lftp.

lftp -c "mirror --use-pget-n=10 --verbose sftp://username:password@server.com/directory" 

Yukarıdakiler, uzak bir dizini özyinelemeli olarak yansıtır ve her dosyayı aktarırken 10 iş parçacığına böler!


lftpharika, ama UPloading sırasında çok parçalı yapmak için alamıyorum. Kullanıyorum mirror --use-pget-n=20 -R- ama --use-pget-nsadece indirirken çalışıyor gibi görünüyor .
Dan

PS, -P20birden fazla dosya yüklemek için çalışıyor, ancak her dosyayı çoğaltamıyorum.
Dan

1
lftp, bölümlere ayrılmış / çok parçalı yüklemeyi desteklemez. Kullanmak için aktarma işlemini hedef tarafından başlatmanız gerekir pget -n.
apraetor

Unutmayın, mirroriki yönlüdür; pgetbağımsız değişken yalnızca dosyalar indiriliyor için de geçerlidir.
apraetor

10

Çalışabilecek birkaç araç var.

  • LFTP - FTP, HTTP ve SFTP'yi destekler. Tek bir dosyayı indirmek için birden fazla bağlantı kullanmayı destekler. RemoteServer'dan localServer'a bir dosya aktarmak istediğinizi varsayarsak, localServer'a LFTP yükleyin ve çalıştırın:

    lftp -e 'pget -n 4 sftp://userName@remoteServer.com/some/dir/file.ext'

    '-N 4' paralel olarak kaç bağlantı kullanılacağıdır.

  • Sonra birçok 'indirme hızlandırıcısı' aracı var, ancak bunlar genellikle yalnızca uzak sunucuda kurmak istemeyebileceğiniz HTTP veya FTP'yi destekliyor. Bazı örnekler Axel , aria2 ve ProZilla'dır.


8

Kullanılacak az ve büyük dosyalarınız lftp -e 'mirror --parallel=2 --use-pget-n=10 <remote_dir> <local_dir>' <ftp_server>varsa: her biri 10 bölüme bölünmüş 2 dosya indirirsiniz ve toplam 20 ftp bağlantısı vardır <ftp_server>;

Çok sayıda küçük dosyanız varsa, şunu kullanın lftp -e 'mirror --parallel=100 <remote_dir> <local_dir>' <ftp_server>: segmentasyon olmadan paralel olarak 100 dosya indirirsiniz. Toplam 100 bağlantı açılacaktır. Bu, sunucudaki kullanılabilir istemcileri exaust edebilir veya bazı sunucularda yasaklanmanıza neden olabilir.

Sen kullanabilirsiniz --continueişi :) ve devam etmek -Ryerine indirme (daha sonra argüman sırasını anahtarlama yükleme seçeneğine <local_dir> <remote_dir>).


1
parametresindeki yazım hatası: --use-pget-m yerine --use-pget-n. Düzenlemeye çalıştım, ancak düzenlemem kısa sürdü.
Tony

2

Bağlantı sınırı başına 320 KB / sn'ye neden olana bağlı olarak, bu sorunu önlemek için TCP ayarlarınızı düzenleyebilirsiniz. Benim tahminim, ISP tarafından açık bir bağlantı başına hız sınırlaması olmaması . Kısma için iki olası suçlu vardır:

  1. İki makine arasındaki bazı bağlantılar doymuş ve düşürülen paketlerdir.
  2. Bant genişliği gecikme ürünü çok büyük olduğu için TCP pencereleri doymuş durumda .

İlk durumda, her TCP bağlantısı standart TCP tıkanıklığı denetiminde etkin bir şekilde eşit şekilde rekabet eder. Sıkışık kontrol algoritmalarını değiştirerek veya geri çekilme miktarını azaltarak da bunu iyileştirebilirsiniz.

İkinci durumda paket kaybı ile sınırlı değilsiniz. Ek bağlantı eklemek, toplam pencere boyutunu genişletmenin kaba bir yoludur. Pencere boyutlarını manuel olarak artırabiliyorsanız sorun ortadan kalkar. ( Bağlantı gecikmesi yeterince yüksekse, TCP penceresi ölçeklendirmesi gerekebilir .)

Gidiş dönüş "ping" süresini bağlantının toplam hızıyla çarparak, pencerenin ne kadar büyük olması gerektiğini yaklaşık olarak anlayabilirsiniz. 1280KB / s, milisaniye gidiş dönüş başına 1280 (1024 = 1K için 1311) bayta ihtiyaç duyar. Bir 64K tamponu, oldukça tipik olan yaklaşık 50 ms gecikme süresinde maksimize edilecektir. 16K'lık bir tampon daha sonra 320KB / s civarında doyurulur.


1

Verileriniz nasıl yapılandırılmıştır? Birkaç büyük dosya mı? Birkaç büyük dizin mi? Dizin ağacınızın belirli dallarında birden fazla rsync örneği ortaya çıkarabilirsiniz.

Her şey kaynak verilerinizin nasıl yapılandırıldığına bağlıdır. Dosyaları dilimlemek, zarlamak ve yeniden birleştirmek için tonlarca unix aracı vardır.


Keyfi veriler. Bazen büyük bir dizin, bazen tek bir dosya.
ZimmyDubZongyZongDubby

1

Parolasız ssh oturum açma ayarlayabilirseniz, bu her bağlantı 4 dosya (-L) işleme 4 eşzamanlı scp bağlantıları (-n) açar:

bulmak. tipi f | xargs -L 4 -n 4 /tmp/scp.sh kullanıcı @ ana bilgisayar: yol

/Tmp/scp.sh Dosyası:

#!/bin/bash

#Display the help page
function showHelp()
{
    echo "Usage: $0 <destination> <file1 [file2 ... ]>"
}

#No arguments?
if [ -z "$1" ] || [ -z "$2" ]; then
    showHelp
    exit 1
fi

#Display help?
if [ "$1" = "--help" ] || [ "$1" = "-h" ]; then
    showHelp
    exit 0
fi

#Programs and options
SCP='scp'
SCP_OPTS='-B'
DESTINATION="$1";shift;

#Check other parameters
if [ -z "$DESTINATION" ]; then
    showHelp
    exit 1
fi

echo "$@"

#Run scp in the background with the remaining parameters.
$SCP $SCP_OPTS $@ $DESTINATION &

0

İnode üzerindeki tüm dosyaları sıralamayı deneyin (find / mydir -type f -print | xargs ls -i | sort -n) ve ssh üzerinden cpio ile aktarın. Bu, diskinizi en üst düzeye çıkarır ve ağınızı darboğaz haline getirir. Bundan daha hızlı ağ üzerinden gitmek zor.


Bu sinsi sinsi :)
warren

Tüm dosya sistemlerinin bundan bir destek alacağını garanti edemiyorum, inode düzeninin nasıl yapıldığına bağlı.
Jimmy Hedman

Darboğaz, her TCP bağlantısının 320KB / sn ile sınırlı olmasıdır. Ağın sınırına kadar 320 * NumConnections (yaklaşık 1200KB / sn) elde etmek için dosyaları paralel TCP bağlantılarında göndermek istiyorum. İnode göre sıralama bunu başaramaz.
09:20

TCP hızını sınırlayan nedir? Makineler arasında bir yönlendirici mi?
Jimmy Hedman

İSS'm. Net tarafsızlık? HA!
ZimmyDubZongyZongDubby

0

Parçalar halinde dosya aktarabilen bir araç biliyorum. Araç, her iki ana bilgisayarda bulunan 'rtorrent' paketi / bağlantı noktası olarak adlandırılır;) BitTorrent istemcileri genellikle aktarımdan önce disk alanı ayırır ve parçalar doğrudan soketlerden diske yazılır. Ek olarak, güzel bir ncurses ekranında TÜM transferlerin durumlarını inceleyebilirsiniz.

"* .Torrent" dosya oluşturmayı otomatikleştirmek için basit bash komut dosyaları oluşturabilir ve uzak makineye bir komut indirerek ssh komutunu oluşturabilirsiniz. Bu biraz çirkin görünüyor, ama gelişmeden basit bir çözüm bulacağınızı sanmıyorum :)


1
Dosya aktarımında yalnızca iki makine varsa, torrent nasıl yardımcı olabilir? Bir torrent fikri, verileri bir müşteri talep edenin kullanımına sunan ekmeğin sürüsüdür.
DaveParillo

Haklısın. Ama kim tek bir ekme makinesi için yararlı olmadığını söyledi? ;)
kolypto

2
Bir torrent istemcisi tek bir eş ile birden çok TCP bağlantısı oluşturursa, bu OP'nin sorununu çözer. Ancak, torrent istemcilerinin tek eşlerle gerçekten birden fazla TCP bağlantısı oluşturup oluşturmadığını bilmiyorum.
chronos

0

FTP indirmeler için birden fazla bağlantı kullanır. Bir VPN üzerinden FTP veya SSH üzerinden FTP için güvenli bir kanal kurabilirseniz, ağ bağlantınızı maksimize edebilmeniz gerekir. (SSH üzerinden FTP için özel dikkat edilmesi gerektiğini unutmayın - bağlantıya bakın.)

FTPS (SSL üzerinden FTP) de ihtiyacınız olanı yapabilir.

Birden çok bağlantıyı destekleyen bir SFTP istemcisi de kullanabilirsiniz, ancak SFTP'nin tek bir dosya için birden çok bağlantıyı destekleyip desteklemediğinden emin değilim. Bu, çoğu zaman ihtiyacınız olanı yapmalıdır, ancak yalnızca büyük bir dosyayı aktarmanız gerektiğinde maksimum verimi vermeyebilir.


SFTP çok daha kolay ve (eğer değilse) güvenli olmaz mı?
Mark Renouf

1
@rob: "FTP dosya aktarımı için birden çok bağlantı kullanıyor" ifadesini nereden aldınız? Bazı istemciler FTP'den indirme için birden fazla akışa izin verir , ancak kesinlikle FTP'ye yüklemek için birden fazla akışa izin veren hiçbir FTP istemci / sunucu birleşimi yoktur .
chronos

@Mark: Evet, SFTP muhtemelen daha kolay ve eşit derecede güvenli olurdu, ancak tek bir dosyayı aktarmak için birden fazla bağlantıyı destekleyip desteklemediğini bilmiyorum. Yine de öneri için teşekkürler; Listeye ekleyeceğim.
rob

1
@chronos: Maalesef net değildi; ZimmyDubZongyZongDubby'nin CentOS sunucusundan FreeBSD istemcisine indirmek için FTP kullanmasını öneriyordum. Cevabı, "dosya aktarımları" yerine özellikle "indirilenler" diyecek şekilde güncelledim.
soymak

-1

Çözüm 1: Bunun sizin durumunuzda pratik olup olmadığından emin değilim, ancak yayılmış bir arşiv (örneğin, parçalara bölünmüş bir tarfile veya yayılmış bir 7zip arşivi) oluşturabilir, ardından bunları göndermek için birden fazla rsync örneği kullanabilirsiniz. ağı diğer tarafa yeniden monte edin / çıkarın. Bağımsız değişkenleri aktarılacak dizin ve kullanılacak bağlantı sayısı olan genel amaçlı bir komut dosyası yazabilirsiniz. Açık olan dezavantajı, her iki tarafta iki kat daha fazla boş alana ihtiyacınız olacak ve her iki uçtaki dosyaları arşivleme / çıkarma ek yüküne sahip olacaksınız.

Çözüm 2: Daha büyük bir çözüm, büyük dizin ağacını boyuta göre alt ağaçlara bölen bir komut dosyası veya program yazmak ve daha sonra bu alt ağaçlara paralel olarak kopyalamak olacaktır. Öncelikle tüm dizin yapısını (dosyalar olmadan) kopyalarsanız işleri basitleştirebilirsiniz.


Aşağı oyu üzerinde özen göstermek isteyen var mı?
soymak

-1

Güvenilir bir ortamda çalışan iki makine misiniz? Netcat'i deneyebilirsin . Sunucu tarafında:

tar -czf - ./yourdir | nc -l 9999

ve istemcide:

nc your.server.net 9999 > yourdir.tar.gz

İstemci bağlantısının bir ssh tüneli kullanmasını sağlayabilirsiniz:

ssh -f -L 23333:127.0.0.1:9999 foo@your.server.net sleep 10; \
    nc 127.0.0.1 23333 > yourdir.tar.gz

Tüm bir bölüm bile bu şekilde taşınabilir:

dd if=/dev/sda1 | gzip -9 | nc -l 9999

ve istemcide:

nc your.server.net 9999 > mysda1.img.gz

.

Not

Netcat orada en güvenli aktarım aracı değil, ancak doğru ortamda hızlı olabilir, çünkü bu kadar düşük bir ek yüke sahiptir.

HowtoForge'un iyi bir örnek sayfası var .


Bu, sorusuna cevap vermeyen genel bir cevap gibi görünüyor. Çözümlerinizden herhangi birinin paralel olarak nasıl aktarılacağını göremiyorum, nc bildiğim kadarıyla tek bir bağlantı
davr

Haklı olabilirsiniz, ancak nc kullanarak açılan portlar üzerinde kontrole sahipsiniz. Eğer bu kadar eğimli iseniz 10.000 belirleyebilirsiniz.
DaveParillo
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.