Медленное копирование между каталогами NFS/CIFS на одном сервере

Медленное копирование между каталогами NFS/CIFS на одном сервере

Пожалуйста, потерпите, я знаю, что это много для чтения. Эта проблема может быть применима к другим, поэтому было бы здорово получить ответ. Мне пришлось отдать награду, потому что она истекала.

Когда я копирую на или с моего сервера NFS (Debian) с клиента (Ubuntu), он выжимает максимум из гигабита. Но когда я копирую между двумя каталогами на одном сервере, скорость колеблется от < 30 МБ/сек до более 100 МБ/сек. Большую часть времени она составляет около 50 МБ/сек.

То же самое копирование, выполненное напрямую на сервере NFS (локальные диски), я получаю 100-150 МБ/сек, иногда больше. Копирование файла между этим экспортом NFS и общим ресурсом CIFS, экспортированным из того же каталога на том же сервере, происходит так же медленно, а копирование между двумя каталогами через CIFS на том же сервере происходит медленно. iperfпоказывает двунаправленную скорость 941 Мб/940 Мб между клиентом и сервером.

Я убедился, что NFS использует асинхронность на сервере. Я также отключил синхронизацию в наборе данных ZFS и попытался удалить кэш ZFS и устройства журналирования.

Я провел тестирование на очень быстром чередующемся зеркале ZFS из 4 дисков по 2 ТБ с SSD-накопителем для устройств журналирования и кэширования.

Характеристики NFS-сервера:

Debian 8.2 core 4Ghz AMD-FX
32GB ram
ZFS raid 10, SSD cache/log
17GB ARC
4x2GB WD red drives
Intel 82574L NIC

Тестовый клиент:

Ubuntu 15.04, Core2Quad 2.4Ghz
8GB ram
SSD
Intel 82574L NIC

Вот как все устроено в настоящее время. /pool2/MediaЭто ресурс, который я тестировал.

/etc/fstabна клиенте:

UUID=575701cc-53b1-450c-9981-e1adeaa283f0 /               ext4        errors=remount-ro,discard,noatime,user_xattr 0       1
UUID=16e505ad-ab7d-4c92-b414-c6a90078c400 none            swap    sw              0       0 
/dev/fd0        /media/floppy0  auto    rw,user,noauto,exec,utf8 0       0
tmpfs    /tmp    tmpfs   mode=1777       0       0


igor:/pool2/other     /other        nfs         soft,bg,nfsvers=4,intr,rsize=65536,wsize=65536,timeo=50,nolock
igor:/pool2/Media       /Media          nfs     soft,bg,nfsvers=4,intr,rsize=65536,wsize=65536,timeo=50,nolock,noac
igor:/pool2/home        /nfshome        nfs     soft,bg,nfsvers=4,intr,rsize=65536,wsize=65536,timeo=50,nolock

/etc/exportsна сервере (игорь):

#LAN
/pool2/home 192.168.1.0/24(rw,sync,no_subtree_check,no_root_squash)
/pool2/other 192.168.1.0/24(rw,sync,no_subtree_check,no_root_squash)
/pool2/Media 192.168.1.0/24(rw,async,no_subtree_check,no_root_squash)
/test 192.168.1.0/24(rw,async,no_subtree_check,no_root_squash)

#OpenVPN
/pool2/home 10.0.1.0/24(rw,sync,no_subtree_check,no_root_squash)
/pool2/other 10.0.1.0/24(rw,sync,no_subtree_check,no_root_squash)
/pool2/Media 10.0.1.0/24(rw,sync,no_subtree_check,no_root_squash)

статус zpool:

  pool: pool2
 state: ONLINE
  scan: scrub repaired 0 in 6h10m with 0 errors on Sat Oct  3 08:10:26 2015
config:

        NAME                                                 STATE     READ WRITE CKSUM
        pool2                                                ONLINE       0     0     0
          mirror-0                                           ONLINE       0     0     0
            ata-WDC_WD20EFRX-68AX9N0_WD-WMC300004469         ONLINE       0     0     0
            ata-WDC_WD20EFRX-68EUZN0_WD-WCC4MLK57MVX         ONLINE       0     0     0
          mirror-1                                           ONLINE       0     0     0
            ata-WDC_WD20EFRX-68AX9N0_WD-WCC1T0429536         ONLINE       0     0     0
            ata-WDC_WD20EFRX-68EUZN0_WD-WCC4M0VYKFCE         ONLINE       0     0     0
        logs
          ata-KINGSTON_SV300S37A120G_50026B7751153A9F-part1  ONLINE       0     0     0
        cache
          ata-KINGSTON_SV300S37A120G_50026B7751153A9F-part2  ONLINE       0     0     0

