Заставьте Linux записывать в сетевую файловую систему одновременно с чтением с локального диска

17

Резюме

Как настроить Linux для чтения с локального диска / файловой системы и одновременной записи в общую сетевую папку, в отличие от чтения, когда данные не передаются по сети, а затем отправки этих данных по сети, когда локальный диск холостой ход?

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

Детали

Я перемещаю большой объем данных с локальных дисков на компьютере с Linux на устройство NAS.

Я использую rsyncв основном скопировать /srv/dataв /mnt/nas, который является CIFS крепление.

Все началось хорошо: чтение со скоростью 100 МБ / с и запись в NAS со скоростью 100 МБ / с (ограничение гигабитной сети), при этом чтение и запись выполняются одновременно.

Однако теперь, спустя несколько часов, я обнаружил, что он читает с локального диска, затем останавливает чтение, пока записывает в NAS, затем, когда больше нет данных для записи в NAS, он возобновляет чтение с диска. опять таки. Сеть находится в режиме ожидания, пока диск читается, а диск не используется, когда сеть используется.

Излишне говорить, что чтение 200 МБ, а затем запись 200 МБ занимает гораздо больше времени, чем чтение и запись этих 200 МБ одновременно.

Как я могу настроить ядро ​​так, чтобы оно придерживалось более раннего поведения чтения и записи одновременно, а не чередовало чтение и запись, выполняя только одну операцию за раз?

Некоторые наблюдения: Когда локальный диск читает со скоростью 100+ МБ / с, кажется, что все параллельно происходит просто отлично, но как только диск замедляется (кажется, сейчас он работает со скоростью всего 20 МБ / с по какой-то причине), именно тогда происходит чтение / запись. переключение, кажется, происходит.

Я также могу запустить syncвручную каждые несколько секунд , чтобы получить , что запись происходит параллельно с чтений (хотя , очевидно , при сниженных скоростях) , однако ввод syncв whileпетле так , что она проходит через каждые пять секунд , не кажется правильным решение ...

Кажется, что ядро ​​кеширует около 1 ГБ данных, а затем записывает их по сети настолько быстро, насколько это возможно - и это хорошо - я просто не понимаю, почему медленный диск должен перестать считываться, пока данные отправляются через сеть.

Malvineous
источник
1
В этом смысле большинство инструментов unix абсолютно не оптимизированы для пропускной способности, ни rsync, ни даже простой cp. Это однопоточные приложения, использующие блокировку ввода-вывода.
Петер - Восстановить Монику
1
Где-то около 100 МБ / с - это то, что вы можете увидеть на современных обычных вращающихся жестких дисках со скоростью 7200 об / мин в чисто последовательных рабочих нагрузках. Он отключается, как только вы начинаете поиск, например, для обновления метаданных или если файловая система фрагментирована, потому что тогда вы становитесь привязанными к IOPS.
CVN
Вы можете установить rsync на NAS?
Jasen

Ответы:

27

После некоторого дополнительного исследования, похоже, что эта проблема связана не столько с ядром, сколько с rsyncвзаимодействием CIFS.

Насколько я могу судить, происходит то, что при rsyncзакрытии файла назначения CIFS (и, возможно, любая сетевая файловая система) гарантирует, что файл полностью сброшен и записан на удаленный диск до closeвозврата системного вызова. Это должно гарантировать любому приложению, что после успешного завершения операции закрытия файл был полностью сохранен, и нет риска дальнейших ошибок, которые могут привести к потере данных.

Если это не было сделано, тогда приложение могло бы закрыть файл, не думая, что операция сохранения прошла успешно, а затем (возможно, из-за проблем с сетью) данные не могут быть записаны в конце концов, но к тому времени слишком поздно, чтобы приложение что-либо предприняло, например, попросило пользователя сохранить файл в другом месте.

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

Обходной путь - смонтировать общий ресурс CIFS с опцией, cache=noneкоторая отключает эту функцию и заставляет все операции ввода-вывода идти прямо на сервер. Это устраняет проблему и позволяет выполнять чтение и запись параллельно, однако недостатком этого решения является то, что производительность несколько ниже. В моем случае скорость передачи по сети падает с 110 МБ / с до 80 МБ / с.

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

Кажется, rsyncнужна опция, чтобы закрыть свои файловые дескрипторы в другом потоке, чтобы он мог начать чтение следующего файла, пока последний еще не очищен.

РЕДАКТИРОВАТЬ: Я подтвердил, что, cache=noneбезусловно, помогает при передаче большого количества небольших файлов (приносит от 10 МБ / с до 80 МБ / с), но при передаче больших файлов (1 ГБ +) cache=noneснижает скорость передачи со 110 МБ / с до тех же 80 МБ / с. Это говорит о том, что медленная передача из множества маленьких файлов связана не столько с поиском исходного диска, сколько с наличием большого количества очисток кеша от всех маленьких файлов.

Malvineous
источник
2
Это очень интересная проблема, и спасибо за размещение объяснения. rsyncдействительно читает файл в другом потоке (на самом деле, в другом процессе), потому что он спроектирован так, что одна копия rsyncработает на каждой стороне сети, даже если в вашем случае обе копии находятся на одной стороне (а файловая система скрывает Дело в том, что есть сеть). Я думаю, это не поможет, потому что процесс чтения очень быстро заполняет канал, в то время как процесс записи блокирует на close(). rsyncбудет работать лучше, если вы используете rsyncна провод, а не CIFS.
Селада
1
Я полагаю, что другое решение, которое вы не можете запустить rsyncна NAS, - это использовать его rsyncпо сети (например rsync -a files localhost:/dest/path), в то же время искусственно вводя огромный буфер (например, несколько мегабайт, по крайней мере) в сетевые подключения. Не уверен, как будет выглядеть лучший хакер для этого.
Селада
@Celada: Спасибо! Да, я думаю, что работа rsyncна устройстве NAS сама по себе решит эту проблему. Хотя это немного сложнее (странные разрешения NAS, нужно удалить символические ссылки и т. Д.), Но если бы у меня было немного больше данных для копирования, это стоило бы времени, чтобы сделать это, я думаю.
Malvineous
2
Возможно, не относится к вашему случаю: у меня была похожая проблема несколько лет назад при записи вывода dump(8)на NAS, смонтированный через NFS. В то время я диагностировал проблему как максимальное использование ЦП на NAS из-за совместного действия сервера NFS и брандмауэра, работающего на NAS (коробка не была укоренена, и брандмауэр нельзя было полностью отключить из веб-интерфейс). Проблема ушла, когда мы заменили NAS на старый ПК. FWIW.
Satō Katsura
@SatoKatsura: Определенно, возможно, для старых устройств NAS, хотя в таком случае, я полагаю, вы увидите более медленную передачу в целом, а не пакетную передачу, подобную этой? Мой NAS представляет собой двухъядерный Atom (~ 2 ГГц), который использует около 30% процессорного времени при максимальном использовании одного гигабитного сетевого адаптера без больших кадров, поэтому все должно быть в порядке.
Malvineous