Ghép kênh ngược để tăng tốc độ truyền tệp


19

Tôi đã gửi một lượng lớn dữ liệu từ máy này sang máy khác. Nếu tôi gửi bằng rsync (hoặc bất kỳ phương thức nào khác), nó sẽ đạt tốc độ ổn định 320kb / giây. Nếu tôi thực hiện hai hoặc ba lần chuyển tiền cùng một lúc, mỗi lần chuyển sẽ ở mức 320 và nếu tôi thực hiện bốn lần cùng một lúc, họ sẽ tối đa hóa liên kết.

Tôi cần có khả năng gửi dữ liệu nhanh nhất có thể, vì vậy tôi cần một công cụ có thể thực hiện ghép kênh ngược với chuyển tập tin. Tôi cần một giải pháp chung, vì vậy việc chạy tách trên máy nguồn và kết hợp chúng ở đầu kia là không thực tế. Tôi cần điều này để làm việc một cách tự động.

Có một công cụ làm điều này, hoặc tôi cần phải làm cho riêng mình? Người gửi là CentOS, người nhận là FreeBSD.

Câu trả lời:


29

Bằng chứng tất cả cộng lại - Tôi trình bày 'chén thánh' của các lệnh gương từ xa. Cảm ơn davr cho lftplời đề nghị.

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

Ở trên sẽ phản chiếu đệ quy một thư mục từ xa, chia mỗi tệp thành 10 luồng khi nó chuyển!


lftplà tuyệt vời, nhưng tôi không thể làm cho nó để thực hiện nhiều phần khi tải lên. Tôi đang sử dụng mirror --use-pget-n=20 -R- nhưng dường như --use-pget-nchỉ hoạt động khi tải xuống.
Dan

PS, -P20hoạt động để tải lên nhiều tệp, nhưng tôi không thể nhân nhiều tệp.
Dan

1
lftp không hỗ trợ tải lên phân đoạn / nhiều phần. Bạn cần bắt đầu chuyển từ phía đích để sử dụng pget -n.
apraetor

Hãy nhớ, mirrorlà hai chiều; các pgettham số chỉ áp dụng cho các tập tin được tải xuống.
apraetor

10

Có một vài công cụ có thể hoạt động.

  • LFTP - hỗ trợ FTP, HTTP và SFTP. Hỗ trợ sử dụng nhiều kết nối để tải xuống một tệp. Giả sử bạn muốn chuyển một tập tin từ remoteServer sang localServer, cài đặt LFTP trên localServer và chạy:

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

    '-N 4' là có bao nhiêu kết nối sử dụng song song.

  • Sau đó, có nhiều công cụ 'tăng tốc tải xuống', nhưng chúng thường chỉ hỗ trợ HTTP hoặc FTP, mà bạn có thể không muốn phải thiết lập trên máy chủ từ xa. Một số ví dụ là Axel , aria2ProZilla


8

Nếu bạn có ít và sử dụng tệp lớn lftp -e 'mirror --parallel=2 --use-pget-n=10 <remote_dir> <local_dir>' <ftp_server>: bạn sẽ tải xuống 2 tệp với mỗi tệp được chia thành 10 phân đoạn với tổng số kết nối 20 ftp đến <ftp_server>;

Nếu bạn có số lượng lớn tệp nhỏ, thì hãy sử dụng lftp -e 'mirror --parallel=100 <remote_dir> <local_dir>' <ftp_server>: bạn sẽ tải xuống song song 100 tệp mà không cần phân đoạn. Tổng cộng có 100 kết nối sẽ được mở. Điều này có thể làm mất các máy khách khả dụng trên máy chủ hoặc có thể khiến bạn bị cấm trên một số máy chủ.

Bạn có thể sử dụng --continueđể tiếp tục công việc :) và -Rtùy chọn tải lên thay vì tải xuống (sau đó chuyển thứ tự đối số sang <local_dir> <remote_dir>).


1
lỗi đánh máy trong tham số: --use-pget-n thay vì --use-pget-m. Đã cố gắng để chỉnh sửa, nhưng chỉnh sửa của tôi là ngắn.
Tony

2

Bạn có thể điều chỉnh cài đặt TCP của mình để tránh sự cố này, tùy thuộc vào nguyên nhân gây ra giới hạn 320KB / giây cho mỗi giới hạn kết nối. Tôi đoán là nó không rõ ràng giới hạn tốc độ trên mỗi kết nối của ISP. Có hai thủ phạm có khả năng gây ra sự tiết lưu:

  1. Một số liên kết giữa hai máy được bão hòa và thả các gói.
  2. Các cửa sổ TCP đã bão hòa vì sản phẩm trễ băng thông quá lớn.