errors: No known data errors

  pool: pool3
 state: ONLINE
  scan: scrub repaired 0 in 3h13m with 0 errors on Sat Oct  3 05:13:33 2015
config:

        NAME                                        STATE     READ WRITE CKSUM
        pool3                                       ONLINE       0     0     0
          ata-WDC_WD40EFRX-68WT0N0_WD-WCC4E5PSCNYV  ONLINE       0     0     0

errors: No known data errors

/pool2 bonnie++ на сервере:

Версия 1.97 ------Последовательный вывод------ --Последовательный ввод- --Случайный-
Параллелизм 1 -На Chr- --Блок-- -Перезапись- -На Chr- --Блок-- --Поиск--
Размер машины К/сек %CP К/сек %CP К/сек %CP К/сек %CP К/сек %CP /сек %CP
игорь 63Г 100 99 187367 44 97357 24 325 99 274882 27 367.1 27

Склеивание

Я попробовал объединить и при прямом подключении, объединении balance-rr, я получаю скорость чтения 220 МБ/сек и записи 117 МБ/сек, копирования 40-50 МБ/сек.

iperf с соединением

[ ID] Интервал передачи Пропускная способность Retr
[ 4] 0.00-10.00 сек 1.10 ГБайт 942 Мбит/сек 707 отправитель
[ 4] 0.00-10.00 сек 1.10 ГБайт 941 Мбит/сек приемник
[ 6] 0.00-10.00 сек 1.06 ГБайт 909 Мбит/сек 672 отправитель
[ 6] 0.00-10.00 сек 1.06 ГБайт 908 Мбит/сек приемник
[SUM] 0.00-10.00 сек 2.15 ГБайт 1.85 Гбит/сек 1379 отправитель
[SUM] 0.00-10.00 сек 2.15 ГБайт 1.85 Гбит/сек приемник

Bonnie++ с подключением по NFS

Версия 1.97 ------Последовательный вывод------ --Последовательный ввод- --Случайный-
Параллелизм 1 -На Chr- --Блок-- -Перезапись- -На Chr- --Блок-- --Поиск--
Размер машины К/сек %CP К/сек %CP К/сек %CP К/сек %CP К/сек %CP /сек %CP
дымка 16G 1442 99 192941 16 89157 15 3375 96 179716 13 6082 77

При удалении кэша/журнала SSD, копировании по NFS, iostat показывает это

сдб 0,80 0,00 67,60 214,00 8561,60 23689,60 229,06 1,36 4,80 14,77 1,64 1,90 53,60
сдд 0,80 0,00 54,60 214,20 7016,00 23689,60 228,46 1,37 5,14 17,41 2,01 2,15 57,76
сдк 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
сде 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
сда 1,60 0,00 133,00 385,20 17011,20 45104,00 239,73 2,24 4,31 12,29 1,56 1,57 81,60
сдф 0,40 0,00 121,40 385,40 15387,20 45104,00 238,72 2,36 4,63 14,29 1,58 1,62 82,16
сдг 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00
мд0 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00
сдх 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

ТМПФС

Я экспортировал tmpfs через NFS и сделал копию файла - скорость была 108 МБ/сек. Локально с сервера она составляет 410 МБ/сек.

zvol смонтирован через NFS

Скорость колеблется от < 50 МБ/сек до > 180 МБ/сек, но в среднем составляет около 100 МБ/сек. Это то, что я ищу. Этот zvol находится в том же пуле (pool2), на котором я проводил тестирование. Это действительно заставляет меня думать, что это больше проблема набора данных ZFS/типа кэширования.

Тест чтения сырого диска

Используя эту команду

dd if=/dev/disk/by-id/ata-WDC_WD20EFRX-68AX9N0_WD-WMC300004469 of=/dev/null bs=1M count=2000

Я получаю 146-148 МБ/сек для всех 4 дисков

Медленное, неравномерное использование диска в пуле

Благодаря очень полезному человеку в списке рассылки ZFS я знаю, что делать, чтобы обеспечить более равномерное использование дисков.

