我在一个巨大的文件中随机读取数据(每个读取<页面大小)(太大而不适合内存)。
我通常设置MADV_DONTNEED
,但查看文档+信息似乎我需要FADV_NOREUSE
。
我并没有真正了解madvise()
和fadvise()
如何协同工作。他们是同义词吗?如果我喜欢其中一个是否重要?它们可以一起使用吗?它们是不同的内核子系统吗? FADV_NOREUSE
我正在寻找什么才能获得最佳效果?
答案 0 :(得分:6)
madvise()和posix_fadvise()不是同义词。 madvise()告诉内核(给出建议)如何处理现有内存区域,而fadvise()告诉内核如何处理文件数据的缓存(或未来缓存)。
例如,如果您使用mmap()匿名区域,则应使用madvise()来提示内核不要换出(MADV_RANDOM)或仅在访问后换出。 (MADV_SEQUENTIAL)
如果mmap()文件或文件的一部分,您可以使用madvise()或fadvise()来提示内核为您预读(MADV_WILLNEED)或释放该缓存(MADV_DONTNEED)或免费在访问之后(仅限POSIX_FADV_NOREUSE,fadvise())。
如果使用文件而不将数据映射到进程内存(不使用mmap()),则应仅使用fadvise()。 madvise()没有意义。
就内核子系统而言,在linux中,它是同一个子系统,只是不同的方式来引用内存页面和文件缓存。请注意,这些只是提示,当内存处于可怕状态时,尽管有提示,内核可能会决定换出或重用缓存数据。只有mlock()和mlockall()可以防止这种情况发生。
在你的情况下,不提供任何提示可能会有所帮助,特别是如果某些页面的读取比其他页面更多,因为内核会找出哪些页面“热”并将尝试保留在内存中。
答案 1 :(得分:-2)
如果您只是从文件中读取,那么您实际上也不需要。分页守护程序将自动释放与非脏或共享文件支持的映射关联的RAM页面。如果你一直在调用madvise/MADV_DONTNEED
,那么你就是专门指示内核执行此操作。如果您在不久的将来再次访问同一页面,可能会对性能产生影响。
fadvise
仅在您使用read/lseek
访问文件时才有用。对于mmap
ped页面,它没有效果。