Linux 从没有文件句柄的mem映射文件中清除OS缓存
我需要强制操作系统清除用于映射文件的页面。我没有文件描述符,因此无法使用posix_fadvise 我们的应用程序通过将大量文件映射到内存来缓存它们。映射文件后(即,我们从Linux 从没有文件句柄的mem映射文件中清除OS缓存,linux,paging,mmap,oscache,Linux,Paging,Mmap,Oscache,我需要强制操作系统清除用于映射文件的页面。我没有文件描述符,因此无法使用posix_fadvise 我们的应用程序通过将大量文件映射到内存来缓存它们。映射文件后(即,我们从mmap()获得指针),我们关闭文件。当以后我们需要清理缓存时,我们也要清理OS缓存中的页面。也就是说,我们希望取消映射文件,并执行类似于posix\u fadvise(posix\u FADV\u DONTNEED)的操作,但此时文件描述符不可用 流程如下所示: //caching stage fd = open("file
mmap()
获得指针),我们关闭文件。当以后我们需要清理缓存时,我们也要清理OS缓存中的页面。也就是说,我们希望取消映射文件,并执行类似于posix\u fadvise(posix\u FADV\u DONTNEED)的操作,但此时文件描述符不可用
流程如下所示:
//caching stage
fd = open("file");
data = mmap(fd, <mmap flags>);
close(fd);
//clean-up stage
munmap(data);
// posix_fadvise(???, POSIX_FADV_DONTNEED);
//缓存阶段
fd=打开(“文件”);
数据=mmap(fd,);
关闭(fd);
//清理阶段
地图(数据);
//posix_fadvise(?,posix_fadvise_DONTNEED);
有没有办法在没有文件描述符的情况下清除缓存的页面
我考虑过以下两种解决方法:
- 保持文件打开,以便在清理时有有效的描述符。但是,可能有成千上万个文件,保持它们全部打开可能会影响操作系统的性能
- 保留文件路径,然后重新打开它以获取描述符并调用
。但问题是:旧映射区域是否与同一文件关联?在这种情况下,posix_fadvise()
会清除缓存页面吗fadvise()
- 第二种选择奏效了。稍后重新打开文件时,映射区域与之关联,并使用新文件描述符调用
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);
//缓存阶段
fd=打开(“文件”);
数据=mmap(fd,);
关闭(fd);
//清理阶段
fd=打开(“文件”);
地图(数据);
posix_fadvise(fd,posix_fadvise_DONTNEED);
关闭(fd);
第二个选项起作用了。稍后重新打开文件时,映射区域与之关联,并使用新文件描述符调用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);
//缓存阶段
fd=打开(“文件”);
数据=mmap(fd,);
关闭(fd);
//清理阶段
fd=打开(“文件”);
地图(数据);
posix_fadvise(fd,posix_fadvise_DONTNEED);
关闭(fd);
缓存与文件关联,而不是特定的映射,因此我认为重新打开文件应该可以。我只是在munmap()的手册页中发现了这一点:关闭文件描述符不会取消映射区域。看起来该区域与该文件关联,并且在下次打开该文件时将与新fd关联。我将测试它并发布结果。您已经知道关闭描述符不会取消文件的映射,由于您的应用程序在关闭后继续使用映射。我误解了这一部分–我认为页面将失去与文件的链接,成为内存中的数据。大多数Linux系统使用统一的文件缓存。缓存与文件关联,而不是特定的映射,因此,我认为重新打开该文件应该有效。我刚刚在munmap()的手册页中发现:关闭文件描述符不会取消区域映射。看起来该区域与该文件关联,并且在下次打开该文件时将与新fd关联。我将对其进行测试并发布结果。您已经知道,关闭描述符并不会取消映射文件,因为您的应用程序在关闭后仍在使用映射。我误解了这一部分,我认为页面将失去与文件的链接,成为内存中的数据。大多数Linux系统使用统一的文件缓存。