Причина, по которой ZFS отдает предпочтение mirror-1, заключается в том, что он, по-видимому, был добавлен после того, как mirror-0 был довольно сильно заполнен, теперь ZFS пытается сбалансировать уровень заполнения.

Если вы хотите избавиться от этого и иметь немного времени: zfs итеративно отправляет наборы данных пула в новые наборы данных на себе, затем уничтожает источник, повторяя до тех пор, пока пул не будет перебалансирован.

Я исправил это, теперь данные на всех дисках одинаковы. Это привело к скорости копирования 75 МБ/сек по NFS и 118 МБ/сек локально.

Вопрос

Мой вопрос(ы). Если вы можете ответить на любой из вопросов, я приму ваш ответ:

  1. Как можно решить мою проблему? (медленное копирование по NFS, но не локальное)
  2. Если вы не можете ответить на вопрос №1, можете ли вы попробовать это на вашем сопоставимом сервере NFS с ZFS на Linux и сообщить мне результаты, чтобы мне было с чем сравнивать?
  3. Если вы не можете ответить на вопросы №1 или №2, можете ли вы попробовать провести то же тестирование на похожем сервере, но не на ZFS, через NFS?

решение1

Хм... Я заметил несколько проблем и, кажется, нашел один или два дымящихся пистолета. Но сначала я задам несколько вопросов и сделаю предположения о ваших вероятных ответах. Я представлю некоторые данные, которые на первый взгляд покажутся неактуальными, но я обещаю, что они будут стоить прочтения. Так что, пожалуйста, подождите... :-)

  • Я предполагаю, что в RAID10 у вас будет четыре диска с полосами и избыточностью.
  • И что вы используете Linux Autoraid (а не аппаратный RAID-контроллер).
  • Я также предполагаю, что все порты SATA могут передавать данные независимо друг от друга на полной скорости передачи в обоих направлениях, и что все порты SATA имеют одинаково высокую скорость. То есть, если у вас есть один адаптер/контроллер SATA, он полностью способен запускать все диски, подключенные к нему, на номинальной скорости.
  • Я также предполагаю, что у вас есть новейшие диски SATA + контроллер. То есть, 6.0 Гбит/с. Это 600 МБ/с. Чтобы быть консервативным, предположим, что мы получаем половину этого, или 300 МБ/с
  • Клиент-серверное соединение ограничено сетевой картой (100 МБ/с), поэтому оно не может в достаточной степени нагружать диски.
  • Чтобы работать быстрее сетевой карты при работе с NFS-NFS, я предполагаю, что вы используете localhost, чтобы выйти за пределы ограничений сетевой карты (о чем, как вы, по-моему, говорили, что вы и сделали, объединив, чтобы показать, что это не проблема).

ПРОБЛЕМА № 1. Ваши заявленные скорости передачи данных даже для быстрого локального-локального кажутся низкими. С такими быстрыми дисками я бы ожидал лучше, чем 150 МБ/с. У меня есть 3-дисковая система raid0, которая выдает только 3,0 Гб/с [ограничено адаптером], и я могу получить 450 МБ/с при чередовании. Ваши диски/контроллер в 2 раза быстрее моих, поэтому я бы ожидал [из-за чередования] 300 МБ/с, а не только 150 МБ/с для локального-локального. Или, может быть, даже 600 МБ/с [за вычетом накладных расходов ФС, что может сократить ее вдвое ради обсуждения]

  • Из информации zpool я понял, что конфигурация вашего диска — Western Digital, и она:
зеркало-0
  ата-WDC_WD20EFRX-68AX9N0
  ата-WDC_WD20EFRX-68EUZN0
зеркало 1
  ата-WDC_WD20EFRX-68AX9N0
  ата-WDC_WD20EFRX-68EUZN0
  • Теперь давайте сравним это с вашей информацией iostat. Было бы неплохо иметь информацию iostat на всех дисках для всех тестов, но я считаю, что могу диагностировать проблему только с тем, что вы предоставили
  • sdb и sdd максимально загружены
  • Как вы отметили, этостранный. Я бы ожидалвседиски для сбалансированного использования/статистики в рейде 10. Это [мой] дымящийся пистолет.
  • Объединяя два. Максимально загруженные диски немного отличаются от тех, которые не загружены. Я предполагаю, что порядок zpool — sda/sdb sdc/sdd [но он может быть обратным]
  • sda/sdc — это 68AX9N0
  • sdb/sdd — это 68EUZN0

