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

17

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

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

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

    
задан Veazer 17.04.2012 в 14:37
источник

3 ответа

16

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

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

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

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

    
ответ дан hirschhornsalz 03.07.2012 в 08:55
источник
10

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

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

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

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

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

ответ дан izx 26.06.2012 в 00:45
0

Вы можете скопировать каталог рекурсивно с помощью 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 26.04.2017 в 14:00