Очистка кеша ОС из мем-отображенных файлов без дескриптора файла - PullRequest
1 голос
/ 03 мая 2019

Мне нужно заставить ОС очищать страницы, используемые для сопоставленного файла. У меня нет дескриптора файла, поэтому 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 Ответ

0 голосов
/ 04 мая 2019

Второй вариант сработал. Когда файл открывается позже, сопоставленная область связывается с ним, и вызов 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);
...