ПРОБЛЕМА № 2. В результате поиска в Google по запросу WD20EFRX + 68AX9N0 + 68EUZN0 я нашел эту страницу:http://forums.whirlpool.net.au/archive/2197640

Похоже, что приводы 68EUZN0 могут парковать головки примерно через 8 секунд, тогда как другие более умны в этом отношении [или наоборот].

Итак, учитывая кэширование NFS + кэширование FS + кэширование SSD, базовые диски могут простаивать и парковать свои головки. Я предполагаю, что дополнительный уровень кэширования NFS - это то, что переворачивает его через край.

Вы можете проверить это, изменяя параметры синхронизации FS, возможно, синхронизация лучше асинхронности. Также, если вы можете, я бы перезапустил тесты с отключенным кэшированием SSD. Идея в том, чтобы убедиться, что парковка ненетпроизойдет и увидите результаты.

Как упоминалось на веб-странице, есть некоторые утилиты, которые могут регулировать интервал задержки парковки. Если это ваш вариант, обязательно тщательно его изучите.

ОБНОВЛЯТЬ:

Ваша проблема может рассматриваться как проблема пропускной способности через сеть с промежуточным хранением [с гарантированной доставкой]. Обратите внимание, янетговоря о NIC или эквиваленте.

Рассмотрим операцию ввода-вывода как пакет, содержащий запрос (например, чтение/запись, buf_addr, buf_len), который сохраняется в структуре. Этот пакет/структура запроса передается между различными уровнями кэша: NFS, ZFS, драйвер устройства, контроллер SATA, жесткий диск. В каждой точке у вас есть время прибытия на уровень и время отправления, когда запрос пересылается на следующий уровень.

В этом контексте фактическая скорость передачи данных на диске, когда передача фактически происходит, аналогична скорости соединения. Когда большинство людей рассматривают диски, они рассматривают только скорость передачи, а не момент, когда передача фактически инициирована.

В сетевом маршрутизаторе пакеты приходят, но они не всегда пересылаются немедленно, даже если исходящий канал свободен. В зависимости от политики маршрутизатора маршрутизатор может немного задержать пакет, надеясь, что из других источников прибудут еще пакеты [или из того же источника, если это UDP], поэтому маршрутизатор может объединить меньшие пакеты в один большой, который можно будет передать по исходящему каналу более эффективно.

Для дисков эта «задержка» может быть охарактеризована политикой кэширования определенного слоя FS. Другими словами, если запрос поступает на слой в момент времени T, то вместо того, чтобы покинуть слой в момент времени T+1 и поступить на следующий слой в момент времени T+1, он может поступить/поступить в момент времени T+n. Слой кэширования FS может делать это, чтобы иметь возможность оптимизировать порядок поиска/сортировать.

Поведение, которое вы видите, очень похоже на поведение TCP-сокета, который уменьшил свое окно из-за перегрузки.

Я думаю, важно разделить тестирование. Прямо сейчас вы делаете чтение и запись. И вы не знаете, какой из факторов является ограничивающим/узким местом. Я думаю, было бы полезно разделить тесты на чтение или запись. Хорошая программа для тестирования производительности, вероятно, сделает это. Я предлагаю более сложную версию [это всего лишь грубые примеры, а не точные аргументы для использования]:

Для записи время dd if=/dev/zero of=/whatever_file count=64g
Для чтения, время dd if=/whatever of=/dev/null count=64g
Причина 64 ГБ в том, что это в 2 раза больше вашей физической памяти и устраняет эффекты кэширования блоков. Выполните команду синхронизации между тестами.

Примените это на локальной FS и повторите на NFS.

Также сделайтечитатьтест на каждом из /dev/{sda,sdb,sdc,sdd}

Во время этих тестов используйте iostat.

Обратите внимание, что выполнение теста чтения на физическом сыром диске дает вам базовый/максимальный уровень того, насколько быстро может работать оборудование. Считывание сырых устройств должно приблизительно соответствовать максимальным возможностям спецификаций передачи ваших дисков. Ожидаемая скорость записи должна быть схожей для жесткого диска. Если нет, то почему? Все диски должны проходить тестирование примерно с одинаковой скоростью. Я пытаюсь объяснить, почему только два диска были максимально загружены в ваших предыдущих тестах.

