在前一篇文章《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个文件,详细修改列表见下图:
在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 驱动代码修改大致如下:
结语
上层应用业务虽然大部分是异步模式的,但对于基于同步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技术原理,并通过测试展示了其性能优势。