在前一篇文章《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信息。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

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逻辑的处理。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

除以上对通用块设备层的改动,各个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技术原理,并通过測试展示了其性能优势。

IO-Polling的代码分析的更多相关文章

  1. 手机自动化测试:Appium源码分析之跟踪代码分析八

    手机自动化测试:Appium源码分析之跟踪代码分析八   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家 ...

  2. pmd静态代码分析

    在正式进入测试之前,进行一定的静态代码分析及code review对代码质量及系统提高是有帮助的,以上为数据证明 Pmd 它是一个基于静态规则集的Java源码分析器,它可以识别出潜在的如下问题:– 可 ...

  3. 常用 Java 静态代码分析工具的分析与比较

    常用 Java 静态代码分析工具的分析与比较 简介: 本文首先介绍了静态代码分析的基 本概念及主要技术,随后分别介绍了现有 4 种主流 Java 静态代码分析工具 (Checkstyle,FindBu ...

  4. JavaBean 基础概念、使用实例及代码分析

    JavaBean 基础概念.使用实例及代码分析 JavaBean的概念 JavaBean是一种可重复使用的.且跨平台的软件组件. JavaBean可分为两种:一种是有用户界面的(有UI的):另一种是没 ...

  5. Linux内核中的GPIO系统之(3):pin controller driver代码分析

    一.前言 对于一个嵌入式软件工程师,我们的软件模块经常和硬件打交道,pin control subsystem也不例外,被它驱动的硬件叫做pin controller(一般ARM soc的datash ...

  6. 来试试这个来自静态代码分析工具PVS Studio提供C++的小测验吧

    博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:来试试这个来自静态代码分析工具PVS Studio提供C++的小测验吧.

  7. Linux内核启动代码分析二之开发板相关驱动程序加载分析

    Linux内核启动代码分析二之开发板相关驱动程序加载分析 1 从linux开始启动的函数start_kernel开始分析,该函数位于linux-2.6.22/init/main.c  start_ke ...

  8. 手机自动化测试:Appium源码分析之跟踪代码分析六

    手机自动化测试:Appium源码分析之跟踪代码分析六   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.poptest推出手机自 ...

  9. 学生管理系统开发代码分析笔记:jsp+java bean+servlet技术

    1 序言 学习java web的时候很渴望有一份完整的项目给我阅读,而网上的大部分项目拿过来都无法直接用,好不容易找到了一个学生管理系统也是漏洞百出.在此,我将边修改边学习这份代码,并且加上完全的注释 ...

随机推荐

  1. python合并多个csv文件并去重

    #coding=utf-8 import os import pandas as pd import glob def hebing(): csv_list = glob.glob('*.csv') ...

  2. onbeforepaste事件用法

    onkeyup="value=value.replace(/[^\d]/g,'')" onbeforepaste="clipboardData.setData('text ...

  3. @Autowired与@Resource的使用方法和差别

    一.@Autowired: 1.Spring 2.5 引入了 @Autowired 凝视,它能够对类成员变量.方法及构造函数进行标注,完毕自己主动装配的工作. 通过 @Autowired的使用来消除 ...

  4. Linq的日期比较

    在一个项目中要进行linq的日期比较,从一个表的时间类型字段中取出日期,比较是否为当天日期.语句如下: epark_middlelayerEntities eparkMiddle = new epar ...

  5. jquery autoComplete的使用代码一则

    $(function() { $("#vipCustomer").autocomplete({ source : function(request, response) { $.a ...

  6. mysql调用存储过程出现Illegal mix of collations错误

    执行sql语句正常 执行存储过程 异常 提示 Illegal mix of collations (utf8_general_ci,IMPLICIT) and (utf8_unicode_ci,IMP ...

  7. Redis之ziplist数据结构

    0.前言 redis初始创建hash表,有序集合,链表时, 存储结构采用一种ziplist的存储结构, 这种结构内存排列更紧密, 能提高访存性能. 本文介绍ziplist数据结构 1.ziplist存 ...

  8. 王立平--Eclipse中配置svn

    1.-------------------------------------------------------------------------------------------------- ...

  9. Quarta介绍

    环境:XP+Myeclipse6.5+JDK1.6 quartz官网:http://www.quartz-scheduler.org/ 参考资料 1 Quartz任务调度快速入门 http://www ...

  10. 李洪强-CALayer4-自定义层

    自定义层,其实就是在层上绘图,一共有2种方法,下面详细介绍一下. 一.自定义层的方法1 方法描述:创建一个CALayer的子类,然后覆盖drawInContext:方法,使用Quartz2D API进 ...