После некоторого дополнительного исследования выяснилось, что эта проблема меньше связана с ядром, а больше связана с взаимодействием rsync
и CIFS.
Насколько я понимаю, происходит следующее: когда rsync
закрывает целевой файл, CIFS (и, возможно, любая сетевая файловая система) гарантирует, что файл полностью очищен и записан на удаленный диск перед тем, как системный вызов close
возвращается. Это сделано для того, чтобы гарантировать любому приложению, что после успешного завершения операции закрытия файл был полностью сохранен, и нет риска каких-либо дальнейших ошибок, которые могут привести к потере данных.
Если этого не сделать, то приложение могло бы закрыть файл, выйти, думая, что операция сохранения прошла успешно, а затем (возможно, из-за проблем с сетью) данные все же не могли быть записаны, но к тому времени приложению уже слишком поздно что-либо делать с этим, например спрашивать пользователя, хотят ли они вместо этого сохранить файл в другом месте.
Это требование означает, что каждый раз, когда rsync
завершает копирование файла, весь дисковый буфер должен очищаться по сети, прежде чем rsync
сможет продолжить чтение следующего файла.
Обходной путь - смонтировать общий ресурс CIFS с параметром cache = none
, который отключает эту функцию и заставляет все операции ввода-вывода идти прямо на сервер. Это устраняет проблему и позволяет выполнять чтение и запись параллельно, однако недостатком этого решения является несколько более низкая производительность. В моем случае скорость передачи данных по сети упала со 110 МБ / с до 80 МБ / с.
Это может означать, что при копировании больших файлов производительность может быть лучше с чередованием чтения / записи. Для многих файлов меньшего размера отключение кеша приведет к меньшему количеству сбросов кеша при каждом закрытии файла, поэтому производительность может там повыситься.
Кажется, rsync
нуждается в опции, чтобы закрыть дескрипторы файлов в другом потоке, чтобы он мог начать чтение следующего файла, пока последний все еще очищается.
РЕДАКТИРОВАТЬ: Я подтвердил, что cache = none
определенно помогает при передаче большого количества небольших файлов (с 10 МБ / с до 80 МБ / с), но при передаче больших файлов (1 ГБ +) cache = none
снижает скорость передачи со 110 МБ / с до тех же 80 МБ / с. Это говорит о том, что медленная передача из многих небольших файлов связана не столько с поиском исходного диска, сколько с наличием большого количества сбросов кеша от всех небольших файлов.
См. Разница между установкой GRUB в сектор MBR или в первый сектор загрузочного раздела? и GRUB в MBR или разделе?
По сути, если вы хотите использовать какой-либо другой загрузчик для последовательной загрузки GRUB, вы должны установить GRUB на основной раздел, а не на MBR. Это может иметь место, если вы используете несколько операционных систем и хотите использовать другой загрузчик в MBR (, там может быть только один ). Кроме того, производители оборудования иногда включают код в MBR, и, перезаписав его с помощью GRUB, вы можете стереть его.
Тем не менее, в MBR должен быть какой-то загрузчик, поэтому, если GRUB — единственный загрузчик в вашей системе, он должен находиться там. Как правило, если возможно, вы должны установить GRUB в MBR.