Trong trường hợp đầu tiên, mỗi kết nối TCP sẽ cạnh tranh bình đẳng trong điều khiển tắc nghẽn TCP tiêu chuẩn. Bạn cũng có thể cải thiện điều này bằng cách thay đổi các thuật toán điều khiển tắc nghẽn hoặc bằng cách giảm lượng backoff.

Trong trường hợp thứ hai, bạn không bị giới hạn bởi mất gói. Thêm kết nối bổ sung là một cách thô để mở rộng tổng kích thước cửa sổ. Nếu bạn có thể tự tăng kích thước cửa sổ, vấn đề sẽ biến mất. (Điều này có thể yêu cầu mở rộng cửa sổ TCP nếu độ trễ kết nối đủ cao.)

Bạn có thể cho biết cửa sổ cần lớn đến mức nào bằng cách nhân thời gian "ping" của chuyến đi khứ hồi với tổng tốc độ kết nối. 1280KB / s cần 1280 (1311 cho 1024 = 1K) byte mỗi mili giây của chuyến đi khứ hồi. Một bộ đệm 64K sẽ được tối đa hóa ở độ trễ khoảng 50 ms, khá điển hình. Một bộ đệm 16K sau đó sẽ bão hòa khoảng 320KB / s.


1

Dữ liệu của bạn có cấu trúc như thế nào? Một vài tập tin lớn? Một vài thư mục lớn? Bạn có thể sinh ra nhiều phiên bản rsync trên các nhánh cụ thể của cây thư mục của bạn.

Tất cả phụ thuộc vào cách dữ liệu nguồn của bạn được cấu trúc. Có hàng tấn công cụ unix để cắt, xúc xắc và tập hợp lại các tập tin.


Dữ liệu tùy ý. Đôi khi nó là một thư mục lớn, đôi khi là một tập tin duy nhất.
ZimmyDubZongyZongDubby

1

Nếu bạn có thể thiết lập đăng nhập ssh không mật khẩu, thì điều này sẽ mở 4 kết nối scp đồng thời (-n) với mỗi kết nối xử lý 4 tệp (-L):

tìm thấy . -type f | xargs -L 4 -n 4 /tmp/scp.sh user @ host: path

Tệp /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

Hãy thử sắp xếp tất cả các tệp trên inode (find / mydir -type f -print | xargs ls -i | sort -n) và chuyển chúng với ví dụ cpio qua ssh. Điều này sẽ tối đa hóa đĩa của bạn và làm cho mạng bạn bị nghẽn cổ chai. Nhanh hơn thế, thật khó để đi qua mạng.


đó là hết sức lén lút :)
warren

Tôi không thể đảm bảo rằng tất cả các hệ thống tập tin đều được tăng cường từ điều này, tùy thuộc vào cách bố trí inode được thực hiện.
Jimmy Hedman

Nút thắt là mỗi kết nối TCP bị giới hạn ở 320KB / giây. Tôi muốn gửi các tệp trong các kết nối TCP song song để tôi nhận được 320 * NumConnections đến giới hạn của mạng (khoảng 1200KB / giây). Sắp xếp theo inode không đạt được điều này.
ZimmyDubZongyZongDubby

Điều gì đang giới hạn tốc độ TCP? Một bộ định tuyến giữa các máy?
Jimmy Hedman

ISP của tôi. Tính trung lập ròng? HẠ!
ZimmyDubZongyZongDubby

0

Tôi biết một công cụ có thể chuyển tập tin trong khối. Công cụ này được gọi là gói / cổng 'rtorrent' có sẵn trên cả hai máy chủ;) Các máy khách BitTorrent thường dành không gian đĩa trước khi chuyển và các đoạn được ghi trực tiếp từ ổ cắm vào đĩa. Ngoài ra, bạn sẽ có thể xem lại TẤT CẢ các trạng thái chuyển khoản trong một màn hình hình ảnh đẹp.

Bạn có thể tạo các tập lệnh bash đơn giản để tự động tạo tập tin "* .torrent" và ssh một lệnh cho máy từ xa để nó tải xuống. Điều này có vẻ hơi xấu, nhưng tôi không nghĩ rằng bạn sẽ tìm thấy bất kỳ giải pháp đơn giản nào mà không phát triển :)


1
Nếu chỉ có hai máy tham gia vào việc chuyển tập tin, làm thế nào một torrent có thể giúp đỡ? Ý tưởng về một torrent là một nhóm các seeder làm cho dữ liệu có sẵn cho một người yêu cầu khách hàng.
DaveParillo

Bạn đúng. Nhưng ai nói nó không hữu ích với một seeder? ;)
kolypto

