Чи можна скопіювати великі файли швидше, не використовуючи кеш файлів?


19

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

Передавши одне віртуальне зображення або відеофайл розміром 3-4 Гб на зовнішній диск, схоже, цей величезний кеш видаляє всі попередньо завантажені програми з пам'яті, що призводить до збільшення часу завантаження та зниження загальної продуктивності.

Чи є спосіб скопіювати великі багатогігабайтні файли, не кешуючи їх (тобто обходячи кеш файлів)? Або спосіб збереження певних папок чи білого списку певних папок?

Відповіді:


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потрібно встановити вручну з репостів.
Відновіть Моніку - ζ--

1
Власне, ні. ddдивний синтаксис порушує ** опірника. Ви можете все ще використовувати скрипт , який отримав аргументи зазвичай ( dd.sh in.file out.fileс ** в іменах файлів) і дав імена файлів з ddвикористанням $1, $2і т.д., які не повинні бути забрудненою дивним синтаксисом Д.Д ..
Відновіть Моніку - ζ--

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 \;

Зверніть увагу, що це не збереже час модифікації файлу, право власності та інші атрибути.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.