什么时候需要他¶
当 DB 使用成吨的 GB 级别的内存的时候,很大可能当程序需要访问内存数据的时候,程序会遇到 TLB 未命中的情况和从映射取数据的时候缓存未命中的情况。当使用 memtable 和表读取器提供的基于哈希表的索引和 bloom 过滤器的时候,用户的感觉会更明显,因为数据的局部性非常糟糕。这些索引以及 bloom 都非常适合放在巨型页 TLB 中。当你看到 TLB 数据大量溢出,并且有巨型页功能支持的时候,考虑打开这个功能吧。
现在只在 Linux 支持这个功能。
如何使用¶
需求单¶
- 你需要在 linux 中预留出巨型页
- 知道可以使用的巨型页的大小
参考 Linux 的 Documentation/vm/hugetlbpage.txt 获得更多细节
配置¶
这里介绍这个功能在哪里,如何打开:
- memtable 的 bloom 过滤器:设置 Options.memtable_prefix_bloom_huge_page_tlb_size 为巨型页的大小
- 哈希链表的 memtable 索引以及 bloom 过滤器:当调用 NewHashLinkListRepFactory 来创建一个 memtable 工厂对象的时候,把巨型页的大小通过 huge_page_tlb_size 传入
- PlainTableReader 的索引及 bloom 过滤器。当调用 NewPlainTableFactory 或者 NewTotalOrderPlainTableFactory 创建表工厂对象的时候,通过 huge_page_tlb_size 传入巨型页的大小
TLB: Translation lookaside buffer,地址转译缓冲。用于加快逻辑地址与物理地址转译速度的缓冲区。有硬件实现和软件实现两种。