Как удалить файл из системного кэша в Linux? - PullRequest
5 голосов
/ 02 октября 2008

При выполнении тестов производительности попадание или пропуск кэша файловой системы может существенно повлиять на результаты теста. Поэтому обычно перед выполнением таких тестов используемые файлы удаляются из системного кэша. Как это сделать в Linux?

Уточнение: Если возможно, решение не должно требовать привилегий суперпользователя.

Ответы [ 5 ]

11 голосов
/ 02 октября 2008

В качестве суперпользователя вы можете делать следующее:

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

  • echo 1> / proc / sys / vm / drop_caches

Чтобы освободить дентри и иноды:

  • echo 2> / proc / sys / vm / drop_caches

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

  • echo 3> / proc / sys / vm / drop_caches

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

sync; echo 3 > /proc/sys/vm/drop_caches

Как я уже сказал, только суперпользователь (root) может делать это.

10 голосов
/ 02 октября 2008

Ха, у меня есть ответ:

#include <unistd.h>
#include <fcntl.h>
int main(int argc, char *argv[]) {
  int fd;
  fd = open(argv[1], O_RDONLY);
  fdatasync(fd);
  posix_fadvise(fd, 0,0,POSIX_FADV_DONTNEED);
  close(fd);
  return 0;
}

Это от http://insights.oetiker.ch/linux/fadvise.html

6 голосов
/ 23 июля 2009

Эрик Вонг предлагает утилиту командной строки, которая облегчает вызов posix_fadvise:

http://git.bogomips.org/cgit/pcu.git/tree/README

Тогда все просто, как

$ pcu-fadvise -a dontneed filename-to-evict
0 голосов
/ 12 октября 2008

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

Если вы перечислите тестовую файловую систему в / etc / fstab с опцией «user», вы можете смонтировать ее для теста, не будучи суперпользователем

0 голосов
/ 02 октября 2008

Относительно использования O_DIRECT: это нарушило бы результаты другим способом. Ядро будет пытаться отправить данные файловой системы непосредственно в буфер read (), чтобы их можно было передать вашему приложению без дополнительной копии. Без O_DIRECT ядро ​​DMA помещает данные файла в кеш страницы и копирует их из кеша страницы в буфер read ().

Это нормально, если ваше приложение действительно будет использовать O_DIRECT в производстве. Если вы запустите тесты производительности с O_DIRECT, а затем удалите O_DIRECT для производства, ваш тест производительности будет нереальным.

...