มัลติเพล็กซ์แบบผกผันเพื่อเร่งความเร็วการถ่ายโอนไฟล์


19

ฉันส่งข้อมูลจำนวนมากจากเครื่องหนึ่งไปยังอีกเครื่องหนึ่ง ถ้าฉันส่งด้วย rsync (หรือวิธีอื่นใด) ก็จะอยู่ที่ 320kb / วินาที หากฉันเริ่มต้นการถ่ายโอนสองหรือสามครั้งพร้อมกันแต่ละอันจะไปที่ 320 และถ้าฉันทำสี่ครั้งพร้อมกันพวกเขาจะออกลิงก์สูงสุด

ฉันต้องสามารถส่งข้อมูลเร็วที่สุดเท่าที่จะเป็นไปได้ดังนั้นฉันต้องการเครื่องมือที่สามารถทำมัลติเพล็กซ์แบบอินเวอร์สกับการถ่ายโอนไฟล์ได้ ฉันต้องการโซลูชันทั่วไปดังนั้นการรันการแยกบนเครื่องต้นทางและการรวมเข้าด้วยกันที่ปลายอีกด้านนั้นไม่สามารถใช้งานได้จริง ฉันต้องการสิ่งนี้ในการทำงานแบบอัตโนมัติ

มีเครื่องมือที่ทำสิ่งนี้หรือฉันจำเป็นต้องทำด้วยตัวเอง? ผู้ส่งคือ CentOS ผู้รับคือ FreeBSD

คำตอบ:


29

พิสูจน์ได้ว่าเพิ่มเข้ามาทั้งหมด - ฉันขอเสนอ 'จอกศักดิ์สิทธิ์' ของคำสั่งกระจกระยะไกล ขอบคุณ davr สำหรับlftpคำแนะนำ

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

ด้านบนจะทำมิเรอร์รีโมตไดเร็กทอรีซ้ำแบ่งแต่ละไฟล์ออกเป็น 10 เธรดในขณะที่ถ่ายโอน!


lftpเยี่ยมมาก แต่ฉันไม่สามารถทำหลายส่วนเมื่อทำการโหลด ฉันใช้mirror --use-pget-n=20 -R- แต่ดูเหมือนว่า--use-pget-nจะใช้ได้เฉพาะเมื่อดาวน์โหลด
Dan

PS -P20ทำงานเพื่ออัปโหลดหลายไฟล์ แต่ฉันไม่สามารถแยกหลายไฟล์ได้
Dan

1
lftp ไม่รองรับการอัพโหลดแบบแบ่งส่วน / หลายส่วน pget -nคุณจำเป็นต้องเริ่มต้นการโอนจากด้านข้างปลายทางที่จะใช้
apraetor

จำไว้ว่าmirrorเป็นแบบสองทิศทาง pgetอาร์กิวเมนต์ใช้เฉพาะกับไฟล์ที่ถูกดาวน์โหลด
apraetor

10

มีเครื่องมือสองสามอย่างที่อาจใช้งานได้

  • LFTP - รองรับ FTP, HTTP และ SFTP รองรับการใช้การเชื่อมต่อที่หลากหลายเพื่อดาวน์โหลดไฟล์เดียว สมมติว่าคุณต้องการถ่ายโอนไฟล์จาก remoteServer ไปยัง localServer ติดตั้ง LFTP บน localServer และเรียกใช้:

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

    '-n 4' คือจำนวนการเชื่อมต่อที่จะใช้ในแบบคู่ขนาน

  • จากนั้นมีเครื่องมือ 'ตัวเร่งการดาวน์โหลด' จำนวนมาก แต่โดยทั่วไปจะรองรับ HTTP หรือ FTP เท่านั้นซึ่งคุณอาจไม่ต้องการตั้งค่าบนเซิร์ฟเวอร์ระยะไกล ตัวอย่างบางส่วนคือAxel , aria2และProZilla


8

หากคุณมีไฟล์ขนาดใหญ่น้อยและใช้lftp -e 'mirror --parallel=2 --use-pget-n=10 <remote_dir> <local_dir>' <ftp_server>: คุณ willll ดาวน์โหลด 2 ไฟล์กับแต่ละแยกแฟ้มใน 10 กลุ่มมีทั้งหมด 20 การเชื่อมต่อ FTP ไป<ftp_server>;

หากคุณมีไฟล์ขนาดเล็กจำนวนมากให้ใช้lftp -e 'mirror --parallel=100 <remote_dir> <local_dir>' <ftp_server>: คุณจะดาวน์โหลด 100 ไฟล์แบบขนานโดยไม่มีการแบ่งส่วนแล้ว การเชื่อมต่อทั้งหมด 100 รายการจะเปิดขึ้น สิ่งนี้อาจทำให้ไคลเอนต์ที่มีอยู่บนเซิร์ฟเวอร์ใช้งานได้หรือคุณอาจถูกแบนในบางเซิร์ฟเวอร์

