CoroBase:使用C ++ 20协程隐藏缓存未命中的数据库引擎

2020-12-04 21:01:02

CoroBase是一个研究数据库引擎,将事务建模为C ++ 20无堆栈协程以隐藏CPU缓存未命中。请参阅我们的VLDB 2021文件中的详细信息:

[1]何永军,陆家成和王天正。 CoroBase:面向协程的主内存数据库引擎。 VLDB 2021。

CoroBase继承了ERMIA的共享所有架构,同步和并发控制协议。有关ERMIA的描述,请参见SIGMOD'论文[2];有关并发控制的详细信息,请参见VLDBJ论文[3];有关复制的详细信息,请参见VLDB论文[4]。

[2]金贤妮,王天正,瑞安·约翰逊和伊波克拉蒂斯·潘迪斯。 ERMIA:用于异构工作负载的快速内存优化数据库系统。 SIGMOD 2016。

[3] Wang Tianzheng,Ryan Johnson,Alan Fekete和Ippokratis Pandis。有效地(几乎)使任何并发控制机制可序列化。 VLDB Journal,第26卷,第4期.2017年。

[4] Wang Tianzheng,Ryan Johnson和Ippokratis Pandis。新鲜查询:类固醇的日志传送。 VLDB 2018。

CoroBase使用mmap和MAP_HUGETLB(在Linux 2.6.32之后可用)来分配大页面。几乎所有内存分配都来自此处确定的空间。假设默认的大页面大小为2MB,下面的命令将分配2x MB的内存:

我们不允许在源目录中进行构建。假设我们在一个单独的目录中构建:

当前代码可以在Clang 8.0+下编译。例如,要使用Clang 8.0,请改为发出以下cmake命令:

ermia_SI运行带有快照隔离(不可序列化)的CoroBase(优化的2级协程到事务设计)和ERMIA;

$ run.sh \ [可执行文件] \ [基准] \ [比例因子] \ [线程数] \ [持续时间(秒)] \" [其他系统范围的运行时选项]" \" [其他特定于基准测试的运行时选项]"`

顺序(基线):$。/ run.sh ./ermia_SI ycsb 10 48 20 \" -physical_workers_only = 1 -index_probe_only = 1 -node_memory_gb = 75 -null_log_device = 1" \" -w C -r 10 -s 1000000000 -t连续" CoroBase(优化的2级协程到事务设计)$。/ run.sh ./ermia_SI ycsb 10 48 20 \&#34 ; -physical_workers_only = 1 -index_probe_only = 1 -node_memory_gb = 75 -null_log_device = 1 -coro_tx = 1 -coro_batch_size = 8" \" -w C -r 10 -s 1000000000 -t simple-coro" CoroBase(完全嵌套的协程到事务设计)$。/ run.sh ./ermia_adv_coro_SI ycsb 10 48 20 \&# 34; -physical_workers_only = 1 -index_probe_only = 1 -node_memory_gb = 75 -null_log_device = 1 -coro-tx = 1 -coro_batch_size = 8" \" -w C -r 10 -s 1000000000 -t adv-coro"基于协程的multiget(扁平协程)$。/ run.sh ./ermia_SI ycsb 10 48 20 \" -physical_workers_only = 1 -index_probe_only = 1 -node_memory_gb = 75 -null_log_device = 1" \" -w C -r 10 -s 1000000000 -t multiget-simple-coro"基于协程的multiget(完全嵌套的协程)$。/ run.sh ./ermia_adv_coro_SI ycsb 10 48 20 \&# 34; -physical_workers_only = 1 -index_probe_only = 1 -node_memory_gb = 75 -null_log_device = 1 -coro_tx = 1" \" -w C -r 10 -s 1000000000 -t multiget-adv-coro"基于AMAC的multiget $。/ run.sh ./ermia_SI ycsb 10 48 20 \" -physical_workers_only = 1 -index_probe_only = 1 -node_memory_gb = 75 -null_log_device = 1" \" -w C -r 10 -s 1000000000 -t multiget-amac"

-null_log_device:将日志缓冲区刷新到/ dev / null。拥有30个以上的线程,由于刷新期间保持内核互斥,日志刷新(甚至到tmpfs)很容易成为瓶颈。此选项不会禁用日志记录,但是会使恢复功能失效。

急切:在恢复过程中加载所有最新版本,以便数据库在开始处理新事务时完全处于内存中;

惰性:启动后在后台启动线程以在后台加载版本,因此数据库在开始处理新事务时处于部分内存状态。 -t顺序:'顺序' 对于ERMIA实施,' simple-coro' 用于优化的2级协程到事务的实现,以及' adv-coro' 用于完全嵌套的协程实现。