Если посчитать, то при 32 ГБ и максимальной скорости передачи 600 МБ/сек, потребуется минимум 50 секунд, чтобы заполнить/сбросить это. Так на что же устанавливается время ожидания парковки?

Также вы можете немного изменить ситуацию, уменьшив объем физической памяти, которую ядро ​​разрешит через параметр загрузки mem=. Попробуйте что-то вроде mem=8g, чтобы посмотреть, какой эффект это даст. Также есть несколько записей /proc, которые могут настроить политику очистки кэша блочного слоя.

Кроме того, мои ФС ext4 и смонтированы с noatime. Вы можете рассмотретьzfs set atime=off ...

Также посмотрите системный журнал. Иногда диск сообщает об ошибке датчика, и система перенастраивает его на использование более низкой скорости передачи.

Также взгляните на данные SMART для дисков. Видите что-нибудь необычное? Чрезмерные мягкие повторы на данном диске (например).

Как я уже сказал, производительность локального диска намного ниже, чем я ожидал. Я думаю, что эту проблему нужно решить в первую очередь, прежде чем браться за всю систему с NFS. Если бы все диски raid имели сбалансированное использование и были в пределах нормы, я бы меньше беспокоился об этом.

Моя система [в которой также есть диски WDC] не настроена для NFS (я часто использую rsync). У меня есть несколько неотложных дел, которые мне нужно сделать в течение следующих 1-2 дней. После этого у меня будет время попробовать [мне самому было бы любопытно].

ОБНОВЛЕНИЕ №2:

Хороший ответ на вопрос о дисбалансе ZFS. Это помогает объяснить мою "проблему №1". Этомощьобъясните также нестабильность NFS, если операции по перебалансировке каким-то образом сбили NFS с толку в отношении задержки/времени, вызвав поведение «окна/отсрочки TCP» — не очень высокая вероятность, но тем не менее возможность.

С rsync тестированием нет необходимости/желания использовать NFS. Если вы можете ssh на сервер, rsyncиNFS избыточны. С NFS просто используйте cp и т. д. Чтобы сделать rsync, перейдите напрямую к базовой ZFS через ssh. Это будет работать даже без монтирования NFS [вот конфигурация rsync, которую я использую]:

экспорт RSYNC_SSH="/usr/bin/ssh"
экспорт SSH_NOCOMPRESS=1
rsync /wherever1 сервер:/zfsmount/whatever
Выполнение этого localhost или bonded может привести к ожидаемой производительности (без проблемы с дисбалансом ZFS). Если это так, то это явно сужает проблему до NFSсам.

Я просмотрел часть исходного кода ядра для NFS. Из того немногого, что я посмотрел, мне не понравилось то, что я увидел относительно своевременности. NFS появился еще в 80-х, когда соединения были медленными, поэтому в нем [все еще] много кода, чтобы попытаться сохранить пропускную способность сетевой карты. То есть, «совершать» [действие] только тогда, когда это абсолютно необходимо. Не обязательно то, что мы хотим. В моей причудливой аналогии политики сетевого маршрутизатора кэш NFS, похоже, имеет задержку «T+n».

Я бы рекомендовал сделать все возможное, чтобы отключить кэш NFS и как можно скорее передать запрос ZFS. Пусть ZFS будет умной, а NFS — «тупой трубой». Кэширование NFS может быть только общим по своей природе (например, оно даже не будет знать, что резервное хранилище — это RAID или слишком много о специальных характеристиках базовой FS, на которой оно смонтировано). ZFS имеет глубокие знания о RAID и дисках, которые его составляют. Таким образом, кэш ZFS может быть гораздо более разумным в выборе.

Я бы сказал, попробуйте заставить NFS сделать синхронное монтирование — это может сработать. Также я видел что-то о noatime, так что включите и эту опцию. Могут быть и другие опции настройки/монтирования NFS. Надеюсь, если NFS — обычный подозреваемый, его можно перенастроить, чтобы он работал достаточно хорошо.

Если, с другой стороны, ни один вариант не подчинит NFS, будет ли rsync через ssh жизнеспособной альтернативой? Каков фактический вариант использования? Похоже, что вы используете NFS как канал для больших объемов передачи, которым нужна высокая производительность (а не [скажем] просто как точка автоматического монтирования для домашних каталогов пользователей). Это для таких вещей, как резервное копирование клиента на сервер и т. д.?

Связанный контент