Мне нужно сделать это для более предсказуемого бенчмаркинга.
Как очистить кеширование ввода-вывода на Linux
Ответ 1
Похоже, вам нужна команда sync или функция sync().
Если вы хотите очистить кеш диска: echo 3 | sudo tee /proc/sys/vm/drop_caches
Ответ 2
Вы можете сделать это следующим образом:
# 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, чтобы увидеть, что это три разных системных вызовов
Кроме того, может быть желательно отключить кеш жесткого диска, используя hdparm, не уверен, что вы сравниваете.
В любом случае вы не можете запретить жесткому диску кэшировать последние 64/32/16 МБ недавно использованных данных. Чтобы убить этот кеш, просто напишите некоторое количество нулей (и промойте) + прочитайте какое-то несвязанное место с HDD. Это необходимо, так как кеш может быть разделен на часть read-part и write-part. После этого вы можете протестировать HDD.
Ответ 3
Очистка кэша диска: echo 3 | sudo tee /proc/sys/vm/drop_caches
Командная документация: https://www.kernel.org/doc/Documentation/sysctl/vm.txt
Запись на это приведет к тому, что ядро удалит из памяти чистые кеши, столы и иноды из памяти, что освободит память.
Чтобы освободить pagecache:
echo 1 > /proc/sys/vm/drop_caches
Чтобы освободить шпалы и иноды:
echo 2 > /proc/sys/vm/drop_caches
Чтобы освободить pagecache, dentries и inodes:
echo 3 > /proc/sys/vm/drop_caches
Поскольку это неразрушающая операция, а грязные объекты недоступны, пользователь должен сначала запустить "синхронизацию", чтобы убедиться, что все кэшированные объекты освобождены.
Ответ 4
Короткие ответы достаточно хороши: (скопируйте палитру)
DISK=/dev/sdX # <===ADJUST THIS===
sync
echo 3 > /proc/sys/vm/drop_caches
blockdev --flushbufs $DISK
hdparm -F $DISK
Объяснение:
sync
: со страницы man: буферы файловой системы флеша. Принудительное изменение блоков на диск, обновление суперблока.
echo 3 > /proc/sys/vm/drop_cache
: из документации ядра, это приведет к отказу ядра от кеш-памяти
blockdev --flushbufs /dev/sda
: с man-страницы: устройство блокировки вызовов ioctls [to] сбросить буферы.
hdparm -F /dev/sda
: со страницы man: очистите буфер кэша записи на диске (старые диски могут не реализовывать это)
Несмотря на то, что команды blockdev и hdparm выглядят одинаково в соответствии с ответом выше, они выдают разные ioctls на устройство.
Долго, возможно, лучший способ:
(Я предполагаю, что вы отформатировали диск, но вы можете адаптировать эти команды, если хотите записать непосредственно на диск)
Запустите это только один раз перед первым эталоном:
MOUNT=/mnt/test # <===ADJUST THIS===
dd if=/dev/urandom of=$MOUNT/temp-hddread.tmp bs=64M count=16
Запускайте это каждый раз, когда вы хотите очистить кеши:
DISK=/dev/sdX # <===ADJUST THIS===
MOUNT=/mnt/test # <===AND THIS===
dd if=/dev/urandom of=$MOUNT/temp-hddwrite.tmp bs=64M count=16
rm $MOUNT/temp-hddwrite.tmp
sync
echo 3 > /proc/sys/vm/drop_caches
blockdev --flushbufs $DISK
hdparm -F $DISK
dd if=$MOUNT/temp-hddread.tmp of=/dev/null
Запустите это, когда закончите.
MOUNT=/mnt/test # <===ADJUST THIS===
rm $MOUNT/temp-hddread.tmp
Объяснение:
На жестком диске могут быть H/W кэши, которые не будут очищены с помощью приведенных выше команд. Я пишу и читаю псевдослучайные данные, прыгая, чтобы заполнить их мусором. Сколько данных зависит от того, насколько большой может быть кеш жесткого диска. Я использую /dev/urandom, потому что это быстро, и мы не заботимся об истинной случайности. Я создаю /mnt/test/temp -hddread.tmp с самого начала и использую его каждый раз, когда хочу читать достаточно случайных данных. Я создаю и удаляю /mnt/test/temp -hddwrite.tmp каждый раз, когда хочу писать достаточно случайных данных.
Кредиты
Я написал этот ответ на основе лучших частей существующих ответов.
Ответ 5
Отсоединение и повторная установка тестируемого диска будет reset всех кешей и буферов.