คุณสามารถใช้--continueเพื่อทำงานต่อ :) และ-Rตัวเลือกในการอัปโหลดแทนการดาวน์โหลด (จากนั้นสลับลำดับอาร์กิวเมนต์เป็น<local_dir> <remote_dir>)


1
พิมพ์ผิดในพารามิเตอร์: --use-pget-n แทน --use-pget-m พยายามแก้ไข แต่การแก้ไขของฉันสั้น
Tony

2

คุณอาจสามารถปรับแต่งการตั้งค่า TCP ของคุณเพื่อหลีกเลี่ยงปัญหานี้ขึ้นอยู่กับสิ่งที่ทำให้ 320KB / s ต่อการ จำกัด การเชื่อมต่อ ฉันเดาว่ามันไม่ชัดเจนต่ออัตราการเชื่อมต่อที่ จำกัด โดย ISP มีผู้ร้ายสองคนที่น่าจะเป็นผู้ควบคุมปริมาณ:

  1. การเชื่อมโยงระหว่างเครื่องสองเครื่องนั้นมีความอิ่มตัวและการปล่อยแพ็คเก็ต
  2. หน้าต่าง TCP นั้นอิ่มตัวเนื่องจากผลิตภัณฑ์หน่วงเวลาแบนด์วิดท์ใหญ่เกินไป

ในกรณีแรกการเชื่อมต่อ TCP แต่ละครั้งจะแข่งขันกันในการควบคุมความแออัด TCP มาตรฐานอย่างเท่าเทียมกัน คุณสามารถปรับปรุงสิ่งนี้ได้โดยการเปลี่ยนอัลกอริธึมการควบคุมที่แออัดหรือโดยการลดจำนวนการแบ็คออฟ

ในกรณีที่สองคุณจะไม่ถูก จำกัด ด้วยการสูญเสียแพ็กเก็ต การเพิ่มการเชื่อมต่อพิเศษเป็นวิธีที่หยาบคายในการขยายขนาดหน้าต่างทั้งหมด หากคุณสามารถเพิ่มขนาดหน้าต่างด้วยตนเองปัญหาจะหายไป (อาจต้องปรับขนาดหน้าต่าง TCPหากเวลาแฝงการเชื่อมต่อสูงพอ

คุณสามารถบอกได้ว่าหน้าต่างต้องมีขนาดใหญ่เพียงใดโดยการคูณเวลา "ปิง" แบบไปกลับด้วยความเร็วรวมของการเชื่อมต่อ 1280KB / s ต้องการ 1280 (1311 สำหรับ 1024 = 1K) ไบต์ต่อมิลลิวินาทีของการเดินทางไปกลับ บัฟเฟอร์ 64K จะถูกขยายสูงสุดที่เวลาประมาณ 50 ms ซึ่งเป็นเรื่องปกติ บัฟเฟอร์ 16K จะอิ่มตัวประมาณ 320KB / s


1

โครงสร้างข้อมูลของคุณเป็นอย่างไร ไฟล์ขนาดใหญ่กี่อัน? ไดเรกทอรีขนาดใหญ่บางอย่าง? คุณสามารถวางไข่ rsync หลายอินสแตนซ์บนกิ่งเฉพาะของแผนผังไดเรกทอรีของคุณ

ทุกอย่างขึ้นอยู่กับว่าโครงสร้างข้อมูลต้นฉบับของคุณเป็นอย่างไร มีเครื่องมือยูนิกซ์จำนวนมากสำหรับแบ่งชิ้นลูกเต๋าและรวบรวมไฟล์อีกครั้ง


ข้อมูลโดยพลการ บางครั้งมันเป็นไดเรกทอรีขนาดใหญ่บางครั้งเป็นไฟล์เดียว
ZimmyDubZongyZongDubby

1

หากคุณสามารถตั้งค่าการเข้าสู่ระบบ ssh โดยไม่ใส่รหัสผ่านการดำเนินการนี้จะเปิดการเชื่อมต่อพร้อมกัน 4 รายการ (-n) พร้อมกับแต่ละไฟล์ที่จัดการการเชื่อมต่อ 4 ไฟล์ (-L):

หา -type f | xargs -L 4 -n 4 /tmp/scp.sh user @ host: path

ไฟล์ /tmp/scp.sh:

#!/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

ลองเรียงลำดับไฟล์ทั้งหมดบน inode (find / mydir -type f -print | xargs ls -i | sort -n) และโอนย้ายไฟล์ด้วยตัวอย่าง cpio บน ssh นี่จะทำให้ดิสก์ของคุณเต็มและทำให้เครือข่ายคุณเป็นคอขวด เร็วกว่าที่จะไปได้ยากเมื่อไปตามเครือข่าย


ที่จริงจังส่อเสียด :)
วอร์เรน

