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