Asynchronous I/O Stack: A Low-latency Kernel I/O Stack for Ultra-Low Latency SSDs

Asynchronous I/O Stack: A Low-latency Kernel I/O Stack for Ultra-Low Latency SSDs

名词解释

fsync: 是一个用于文件同步的系统调用。它的作用是将缓冲区中的数据写入磁盘,并确保文件系统中的元数据(如inode、目录信息等)也被刷新到磁盘上。这样可以保证文件的内容和元数据在磁盘上是同步的,避免了数据丢失或者不一致的情况。需要注意的是,由于 fsync 是一个同步的系统调用,它会引起 IO 操作的延迟,因为它会等待数据写入磁盘完成。如果频繁地调用 fsync,可能会导致性能下降。因此,在使用 fsync 时需要权衡数据的可靠性和性能的需求。

IO栈: Linux 的IO栈 - 知乎 (zhihu.com)

LBA寻址:逻辑块寻址模式,在LBA地址中,地址不再表示实际硬盘的实际物理地址(柱面、磁头和扇区)。LBA编址方式将 CHS这种三维寻址方式转变为一维的线性寻址,它把硬盘所有的物理扇区的C/H/S编号通过一定的规则转变为一线性的编号,系统效率得到大大提高,避免了 烦琐的磁头/柱面/扇区的寻址方式。在访问硬盘时,由硬盘控制器再这种逻辑地址转换为实际硬盘的物理地址。

背景

现代的超低延迟的固态硬盘的I/O延迟在10微秒以内,操作系统中的I/O栈成为了阻碍系统性能的瓶颈。有两种方法解决该问题,一个是使得线程能够直接访问存储设备,但是这样会对应用带来很多额外的负担,比如需要应用程序有自己的块管理层或者文件系统。另一个是优化内核中的I/O栈。作者因此提出了异步I/O堆栈(AIOS)来解决问题。

Lightweight Block I/O Layer

images

说明: 一个轻量级的块I/O层(或LBIO),这是现有多队列块层的一个可扩展的轻量级替代方案。LBIO专为低延迟NVMe ssd设计,仅支持I/O提交/完成和I/O命令标记。与原始的多队列块层不同,LBIO使用单个内存对象LBIO来表示单个块I/O请求,从而消除了原始块层中耗时的从块到请求的转换。减少了I/O的提交延迟

Read Path 方面

images

作者主要是阐述了普通的读路径是一个串行的执行过程,发现在超低延迟的ssd情况下,device time占的比例较少,将这个同步过程优化成为异步过程。

优化1: 在读文件的时候将这个文件所有页面的映射信息都被加载到内存中,避免由映射缓存丢失引起的延迟。缓存整个树的内存成本可能很高;在评估中,最坏情况下的开销是文件大小的0.03%。可以选择性地将此技术应用宇需要低延迟访问的文件。

优化2: 空闲页的准备,在原始的读操作中,内核的页面分配器会消耗很多CPU周期,将这些操作从关键路径中移出,并在设备I/O操作发生时执行

优化3: 将页插入到页缓存索引结构这个操作与设备I/O操作重叠,同时解决可能重复的I/O提交。

优化4: 将DMA映射操作延迟到系统空闲或等待另一个I/O请求时

Write and fsync Path

images

优化1: 将日志记录线程中的计算部分与相同写路径中的先前I/O操作重叠。

测试结果

images

AIOS-poll表示AIOS方案不使用中断,而是使用轮询作为其I/O完成方法,轮询在延迟方面优于中断,因为它消除了上下文切换。

总结

因此作者提出了一种新的异步I/O堆栈(AIOS),综合FIO基准测试表明,在Optane SSD上随机读取4 KB时,应用程序感知的I/O延迟降至个位数微秒,并且在不同块大小的情况下,总体I/O延迟减少了15-33%。这种I/O延迟的减少也导致了实际应用程序的显著性能提高:RocksDB的IOPS提高了11-44%,Filebench和OLTP工作负载的吞吐量提高了15-30%。