1.论文概述
当前NVMe存储设备的出现可以达到微秒级,Linux内核系统调用以及块存储设备所产生的开销的比例也明显上升.
2.背景和动机

新一代的NVMe中软件和硬件的开销几乎一致
存储io操作

内核上下文切换消耗351纳秒占总开销的5.6%
应用程序执行读取的系统调用开销199纳秒占总开销3.2%
ext4文件系统开销2006纳秒占比32%
bio阻塞等待存储设备响应的开销379纳秒占比6%
NVMe驱动113纳秒占比1.8%
存储设备硬件响应开销3224纳秒占用比51.4%
得出的结论
软件开销占50%左右,其中文件系统占32%,另外由于bio和用户空间和内核空间切换也占了20%的开销
3.XRP方案
paper提出了XRP的方案,合并软件栈,消除内核态和用户态的开销.
paper中提到使用eBPF将用户态的处理逻辑放入内核太的NVMe驱动层,从而无需从用户态与内核态切换,只在内核态处理

上图中黄色箭头是应用调用链路, 蓝色箭头是系统调用链路, 红色是NVMe驱动调用链路
收益
在传统的bio的场景下调用链路与黄色相同,会有内核与用户态上下文的切换开销,文件系统以及bio阻塞开销,NVMe协议以及设备开销
在使用io_uring的场景下调用链路会小于蓝色链路,没有上下文切换的开销和bio阻塞,但是会有文件系统开销,NVMe协议以及设备开销
在使用eBPF的场景下调用链路与红色链路相同,没有上下文切换/bio阻塞/文件系统开销,只有NVMe协议以及设备开销

三种调用链路对比
用户态应用程序调用延迟78微秒,吞吐109K IOPS,速度倍率为1倍
使用io_uring在内核与用户态使用mmap映射相同地址空间,调用延迟68微秒,吞吐130K IOPS,速度倍率为1.2倍
使用eBPF调用延迟40微秒,吞吐276K IOPS,速度倍率为2.5倍
应用
限制
同时eBPF方案会带来一些问题,由于NVMe驱动层无法访问文件系统以及内核缓存,page cache会失效,因此对于多数应用程序并不适用.但是对于数据库应用来说就不是这样的情况,多数的数据库应用不并使用内核的page cache,而是采用带有o_direct的DirectIO.
引用