Как избежать эффектов кэширования в тестах чтения - PullRequest
4 голосов
/ 15 сентября 2011

У меня есть тест чтения, и между последовательными запусками я должен убедиться, что данные не хранятся в памяти, чтобы избежать эффектов, наблюдаемых из-за кэширования. Пока что я использовал: запустить программу, которая записывает большой файл между последовательными запусками теста чтения. Что-то вроде

./read_benchmark
./write --size 64G --path /tmp/test.out
./read_benchmark

Программа записи просто записывает в файл массив размером 1G 64 раза. Поскольку размер основной памяти составляет 64 ГБ, я пишу файл, который составляет ок. такой же размер. Проблема в том, что запись занимает много времени, и мне было интересно, есть ли более эффективные способы сделать это, то есть избежать эффектов, наблюдаемых при кэшировании данных.

Кроме того, что произойдет, если я запишу данные в / dev / null?

./write --size 64G --path /dev/null

Таким образом, программа записи завершается очень быстро, фактически ввод-вывод не выполняется, но я не уверен, что она перезаписывает 64 ГБ основной памяти, чего я в конечном итоге и хочу.

Ваш вклад очень важен.

Ответы [ 5 ]

4 голосов
/ 15 сентября 2011

Вы можете удалить все кэши, используя специальный файл в /proc, например:

echo 3 > /proc/sys/vm/drop_caches

Это должно гарантировать, что кэш не влияет на тест.

2 голосов
/ 16 сентября 2011

Вы можете просто размонтировать файловую систему и смонтировать ее обратно. Размонтирование сбрасывает и удаляет кэш для файловой системы.

2 голосов
/ 16 сентября 2011

Вы можете вызвать fadvise с помощью FADV_DONTNEED, чтобы сообщить ядру о том, что определенные файлы не должны быть кэшированы. Вы также можете использовать mincore (), чтобы убедиться, что файл не кэшируется. Хотя решение drop_caches явно проще, это может быть лучше, чем уничтожение всего кэша, поскольку это влияет на все процессы на коробке. Я не думаю, что вам нужны повышенные привилегии для использования fadvise, хотя я уверен, что вы делаете для записи в / proc , Вот хороший пример использования вызовов fadvise для этой цели: http://insights.oetiker.ch/linux/fadvise/

2 голосов
/ 15 сентября 2011

Используйте echo 3 > /proc/sys/vm/drop_caches для очистки кэша страниц, кэша записей каталога и кэша inode.

2 голосов
/ 15 сентября 2011

Один (грубый) способ, который почти никогда не выходит из строя, это просто занять всю эту избыточную память другой программой.

Создайте тривиальную программу, которая выделяет почти всю свободную память (оставляя достаточно для вашего приложения для тестирования). Затем memset() память к чему-то, чтобы гарантировать, что ОС будет фиксировать его в физической памяти. Наконец, выполните команду scanf(), чтобы остановить программу, не прерывая ее.

"Захватив" всю избыточную память, ОС не сможет использовать ее в качестве кеша. И это работает как в Linux, так и в Windows. Теперь вы можете продолжить тестирование ввода / вывода.

(хотя это может не сработать, если вы делитесь машиной с другими пользователями ...)

...