2
Nếu một máy khách torrent tạo nhiều kết nối TCP với một mạng ngang hàng, thì điều này sẽ giải quyết vấn đề của OP. Tuy nhiên, tôi không biết liệu các máy khách torrent có thực sự tạo ra nhiều kết nối TCP với các máy ngang hàng hay không.
chronos

0

FTP sử dụng nhiều kết nối để tải xuống. Nếu bạn có thể thiết lập kênh bảo mật cho FTP qua VPN hoặc FTP qua SSH , bạn sẽ có thể tối đa hóa liên kết mạng của mình. (Lưu ý rằng những cân nhắc đặc biệt là bắt buộc đối với FTP qua SSH - xem liên kết.)

FTPS (FTP qua SSL) cũng có thể làm những gì bạn cần.

Bạn cũng có thể sử dụng ứng dụng khách SFTP hỗ trợ nhiều kết nối, nhưng tôi không chắc liệu SFTP có hỗ trợ nhiều kết nối cho một tệp không. Điều này sẽ làm những gì bạn cần hầu hết thời gian, nhưng có thể không cung cấp cho bạn thông lượng tối đa khi bạn chỉ phải chuyển một tệp lớn.


SFTP sẽ không dễ dàng hơn nhiều và cũng như (nếu không nhiều hơn) an toàn?
Đánh dấu Renouf

1
@rob: bạn lấy từ đâu "FTP sử dụng nhiều kết nối để truyền tệp" từ đâu? Một số máy khách cho phép tải xuống nhiều luồng từ FTP, nhưng chắc chắn không có kết hợp máy khách / máy chủ FTP nào cho phép nhiều luồng tải lên FTP.
chronos

@Mark: Có, SFTP có thể sẽ dễ dàng hơn và an toàn như nhau, nhưng tôi không biết liệu nó có hỗ trợ nhiều kết nối để truyền một tệp không. Nhờ đề nghị mặc dù; Tôi sẽ thêm nó vào danh sách.
cướp

1
@ syncos: Xin lỗi, nó không rõ ràng; Tôi đã gợi ý rằng ZimmyDubZongyZongDubby sử dụng FTP để tải xuống từ máy chủ CentOS về máy khách FreeBSD. Tôi đã cập nhật câu trả lời để nói cụ thể là "tải xuống" thay vì "chuyển tập tin".
cướp

-1

Giải pháp 1: Tôi không chắc liệu điều này có thực tế trong trường hợp của bạn không, nhưng bạn có thể tạo một kho lưu trữ được kéo dài (ví dụ: một tarfile được chia thành các phần hoặc một kho lưu trữ 7zip được kéo dài), sau đó sử dụng nhiều phiên bản rsync để gửi chúng mạng và tập hợp lại / giải nén chúng ở phía bên kia. Bạn có thể viết một tập lệnh có mục đích chung có các đối số là thư mục sẽ được chuyển và số lượng kết nối sẽ sử dụng. Nhược điểm rõ ràng là bạn sẽ cần gấp đôi dung lượng trống ở cả hai bên và sẽ có thêm chi phí lưu trữ / giải nén các tệp ở cả hai đầu.

Giải pháp 2: một giải pháp tốt hơn sẽ là viết một tập lệnh hoặc chương trình chia cây thư mục lớn thành các cây con dựa trên kích thước, sau đó sao chép các cây con đó song song. Nó có thể đơn giản hóa mọi thứ nếu bạn sao chép toàn bộ cấu trúc thư mục (không có tệp) trước.


Bất cứ ai quan tâm để xây dựng trên downvote?
cướp

-1

Bạn có hai máy chạy trong một môi trường đáng tin cậy? Bạn có thể thử netcat . Về phía máy chủ:

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

và trên máy khách:

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

Bạn có thể có kết nối máy khách sử dụng đường hầm ssh:

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

Thậm chí toàn bộ phân vùng có thể được di chuyển theo cách này:

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

và trên máy khách:

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

.

Ghi chú

netcat không phải là công cụ chuyển tiền an toàn nhất hiện có, nhưng trong môi trường phù hợp có thể nhanh chóng vì nó có chi phí thấp như vậy.

HowtoForge có một trang ví dụ tốt .


Đây có vẻ như là một câu trả lời chung chung không trả lời câu hỏi của anh ấy. Tôi không thể thấy bất kỳ giải pháp nào của bạn sẽ chuyển song song, nc chỉ là một kết nối duy nhất theo như tôi biết
davr

Bạn có thể đúng, tuy nhiên, bằng cách sử dụng nc, bạn có quyền kiểm soát các cổng được mở. Bạn có thể chỉ định 10.000 nếu bạn rất nghiêng.
DaveParillo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.