Швидкий спосіб копіювання великого файлу в локальній мережі


24

У мене є проблеми з NFS, і я хотів би спробувати використовувати просто старий TCP.

Я навіть не маю ідеї з чого почати.

Апаратно-розумний, я використовую перехресний кабель Ethernet для з'єднання двох нетбуків.

Для їх мережевого введення я набираю

$ 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

на перший нетбук і

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

на другій

де /mnt/network1вказано в / etc / fstab як

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

а також у /etc/exports(використовуючи синтаксис цього файлу) на першій нетбуці.

Вище написане працює добре, але файлів і каталогів величезна кількість. Файли в середньому становлять близько половини гігабайт, а каталоги - від 15 до 50 гігабайт.

Я використовую rsyncдля передачі їх, і команда (on 192.168.1.2) є

$ rsync -avxS /mnt/network1 ~/somedir

Я не впевнений, чи є спосіб налаштувати мої налаштування NFS, щоб краще обробляти величезні файли, але я хотів би побачити, чи працює rsyncдемон над простим старим TCP краще, ніж rsyncнад NFS.

Отже, щоб ще раз зазначити, як мені створити подібну мережу з TCP?

ОНОВЛЕННЯ:

Отже, після декількох годин спроб витягнути себе з багряного мого власного невігластва (або, як мені подобається думати про це, підтягувати себе власними завантажувальними програмами), я придумав кілька корисних фактів.

Але, по-перше, те, що призвело мене до цього кролячого сліду, а не просто прийняти найкращу відповідь, це: ncце неймовірно крута програма, яка рішуче не спрацьовує для мене. Я спробував netcat-openbsdі netcat-traditionalпакунки, не маючи везіння.

Помилка, яку я отримую на приймальній машині ( 192.168.1.2), є:

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 дає:

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

Але ось хороша новина: встановивши статичні IP-адреси /etc/network/interfaces, які я почав робити, намагаючись приступити до ncроботи, виправив усі мої проблеми з NFS і знову відзначив свою любов до NFS.

Точна конфігурація, яку я використовував (звичайно, 192.168.1.1для першого нетбука, звичайно):

auto eth0
iface eth0 inet static
address 192.168.1.2
netmask 255.255.255.0

За допомогою цих налаштувань обидва нетбуки зможуть пінгувати один одного безпосередньо після завантаження, навіть не маючи ifup.

У будь-якому разі, я все ще хотів би бачити ncв дії, тому сподіваюся, що хтось допоможе мені налагодити цей процес.


Якщо обидва каталоги локальні, вам краще просто скористатися звичайним старим /bin/cpабо взагалі не використовувати NFS
Karlson

1
Запуск rsync для файлу, доступ до якого здійснюється через NFS, означає, що весь вміст файлу потрібно копіювати по мережі хоча б один раз. Вам не потрібен демон, щоб викликати клієнт / сервер rsync - просто запустіть його над ssh. (теоретично можна викликати віддалений кінець через telnet / rsh - але досить нерозумно запустити таку послугу на практиці - ssh не додає великих витрат).
symcbean

NFSv2 досить старий. Яку ОС ви використовуєте?
Нілс

найновіший Debian і останній Ubuntu відповідно. Я отримав усі ці команди (включаючи nfsvers=2) з цього підручника ( michaelminn.com/linux/home_network )
ixtmixilix

