运维开发网

mmap vs O_DIRECT用于随机读取(涉及的缓冲区是什么?)

运维开发网 https://www.qedev.com 2020-06-21 17:08 出处:网络 作者:运维开发网整理
我正在实现一个支持大量密钥(2600万)的基于磁盘的哈希表.该值被反序列化.读取在整个文件中基本上是随机的,值小于页面大小,我正在针对SSD进行优化.安全性/一致性不是那么大的问题(性能问题). 我目前的解决方案涉及使用带有MADV_RANDOM |的mmap()文件MADV_DONTNEED设置为禁用内核预取,仅根据需要加载数据. 我知道内核从磁盘读取到内存缓冲区,我从那里反序列化. O_DIR
我正在实现一个支持大量密钥(2600万)的基于磁盘的哈希表.该值被反序列化.读取在整个文件中基本上是随机的,值小于页面大小,我正在针对SSD进行优化.安全性/一致性不是那么大的问题(性能问题).

我目前的解决方案涉及使用带有MADV_RANDOM |的mmap()文件MADV_DONTNEED设置为禁用内核预取,仅根据需要加载数据.

我知道内核从磁盘读取到内存缓冲区,我从那里反序列化.

O_DIRECT怎么样?如果我调用read(),我仍然会复制到缓冲区(我反序列化),那么我可以获得任何优势吗?

在哪里可以找到有关mmap()文件所涉及的缓冲区的更多信息,并在使用O_DIRECT打开的文件上调用read()?

我对提前读取或缓存不感兴趣.它对我的用例没有任何帮助.

当数据绕过系统缓冲区并从缓冲区直接复制到磁盘控制器时,O_DIRECT是读/写操作的选项.为了获得O_DIRECT的优势,需要

符合某些条件 – 通过I / O块对齐的内存页缓冲区地址和缓冲区大小保持对齐.

无论如何,如果你使用mmap,你不使用读/写.而且,在mmap之后,您可以关闭文件描述符,并且映射仍然有效.所以,O_DIRECT与mmap选项没用.

我可以推荐什么来提高性能:

>如果您的子系统有许多搜索缺失键请求,您可以在内存中创建Bloom过滤器.此后,您在Bloom过滤器http://en.wikipedia.org/wiki/Bloom_filter上匹配您的搜索键,并拒绝丢失的密钥,而无需对磁盘的实际请求.

>为了节省内存,使用2级方案,当桶头保留在mmap-ed内存中,但桶本身是你通过pread()从文件中读取的.

我在自动完成子系统中实现的两个选项,你可以在这里看到它:http://olegh.ftp.sh/autocomplete.html并估计慢速旧电脑上的性能 – 赛扬300.

扫码领视频副本.gif

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号