Достаточно краткий хороший ответ: (возможно копирование)
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 каждый раз, когда хочу написать достаточно случайных данных.
Кредиты
Я написал этоответ на основе лучших частей существующих ответов.