Подтвердить что ты не робот

Как очистить кеширование ввода-вывода на Linux

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

4b9b3361

Ответ 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 всех кешей и буферов.