5
насправді, ssh додає досить велику кількість накладних витрат, криптовалюта - не з дешевих. При нормальній швидкості Інтернету це не має значення, але ви можете помітити через локальну мережу (або пряме перехресне з'єднання в даному випадку). За гігабіту, за винятком самих швидких машин (або тих, що мають інструкції AES-NI, якщо SSH використовує ці), я впевнений, що це буде помітно.
дероберт

Відповіді:


43

Швидкий шлях

Швидкий спосіб передачі файлів через локальну мережу, швидше за все , НЕ Rsync, якщо не кілька змін. rsync витрачає досить багато часу, роблячи контрольні суми, обчислюючи різниці і т. д. Якщо ви знаєте, що ви все одно будете передавати більшість даних, просто зробіть щось подібне (зверніть увагу: є кілька реалізацій netcat; перевірте посібник на правильні варіанти. Зокрема, ваш може не захотіти -p):

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

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

Він використовує netcat ( nc) для надсилання смоли через необроблене TCP-з'єднання на порт 1234. Немає шифрування, перевірки автентичності тощо, тому це дуже швидко. Якщо ваш перехресний зв’язок працює на гігабіті або менше, ви прив’яжете мережу; якщо його більше, ви прив’яжете диск (якщо ви не маєте масив пам’яті чи швидкий диск). В vпрапори дьогтю зробити його надрукувати імена файлів , як вона йде (багатослівний режим). З великими файлами це практично немає накладних витрат. Якби ви робили багато невеликих файлів, ви вимкнете це. Крім того, ви можете вставити щось подібне pvдо конвеєра, щоб отримати індикатор прогресу:

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

Звичайно, ви також можете вставити інші речі, наприклад gzip -1(і додати zпрапор на кінці прийому - zпрапор на кінці відправлення використовує більш високий рівень стиснення, ніж 1, якщо, звичайно, не встановити змінну середовища GZIP). Хоча gzip, ймовірно, насправді буде повільнішим, якщо ваші дані дійсно не стискаються.

Якщо вам дійсно потрібен rsync

Якщо ви дійсно передаєте лише невелику частину даних, що змінилися, rsync може бути швидшим. Ви також можете подивитися -W/ --whole-fileпараметр, як із дійсно швидкою мережею (наприклад, перехресне з'єднання), яка може бути швидшою.

Найпростіший спосіб запустити rsync - це над ssh. Ви хочете поекспериментувати з шифрами ssh, щоб побачити, який найшвидший, це буде або AES, ChaCha20, або Blowfish (хоча існують певні проблеми із безпекою щодо 64-розрядного розміру блоку Blowfish), залежно від того, чи має ваш чіп AES Intel Інструкції -NI (і ваш OpenSSL використовує їх). У новому досить ssh, rsync-over-ssh виглядає так:

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

Для старих ssh / sshd спробуйте aes128-ctrабо aes128-cbcзамість aes128-gcm@openssh.com.

ChaCha20 був би chacha20-poly1305@openssh.com(також потрібен новий достатній ssh ​​/ sshd), а Blowfish - Blowfish-cbc. OpenSSH не дозволяє працювати без шифру. Ви, звичайно, можете використовувати будь-які варіанти rsync, які вам подобаються замість -avP. І звичайно, ви можете піти в інший бік і запустити rsync з цільової машини (тягнути) замість вихідної машини (push).

Робити rsync швидше

Якщо ви запустите демон rsync, ви можете позбутися криптовалюти. Спочатку слід створити файл конфігурації демона ( /etc/rsyncd.conf), наприклад, на вихідній машині (детальніше прочитайте сторінку rsyncd.conf):

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

Потім на машині призначення ви запустите:

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

Ви можете зробити це і навпаки (але, звичайно, вам потрібно буде встановити лише читання на "ні"). Існують варіанти аутентифікації тощо. Перевірте детальну сторінку сторінки.


2
Це відмінна відповідь. Інший теж великий. Чи немає прийнятої відповіді лише тому, що запитуючий не може вибрати між ними?
судо

Наскільки надійний netcatпідхід? Якщо мережа скидає пакети, здається, вона втратить випадкові частини файлів.
судо

1
@sudo він використовує TCP, який повторно передаватиметься за потреби. Отже, це повинно бути добре проти втрати пакетів, випадкової пошкодження (наскільки це контролюють контрольні суми TCP та Ethernet) тощо.
дероберт

1
@sudo ви можете зробити це все одночасно, вставити кілька teeкоманд у трубу з обох сторін для обчислення контрольних сум.
дероберт

1
@TheStoryCoder Точка в tarчастині говорить їй зробити поточну каталог. Це насправді не є частиною ncкоманди, tar використовується для створення архіву tar, який передається в netcat (а з іншого боку, netcat вводиться для tar для отримання архіву). Боюся, що коментаря насправді недостатньо для пояснення труб, але, сподіваємось, цього достатньо, щоб почати ...
derobert

17

Як? Або TL; DR

Найшвидший метод , який я знайшов це поєднання tar, mbufferі ssh.

Наприклад:

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

Використовуючи це, я домігся постійних передач локальної мережі понад 950 Мб / с на 1Gb посиланнях. Замініть шляхи в кожній команді tar, щоб вони відповідали тому, що ви передаєте.

Чому? mbuffer!

Найбільшим вузьким місцем у передачі великих файлів по мережі є, безумовно, дисковий введення / вивід. Відповідь на це - mbufferабо buffer. Вони багато в чому схожі, але mbufferмають деякі переваги. Типовий розмір буфера - 2 Мб для mbufferта 1 МБ для buffer. Більші буфери швидше ніколи не будуть порожніми. Вибір розміру блоку, який є найменшим загальним кратним нативного розміру блоку як у цільовій, так і в цільовій файловій системі, дасть найкращі показники.

Буферизація - це річ, яка має все значення! Використовуйте його, якщо у вас є! Якщо у вас його немає, дістаньте його! Використовувати (m}?bufferплюс що-небудь краще, ніж щось саме по собі. це практично буквально панацея від повільної передачі мережевих файлів.

Якщо ви переносите кілька файлів, використовуйте їх tarдля "згуртування" разом в один потік даних. Якщо це один файл, ви можете використовувати catабо переадресацію вводу / виводу. Накладні витрати tarпорівняно з catстатистично незначними, тому я завжди використовую tar(або zfs -sendтам, де можу), якщо це вже не тарбол . Жодне з них не гарантовано дає метадані (і, зокрема cat, не буде). Якщо ви хочете метаданих, я залишу це як вправу для вас.

Нарешті, використання sshтранспортного механізму є одночасно безпечним і несе в собі дуже невеликі витрати. Знову ж таки, накладні витрати sshпорівняно з ncстатистично незначними.


4
openssl speedна i7-3770 дає ~ 126–146 Мбайт / сек для СВЧ-метелика та ~ 138–157 МБ / сек для AES CBC (цей чіп має інструкції AES-NI). Тоді ~ 200–300 Мб / сек для sha256. Так що він може ледве натиснути 1 гігабіт. За допомогою OpenSSH 6.1+ ви можете використовувати AES GCM, що може робити із сліпою швидкістю (370–1320 Мб / с, залежно від розміру повідомлення). Тому я думаю, що єдино вірно, що OpenSSH має невеликі накладні витрати, якщо ви працюєте на версії 6.1+ на чіпі з AES-NI та використовуєте AES-GCM.
дероберт

1
Фу, я змінив це на 6.1+ замість 6.2+ в останню хвилину, швидко перевіривши. Звичайно, це була помилка, це зміни з 6.1. Тож OpenSSH 6.2+ є правильною версією. І це більше не дозволить мені редагувати коментар. Коментарі старше 5 хвилин повинні залишатися неправильними. Звичайно, якщо менше OpenSSH 6.4, див. Openssh.com/txt/gcmrekey.adv, як без патча, в застосуванні AES-GCM OpenSSH стався можливий недолік.
дероберт

Накладні витрати ssh(або rsync над ssh) дуже ДУЖЕ важливі. У мене є NAS, який використовує процесор Intel Atom. Шифрування SSH АБСОЛЮТНО БЕЗКЛЮЧАЄ швидкість передачі. Я отримую послідовно <400 Мбіт / сек для RSA, вручну переосмислюючи його на RC4, отримує мене ~ 600 Мбіт / с, і якщо я використовую rsync як демон, він працює на натурній швидкості посилання (> 900 Мбіт / сек, на гігабіті з'єднання).
Підроблене ім’я

Хоча це правда, що для багатьох ситуацій транспорт не є критичним, але це дуже важливо враховувати, особливо якщо ви не працюєте на надзвичайно високого класу обладнання. У моєму випадку Atom (це D525, двоядерний 1,8 ГГц) створює абсолютно чудовий NAS, з великою швидкістю для SMB, але шифрування його абсолютно вбиває.
Підроблене ім’я

2
Я отримую фатальну помилку через параметризацію mbuffer: 'mbuffer: fatal: загальна пам'ять повинна бути більшою, ніж розмір блоку \ n Закінчено'. Щоб виправитись, я підозрюю, що він повинен прочитати щось на кшталт "mbuffer -s 1K -m 512M" з остаточним "M", що стоїть за MByte (джерело: man mbuffer)
Пітер Люстіг,

1

Вам навіть не потрібно використовувати TCP. AoE - це реалізація ATA через Ethernet, а рівень 2 - це підхід із нижчими рівнями без знання TCP / IP стека. Це забезпечить вам максимально швидку передачу з найменшими накладними витратами. ***

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

*** якщо мережею є вузьке місце, переконайтеся, що ви надсилаєте стислі дані.


Нічого собі, це важке ядро! :) Цікаво, чи є якісь орієнтири ...
rogerdpack
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.