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

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

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

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

19
задан 2 July 2012 в 17:23

3 ответа

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

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

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

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

0
ответ дан 2 July 2012 в 17:23

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

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

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

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

/ е iflags & amp; oflags изменен на правильный iflag & amp; Oflag

0
ответ дан 2 July 2012 в 17:23

Можно скопировать каталог рекурсивно с 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 \;

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

1
ответ дан 2 July 2012 в 17:23

Другие вопросы по тегам:

Похожие вопросы: