Назад | Перейти на главную страницу

Достижение очень быстрой (300 + МБ / сек) передачи файлов в Linux

Я работаю с высокопроизводительным оборудованием, однако я сталкиваюсь с узкими местами процессора во всех ситуациях, когда пытаюсь переместить большие объемы данных.

В частности, я перемещаю файлы больших образов виртуальных машин (VHD) размером 2 ТБ между двумя хостами Ubuntu.

Моя последняя попытка заняла 200 минут, чтобы передать 2 ТБ. В результате скорость передачи составляет около 170 МБ / с.

Я пробую такие методы, как netcat и scp с базовым шифром arcfour.

Аппаратное обеспечение на каждом конце - это 6 твердотельных накопителей корпоративного уровня в RAID 10 на аппаратном RAID-контроллере. 256 ГБ памяти и процессоры Xeon V4. Сеть составляет 20 Гбит / с (2 x 10 Гбит / с LACP).

Во всех случаях сеть и дисковый ввод-вывод имеют достаточно емкости, узким местом является постоянная привязка 1 ядра ЦП к 100%.

Я выполнил базовые тесты, используя различные методы, а именно:

Передача тестового файла 30 ГБ

scp: реальные 5 мин. 1. 970 сек.

NC: реальные 2m41.933s

NC & PIGZ: настоящие 1 мин. 24,139 сек.

Однако, поскольку у меня был пустой файл для тестирования, я не верю, что pigz приходилось слишком много работать. Когда я попытался использовать pigz для производственного файла VHD, pigz достигла 1200% загрузки ЦП, я считаю, что это стало узким местом. Поэтому мое самое быстрое время было установлено NC самостоятельно.

nc загружает 100% ЦП на каждом конце, я предполагаю, что просто обрабатывает ввод-вывод с диска в сеть.

Я действительно думал о разделении файла на куски и запуске нескольких nc, чтобы использовать больше ядер, однако у кого-то может быть лучшее предложение.

Несколько вещей, которые стоит попробовать:

  • используйте программу, которая использует sendfile (например, apache)
  • настроить сетевой стек Linux и NIC
  • включить больший MTU
  • включить разгрузку сетевого адаптера
  • используйте более производительную файловую систему (xfs или zfs)

В База знаний ESnet Fasterdata - отличный ресурс для оптимизации перемещения данных по быстрым сетям.

Ваши конечные точки физически находятся рядом друг с другом? Возможно, рассмотрите другой сетевой носитель, который предназначен для перемещения пакетов данных. Обработка ЦП может быть перенесена на карту адаптера, и ваш Ethernet не будет загружен в течение нескольких минут.

Ниже приведена (бюджетная) установка Infiniband, которая стоит около 500 долларов из частей Ebay (коммутатор Mellanox IS5022, 2 карты CX353A QDR (возможно, FDR, не помню) и (новые) кабели). Я побежал dd от гипервизора, на котором работает более 20 виртуальных машин, поэтому в нем есть изрядная задержка ввода-вывода. Однако перенос SSD (крепление iSCSI) по-прежнему заслуживает внимания.

В массив SATA (RAID 10):

# time dd if=/dev/zero of=foo.bin bs=1M count=30000
30000+0 records in
30000+0 records out
31457280000 bytes (31 GB, 29 GiB) copied, 106.652 s, 295 MB/s

real    1m52.795s
user    0m0.022s
sys     0m12.531s

И в массив SSD

# time dd if=/dev/zero of=foo.bin bs=1M count=30000
30000+0 records in
30000+0 records out
31457280000 bytes (31 GB, 29 GiB) copied, 19.1353 s, 1.6 GB/s

real    0m19.137s
user    0m0.020s
sys     0m18.782s