Как очистить дисковые кэши ввода / вывода в Linux? - PullRequest
50 голосов
/ 04 марта 2012

Мне нужно сделать это для более предсказуемого бенчмаркинга.

Ответы [ 5 ]

55 голосов
/ 04 марта 2012

Звучит так, будто вы хотите команду sync или функцию sync () .

Если вы хотите очистить кэш диска: echo 3 | sudo tee /proc/sys/vm/drop_caches

35 голосов
/ 31 января 2013

Вы можете сделать это следующим образом:

# sync # (move data, modified through FS -> HDD cache) + flush HDD cache
# echo 3 > /proc/sys/vm/drop_caches # (slab + pagecache) -> HDD (https://www.kernel.org/doc/Documentation/sysctl/vm.txt)
# blockdev --flushbufs /dev/sda
# hdparm -F /dev/sda

# NEXT COMMAND IS NOT FOR BENCHMARKING:
# should be run before unplug, flushes everything possible guaranteed.
# echo 1 > /sys/block/sdX/device/delete

Вы можете использовать strace, чтобы увидеть, что это три разных системных вызова

Также может быть желательно отключить кэш HDD с помощью hdparm, не уверен, что вы тестируете.

В любом случае, вы не можете запретить HDD кэшировать последние 64/32/16 МБ недавно использованных данных.Чтобы уничтожить этот кеш, просто напишите некоторое количество нулей (и очистите) + прочитайте какое-нибудь несвязанное место с жесткого диска.Это необходимо, поскольку кэш может быть разделен на части чтения и записи.После этого вы можете тестировать HDD.

21 голосов
/ 16 августа 2014

Очистка дискового кэша: echo 3 | sudo tee /proc/sys/vm/drop_caches

Документация команды: https://www.kernel.org/doc/Documentation/sysctl/vm.txt

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

Чтобы освободить кэш страницы:

echo 1 > /proc/sys/vm/drop_caches

Для освобождения зубных рядов и инодов:

echo 2 > /proc/sys/vm/drop_caches

Для бесплатной кэширования страниц, зубных рядов и инодов:

echo 3 > /proc/sys/vm/drop_caches

Поскольку это неразрушающая операция, и грязные объекты не могут быть освобождены, пользователь должен сначала запустить «синхронизацию», чтобы убедиться, что все кэшированные объекты освобождены.

8 голосов
/ 30 мая 2017

Достаточно краткий хороший ответ: (возможно копирование)

DISK=/dev/sdX # <===ADJUST THIS===
sync
echo 3 > /proc/sys/vm/drop_caches
blockdev --flushbufs $DISK
hdparm -F $DISK

Объяснение:

sync: со страницы руководства: очистить буферы файловой системы.Принудительно перенести измененные блоки на диск, обновить суперблок.

echo 3 > /proc/sys/vm/drop_cache: из документации по ядру это приведет к тому, что ядро ​​сбросит чистые кэши

blockdev --flushbufs /dev/sda: со страницы man: устройство блокировки вызова ioctls [to] очистить буферы.

hdparm -F /dev/sda: со страницы man: Flush theбуфер кэша записи на диске (старые диски могут не реализовывать это)

Хотя команды blockdev и hdparm выглядят одинаково в соответствии с ответом выше , они выдают разные ioctl для устройства.

Длинный, вероятно, лучший способ:

(я предполагаю, что вы отформатировали диск, но вы можете адаптировать эти команды, если хотите записывать непосредственно на диск)

Запустите это только один раз до 1-го теста:

MOUNT=/mnt/test # <===ADJUST THIS===
# create a file with psuedo-random data. We will read it
# to fill the read cache of the HDD with garbage
dd if=/dev/urandom of=$MOUNT/temp-hddread.tmp bs=64M count=16

Запустите это каждый раз, когда вы хотите очистить кеши:

DISK=/dev/sdX # <===ADJUST THIS===
MOUNT=/mnt/test # <===AND THIS===
# create a file with psuedo-random data to fill the write cache
# of the disk with garbage. Delete it afterwards it's not useful anymore
dd if=/dev/urandom of=$MOUNT/temp-hddwrite.tmp bs=64M count=16
rm $MOUNT/temp-hddwrite.tmp
# see short good enough answer above
sync
echo 3 > /proc/sys/vm/drop_caches
blockdev --flushbufs $DISK
hdparm -F $DISK
# read the file with pseudo-random data to fill any read-cache
# the disk may have with garbage
dd if=$MOUNT/temp-hddread.tmp of=/dev/null

Запустите это, когда выготово.

MOUNT=/mnt/test # <===ADJUST THIS===
# delete the temporary file with pseudo-random data
rm $MOUNT/temp-hddread.tmp

Объяснение:

На диске, вероятно, имеется некоторый H / W-кэш.Некоторые диски по своему замыслу или из-за ошибок могут не очищать свои кеши при выполнении команд blockdev и hdparm.Чтобы компенсировать это, мы записываем и читаем псевдослучайные скачкообразные данные в заполняем эти кэши, чтобы из них удалялись любые кэшированные данные.Сколько данных вам нужно, чтобы заполнить кеш, зависит от его размера.В приведенных выше командах я использую dd для чтения / записи 16 * 64MB = 1024MB, настройте аргументы, если ваш жесткий диск может иметь больший кэш (таблицы данных и эксперименты - ваш друг, и не мешало бы указать значения выше реального размераиз кеша).Я использую / dev / urandom в качестве источника для случайных данных, потому что это быстро, и нас не волнует истинная случайность (нас интересует только высокая энтропия, потому что прошивка диска может использовать сжатие перед сохранением данных в кэш).Я создаю /mnt/test/temp-hddread.tmp с самого начала и использую его каждый раз, когда хочу прочитать достаточно случайных данных.Я создаю и удаляю /mnt/test/temp-hddwrite.tmp каждый раз, когда хочу написать достаточно случайных данных.

Кредиты

Я написал этоответ на основе лучших частей существующих ответов.

2 голосов
/ 04 марта 2012

Размонтирование и повторная установка тестируемого диска приведет к сбросу всех кешей и буферов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...