Очистка кеша ОС из файлов, помеченных как мем

Мне нужно заставить ОС очищать страницы, используемые для сопоставленного файла. У меня нет дескриптора файла, поэтому posix_fadvise не может быть использован.

Наше приложение кэширует множество файлов, отображая их в памяти. После того, как файл был сопоставлен (т.е. мы получили указатель от mmap()), закрываем файл. Когда на более позднем этапе мы должны очистить кеш, мы хотим также очистить страницы в кеше ОС. То есть мы хотим разархивировать файл и сделать что-то вроде posix_fadvise(POSIX_FADV_DONTNEED), но дескриптор файла на данный момент недоступен.

Поток выглядит так:

//caching stage
fd = open("file");
data = mmap(fd, <mmap flags>);
close(fd);

//clean-up stage
munmap(data);
// posix_fadvise(???, POSIX_FADV_DONTNEED);

Есть ли способ очистить кэшированные страницы без дескриптора файла?

Я подумал о следующих двух обходных путях:

  • Держу файлы открытыми, чтобы у меня были действительные дескрипторы во время очистки. Тем не менее, это могут быть десятки тысяч файлов, и сохранение их всех открытыми может повлиять на производительность ОС.
  • Сохраните путь к файлу и откройте его, чтобы получить дескриптор и вызвать posix_fadvise(), Но вопрос в том, будет ли старая сопоставленная область связана с тем же файлом? И воля fadvise() очистить кэшированные страницы в этом сценарии?

1 ответ

Второй вариант сработал. Когда файл открывается позже, сопоставленная область связывается с ним и вызывает posix_fadvise с новым файловым дескриптором выгружает сопоставленные страницы:

//caching stage
fd = open("file");
data = mmap(fd, <mmap flags>);
close(fd);

//clean-up stage
fd = open("file");
munmap(data);
posix_fadvise(fd, POSIX_FADV_DONTNEED);
close(fd);
Другие вопросы по тегам