ฉันไม่สามารถรับประกันได้ว่าระบบไฟล์ทั้งหมดจะได้รับการเพิ่มประสิทธิภาพจากสิ่งนี้มันขึ้นอยู่กับว่ารูปแบบ inode นั้นเสร็จสิ้นไปอย่างไร
Jimmy Hedman

คอขวดคือการเชื่อมต่อ TCP แต่ละครั้ง จำกัด อยู่ที่ 320KB / วินาที ฉันต้องการส่งไฟล์ในการเชื่อมต่อ TCP แบบขนานเพื่อให้ได้รับ 320 NumConnections มากถึงขีด จำกัด ของเครือข่าย (ประมาณ 1200KB / วินาที) การเรียงลำดับโดย inode ไม่สามารถทำได้
ZimmyDubZongyZongDubby

การ จำกัด ความเร็ว TCP คืออะไร เราเตอร์ระหว่างเครื่อง?
Jimmy Hedman

ISP ของฉัน ความเป็นกลางสุทธิ ฮา!
ZimmyDubZongyZongDubby

0

ฉันรู้เครื่องมือที่สามารถถ่ายโอนไฟล์เป็นชิ้น ๆ เครื่องมือนี้เรียกว่าแพ็คเกจ / พอร์ต 'rtorrent' ที่มีอยู่ในโฮสต์ทั้งสอง) ไคลเอ็นต์ BitTorrent มักจะสำรองพื้นที่ดิสก์ก่อนการถ่ายโอนและชิ้นงานจะถูกเขียนโดยตรงจากซ็อกเก็ตไปยังดิสก์ นอกจากนี้คุณจะสามารถตรวจสอบสถานะการถ่ายโอนทั้งหมดในหน้าจอที่ดี

คุณสามารถสร้างสคริปต์ทุบตีง่ายๆเพื่อสร้างไฟล์ "* .torrent" โดยอัตโนมัติและคำสั่ง ssh ไปยังเครื่องระยะไกลเพื่อทำการดาวน์โหลด มันดูน่าเกลียดนิดหน่อย แต่ฉันไม่คิดว่าคุณจะเจอวิธีแก้ปัญหาง่ายๆโดยไม่ต้องพัฒนา :)


1
หากมีเพียงสองเครื่องที่เกี่ยวข้องกับการถ่ายโอนไฟล์ torrent จะช่วยได้อย่างไร แนวคิดของฝนตกหนักเป็นกลุ่มของ seeders ทำให้ข้อมูลพร้อมใช้งานสำหรับผู้ร้องขอ
DaveParillo

คุณถูก. แต่ใครบอกว่ามันไม่มีประโยชน์อะไรกับ seeder เดียว? ;)
kolypto

2
หากไคลเอนต์ฝนตกหนักสร้างการเชื่อมต่อ TCP หลายครั้งด้วยเพียร์เดี่ยวสิ่งนี้จะช่วยแก้ปัญหาของ OP อย่างไรก็ตามฉันไม่ทราบว่าไคลเอนต์ torrent จะสร้างการเชื่อมต่อ TCP หลาย ๆ อันกับเพื่อน ๆ คนเดียวหรือไม่
2552

0

FTP ใช้การเชื่อมต่อหลายรายการสำหรับการดาวน์โหลด หากคุณสามารถตั้งค่าช่องทางที่ปลอดภัยสำหรับ FTP ผ่าน VPN หรือFTP ผ่าน SSHคุณควรจะสามารถเชื่อมโยงเครือข่ายของคุณได้สูงสุด (โปรดทราบว่าจำเป็นต้องมีการพิจารณาเป็นพิเศษสำหรับ FTP ผ่าน SSH - ดูลิงก์)

FTPS (FTP ผ่าน SSL) อาจทำสิ่งที่คุณต้องการ

คุณสามารถใช้ไคลเอนต์ SFTP ที่รองรับการเชื่อมต่อหลายอย่าง แต่ฉันไม่แน่ใจว่า SFTP รองรับการเชื่อมต่อหลายไฟล์สำหรับไฟล์เดียว สิ่งนี้ควรทำสิ่งที่คุณต้องการเป็นส่วนใหญ่ แต่อาจไม่ให้ปริมาณงานมากที่สุดเมื่อคุณต้องถ่ายโอนไฟล์ขนาดใหญ่เพียงไฟล์เดียว


SFTP จะไม่ง่ายกว่าและปลอดภัยกว่า (ถ้าไม่มาก) หรือไม่
Mark Renouf

