Могу ли я копировать большие файлы быстрее, не используя файловый кеш?

19

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

При переносе одного образа или виртуального файла виртуальной коробки размером 3-4 ГБ на внешний диск этот огромный кэш, похоже, удаляет все предварительно загруженные приложения из памяти, что приводит к увеличению времени загрузки и общему снижению производительности.

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

Veazer
источник

Ответы:

19

Есть nocacheутилита, которая может предшествовать команде вроде ioniceи nice. Это работает, предварительно загружая библиотеку, которая добавляет posix_fadviseс POSIX_FADV_DONTNEEDфлагом к любым открытым вызовам.

Проще говоря, он сообщает ядру, что кэширование не требуется для этого конкретного файла; ядро обычно не кэширует файл. Смотрите здесь для технических деталей.

Это делает чудеса для любых огромных заданий копирования, например, если вы хотите сделать резервную копию многотерабайтного диска в фоновом режиме с наименьшим влиянием на вашу работающую систему, вы можете сделать что-то вместе nice -n19 ionice -c3 nocache cp -a /vol /vol2.

Пакет будет доступен в Ubuntu 13.10 и выше. Если вы используете предыдущий выпуск, вы можете либо установить пакет 13.10, либо выбрать этот бэкпорт 12.04 от Франсуа Мариера.

Гюнтер Пьез
источник
Я надеялся на что-то, что можно было бы сделать с помощью графического интерфейса, а также на способ просто занести в черный список папки «без кеша», но сейчас это нужно сделать.
Veazer
12

Для отдельных больших файлов, использование ddс прямым I / O в обходе кэша файлов:

Если вы хотите передать один (или несколько) больших файлов размером в несколько гигабайт, это легко сделать с помощью dd:

dd if=/path/to/source of=/path/to/destination bs=4M iflag=direct oflag=direct
  • Эти directфлаги говорят , ddчтобы использовать прямую опцию ядра I / O ( O_DIRECT) во время чтения и записи, таким образом , полностью минуя кэш файлов.
  • Для bsпараметра размера блока должно быть установлено достаточно большое значение, поскольку для минимизации количества операций с физическим диском, которые ddдолжны выполняться, поскольку операции чтения / записи больше не кэшируются, а слишком большое количество небольших прямых операций может привести к серьезному замедлению.
    • Не стесняйтесь экспериментировать со значениями от 1 до 32 МБ; настройка выше - 4 МБ ( 4M).

К сожалению, для нескольких / рекурсивных копий каталогов нет доступных инструментов; обычные cpи т. д. не поддерживают прямой ввод / вывод.

/ e iflags & oflags изменен на правильный iflag & oflag

иш
источник
1
Рекурсивный может быть сделано с zsh«S **оператора. zshнужно установить вручную из репозитория.
Восстановить Монику - Jul--
1
Вообще-то, нет. ddСтранный синтаксис запутывает ** оператор. Вы все еще можете использовать сценарий оболочки, который обычно получает аргументы ( dd.sh in.file out.fileс ** в именах файлов) и дает имена для ddиспользования $1, $2и т. Д., Которые не должны быть загрязнены странным синтаксисом dd.
Восстановите Монику - Jul--
1
Прямое создание очень медленное, поскольку AFAIK также отключает кэши чтения, что, вероятно, не то, что вам нужно, и нереально в сценарии сравнительного анализа. Вместо этого используйте «iflag = nocache oflag = nocache», который точно говорит операционной системе, что вам не нужен внутренний или внешний кешированный файл.
stolsvik
1

Вы можете скопировать каталог рекурсивно с ddпомощью findиmkdir

Нам нужно обойти две проблемы:

  1. dd не знает что делать с каталогами
  2. dd можно копировать только один файл за раз

Сначала давайте определим входные и выходные каталоги:

SOURCE="/media/source-dir"
TARGET="/media/target-dir"

Теперь давайте перейдем cdк исходному каталогу, поэтому findсообщим об относительных каталогах, которыми мы можем легко управлять:

cd "$SOURCE"

Дублируйте дерево каталогов из $SOURCEв$TARGET

find . -type d -exec mkdir -p "$TARGET{}" \;

Повторяющиеся файлы $SOURCEдля $TARGETпропуска кэш записи (но с использованием кэш - памяти для чтения!)

find . -type f -exec dd if={} of="$TARGET{}" bs=8M oflag=direct \;

Обратите внимание, что это не сохранит время изменения файла, владельца и другие атрибуты.

unfa
источник