在前一篇文章《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. scrapy-splash抓取动态数据例子十四

    一.介绍 本例子用scrapy-splash爬取超级TV网站的资讯信息,输入给定关键字抓取微信资讯信息. 给定关键字:数字:融合:电视 抓取信息内如下: 1.资讯标题 2.资讯链接 3.资讯时间 4. ...

  2. 虚拟机oracle virtualbox 上安装centos6.5 网络设置

    上篇文章写到,在虚拟机上安装centos6.5,结果依照文章非常顺利的安装了,可是用yum安装软件的时候.报错,源有问题,不能下载,然后ping一下摆渡.非常悲催 dns解析不了,cat /etc/r ...

  3. Apache 配置:是否显示文件列表

    Apache 配置:是否显示文件列表 进入虚拟主机配置文件 显示文件列表的话 options Indexes FollowSymLinks 不显示文件列表的话 options FollowSymLin ...

  4. hdu 4723 How Long Do You Have to Draw(贪心)

    How Long Do You Have to Draw Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ( ...

  5. JDBC数据库常用操作(mysql)

    JDBC英文名称:JavaDataBaseConnectivity中文名称:java数据库连接简称:JDBCJDBC是一种用于执行SQL语句的JavaAPI,可以为多种关系数据库提供统一访问,它由一组 ...

  6. C-C Primer Plus阅读笔记

    常用头: stdio.h string.h inttypes.h limits.h float.h 1.打印short.long.long long和unsigned #include <std ...

  7. 【MyBatis学习15】MyBatis的逆向工程生成代码

    1. 什么是逆向工程 mybatis的一个主要的特点就是需要程序员自己编写sql,那么如果表太多的话,难免会很麻烦,所以mybatis官方提供了一个逆向工程,可以针对单表自动生成mybatis执行所需 ...

  8. Matlab、R向量与矩阵操作

    Matlab.R向量与矩阵操作   描    述 Matlab R 1 建立行向量v=[1 2  3 4] v=[1 2 3 4] v<-c(1,2,3,4)或v<-scan(),然后输入 ...

  9. gm picture

    console.log("ok") /*var images = require("images");var fs = require("fs&quo ...

  10. 如何高效利用github提升自己

    作为开源代码库以及版本控制系统,Github拥有超过900万开发者用户,是开发者打开程序开源大门的一扇窗口,也是开发者快速提升自己的一个重要途径.本文将从两个方面介绍github的使用方式. 和逛微博 ...