1
@rob: คุณได้รับ "FTP ใช้การเชื่อมต่อหลายรายการสำหรับการโอนไฟล์" จากที่ไหน ไคลเอนต์บางรายอนุญาตให้มีการสตรีมจำนวนมากสำหรับการดาวน์โหลดจาก FTP แต่ไม่มีคำสั่งผสมไคลเอนต์ FTP / เซิร์ฟเวอร์อย่างแน่นอนที่อนุญาตให้มีการอัปโหลดไปยัง FTP หลายสตรีม
chronos

@ Mark: ใช่ SFTP อาจจะง่ายกว่าและปลอดภัยเท่า ๆ กัน แต่ฉันไม่รู้ว่ามันรองรับการเชื่อมต่อที่หลากหลายสำหรับการถ่ายโอนไฟล์เดียวหรือไม่ ขอบคุณสำหรับคำแนะนำว่า; ฉันจะเพิ่มลงในรายการ
ปล้น

1
@ synchronos: ขออภัยยังไม่ชัดเจน ฉันแนะนำว่า ZimmyDubZongyZongDubby ใช้ FTP เพื่อดาวน์โหลดจากเซิร์ฟเวอร์ CentOS ไปยังไคลเอนต์ FreeBSD ฉันได้อัปเดตคำตอบเพื่อระบุว่า "ดาวน์โหลด" โดยเฉพาะแทนที่จะเป็น "การถ่ายโอนไฟล์"
ปล้น

-1

โซลูชันที่ 1: ฉันไม่แน่ใจว่าเป็นจริงในกรณีของคุณ แต่คุณสามารถสร้างเก็บถาวร spanned (ตัวอย่างเช่น tarfile แยกเป็นชิ้นหรือเก็บถาวร 7zip ทอด) จากนั้นใช้ rsync หลายอินสแตนซ์เพื่อส่งพวกเขา เครือข่ายและรวมกันอีกครั้ง / แยกพวกเขาในด้านอื่น ๆ คุณสามารถเขียนสคริปต์วัตถุประสงค์ทั่วไปที่มีอาร์กิวเมนต์เป็นไดเรกทอรีที่จะถ่ายโอนและจำนวนการเชื่อมต่อที่จะใช้ ข้อเสียที่ชัดเจนคือคุณจะต้องการพื้นที่ว่างทั้งสองด้านเท่ากันทั้งสองด้านและจะมีค่าใช้จ่ายเพิ่มเติมในการจัดเก็บ / แยกไฟล์ที่ปลายทั้งสอง

โซลูชันที่ 2: วิธีแก้ไขปัญหาที่ดีกว่าคือการเขียนสคริปต์หรือโปรแกรมที่แบ่งทรีไดเรกทอรีขนาดใหญ่เป็นทรีย่อยตามขนาดจากนั้นคัดลอกทรีย่อยเหล่านั้นแบบขนาน มันอาจลดความซับซ้อนของสิ่งต่าง ๆ หากคุณคัดลอกโครงสร้างไดเรกทอรีทั้งหมด (โดยไม่มีไฟล์) ก่อน


ทุกคนสนใจที่จะอธิบายรายละเอียดเกี่ยวกับการลงคะแนนเสียง?
ปล้น

-1

คุณสองเครื่องทำงานในสภาพแวดล้อมที่เชื่อถือได้หรือไม่? คุณอาจจะลองnetcat ทางฝั่งเซิร์ฟเวอร์:

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

และลูกค้า:

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

คุณสามารถให้การเชื่อมต่อไคลเอนต์ใช้ ssh tunnel:

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

แม้แต่พาร์ติชันทั้งหมดก็สามารถย้ายได้ด้วยวิธีนี้:

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

และลูกค้า:

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

.

บันทึก

netcat ไม่ใช่เครื่องมือการโอนย้ายที่ปลอดภัยที่สุด แต่ในสภาพแวดล้อมที่เหมาะสมนั้นสามารถทำได้อย่างรวดเร็วเพราะมีค่าใช้จ่ายต่ำ

HowtoForge มีดีหน้าตัวอย่าง


ดูเหมือนว่าคำตอบทั่วไปที่ไม่ตอบคำถามของเขา ฉันไม่สามารถดูวิธีการใด ๆ ของการแก้ปัญหาของคุณจะโอนในแบบคู่ขนาน, NC เป็นเพียงการเชื่อมต่อเดียวเท่าที่ฉันรู้
davr

คุณอาจถูกต้องอย่างไรก็ตามโดยใช้ NC คุณสามารถควบคุมพอร์ตที่เปิดได้ คุณสามารถระบุ 10,000 ถ้าคุณมีความโน้มเอียง
DaveParillo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.