IO-Polling的代码分析


在前一篇文章《IO-Polling实现分析与性能评测》中提到了IO-Polling与中断的原理区别,并通过两种模式下NVMe SSD的性能测试对两者进行了对比。这篇文章将深入到IO-Polling的代码层面,对这一IO处理模式进行一个解读。

IO-Polling模式已经加入了linux 4.4的内核,并已有多个成员组在测试IO-Polling对快速设备的性能影响。目前的IO-Polling仅支持direct-IO的sync模式读写操作,后期将加入对libaio的IO-Polling的支持,详细见下图git log信息。

\

IO-Polling的代码分析

本文基于linux内核4.4版本,简单分析支持IO-Polling模式内核块设备层,文件系统以及底层NVMe驱动所修改修改的大致内容。4.4版linux内核的IO-Polling共修改33个文件,详细修改列表见下图:<喎?http://www.Bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+PGltZyBzcmM9"http://www.2cto.com/uploadfile/Collfiles/20160331/20160331090346290.png" alt="\">

在block/blk-core.c中主要新增blk-poll函数,用以支持polling模式。在blk-poll函数中,如果底层驱动不支持mq或者mq中不支持polling模式,则会返回上层,采用中断模式。如果底层驱动支持mq的polling模式,则调用底层驱动的poll函数进行IO处理,详细函数内容见下图。
\

在block/blk-mq-sysfs.c以及block/blk-sysfs.c文件中,增加了sys文件系统对io-poll参数的支持

\\

在block/blk-mq.c文件中,修改各个函数增加对poll逻辑的处理。

\


除以上对通用块设备层的修改,各个IO设备要支持polling模式,还需要对各自的设备进行部分修改。以NVMe 设备为例,NVMe 驱动源码中增加nvme_poll函数,在注册是挂载到block层,当上层以polling模式访问NVMe 设备时,驱动将调用nvme_poll函数,而不再走中断模式。NVMe 驱动代码修改大致如下:

\

而在文件系统层fs/direct-io.c中,direct-io的有关函数的已修改支持polling,实际测试中polling只有在direct_io中才起作用,buffer_io模式下,IO模式依然采用中断方式。前一篇文章中仅提供了裸设备polling模式性能数据,对于文件系统的polling模式将在后期对此做详细分析。

结语

上层应用业务虽然大部分是异步模式的,但对于基于同步IO,并且对延迟非常敏感小部分关键业务而言,IO-Polling所带来的延迟收益也是有巨大帮助的。同时,linux内核也在不断进化过程中,异步模式Polling也将加入。随着高速存储设备的发展,IO-Polling的工作模式对延迟敏感型业务将发挥更大的作用。

本文作者Luna是Memblaze产品工程师,主要的研究方向包括KVM、Virtio等虚拟化技术,最擅长的是PCIe SSD在KVM的虚拟化场景中的优化。Luna之前的一篇文章《QEMU-KVM I/O性能优化之Virtio-blk-data-plane》详细分析了Virtio-blk-data-plane技术原理,并通过测试展示了其性能优势。

相关内容