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个文件,具体改动列表见下图:


在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产品project师,基本的研究方向包含KVM、Virtio等虚拟化技术,最擅长的是PCIe SSD在KVM的虚拟化场景中的优化。Luna之前的一篇文章《QEMU-KVM I/O性能优化之Virtio-blk-data-plane》具体分析了Virtio-blk-data-plane技术原理,并通过測试展示了其性能优势。
posted on 2017-08-03 08:10  blfbuaa  阅读(580)  评论(0编辑  收藏  举报