После добавления пакета preload
мои приложения ускоряются, но если я копирую большой файл, файловый кэш увеличивается более чем в два раза по сравнению с размером файла.
За счет переноса одного образа или виртуального файла виртуальной коробки размером 3-4 ГБ на внешний диск этот огромный кэш, по-видимому, удаляет все предварительно загруженные приложения из памяти, что приводит к увеличению времени загрузки и общему снижению производительности.
Есть ли способ скопировать большие мультигигабайтные файлы без их кеширования (то есть, обходя файловый кеш)? Или способ внести в белый или черный список определенные папки из кэша?
Существует утилита 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 Франсуа Марие.
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
, поскольку операции чтения / записи больше не кэшируются, и слишком большое количество небольших прямых операций может привести к серьезное замедление 4M
). Для множественных / рекурсивных копий каталогов , к сожалению, нет легко доступных инструментов; обычный cp
и т. д. не не поддерживают прямой ввод / вывод.
/ е iflags & amp; oflags изменен на правильный iflag & amp; Oflag
dd
использование find
и mkdir
Нам нужны к обходному решению две проблемы:
dd
не знает, что сделать с каталогами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 \;
Обратите внимание на то, что это не сохранит время изменения файла, владение и другие атрибуты.