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信息。
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的代码分析的更多相关文章
- 手机自动化测试:Appium源码分析之跟踪代码分析八
手机自动化测试:Appium源码分析之跟踪代码分析八 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家 ...
- pmd静态代码分析
在正式进入测试之前,进行一定的静态代码分析及code review对代码质量及系统提高是有帮助的,以上为数据证明 Pmd 它是一个基于静态规则集的Java源码分析器,它可以识别出潜在的如下问题:– 可 ...
- 常用 Java 静态代码分析工具的分析与比较
常用 Java 静态代码分析工具的分析与比较 简介: 本文首先介绍了静态代码分析的基 本概念及主要技术,随后分别介绍了现有 4 种主流 Java 静态代码分析工具 (Checkstyle,FindBu ...
- JavaBean 基础概念、使用实例及代码分析
JavaBean 基础概念.使用实例及代码分析 JavaBean的概念 JavaBean是一种可重复使用的.且跨平台的软件组件. JavaBean可分为两种:一种是有用户界面的(有UI的):另一种是没 ...
- Linux内核中的GPIO系统之(3):pin controller driver代码分析
一.前言 对于一个嵌入式软件工程师,我们的软件模块经常和硬件打交道,pin control subsystem也不例外,被它驱动的硬件叫做pin controller(一般ARM soc的datash ...
- 来试试这个来自静态代码分析工具PVS Studio提供C++的小测验吧
博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:来试试这个来自静态代码分析工具PVS Studio提供C++的小测验吧.
- Linux内核启动代码分析二之开发板相关驱动程序加载分析
Linux内核启动代码分析二之开发板相关驱动程序加载分析 1 从linux开始启动的函数start_kernel开始分析,该函数位于linux-2.6.22/init/main.c start_ke ...
- 手机自动化测试:Appium源码分析之跟踪代码分析六
手机自动化测试:Appium源码分析之跟踪代码分析六 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.poptest推出手机自 ...
- 学生管理系统开发代码分析笔记:jsp+java bean+servlet技术
1 序言 学习java web的时候很渴望有一份完整的项目给我阅读,而网上的大部分项目拿过来都无法直接用,好不容易找到了一个学生管理系统也是漏洞百出.在此,我将边修改边学习这份代码,并且加上完全的注释 ...
随机推荐
- 常见配置Server错误导致import 包无效等问题解决
- Python数据整合与数据准备-BigGorilla应用
一.前言 要应用BigGorilla框架对应数据进行数据的处理与匹配,那么首先要下载Anaconda安装,下载地址:https://www.continuum.io/downloads Anacond ...
- More is better——并查集求最大集合(王道)
Description Mr Wang wants some boys to help him with a project. Because the project is rather comple ...
- 从C转到JAVA学习路之struct与class对比(转)
转自:http://blog.csdn.net/andywxf01/article/details/53506549 JAVA里最牛B的最基本的就是类,而C语言中的struct也可以定义自己的数据结构 ...
- ZOJ 3526 Weekend Party
Weekend Party Time Limit: 2 Seconds Memory Limit: 65536 KB As the only Oni (a kind of fabulous ...
- 怎么成为PHP专家
当阅读各种和PHP相关的博客.Quora问题.Google+社区.资讯和杂 志的时候,经常会注意到在技术上出现两极分化的现象.问题均围绕在“我如何连接到一个MySQL数据库?”,或者是“我如何使得邮件 ...
- js 上传图片进行回显
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 如何注册ocx文件
32位系统: 将文件放到c:\windows\system目录注册 运行:Regsvr32 c:\windows\system\xxx.ocx取消注册运行:Regsvr32.exe /u c:\win ...
- Selenium webdriver Java 封装与重用
目的 1. 简化调用 WebDriver对页面的操作,需要找到一个WebElement,然后再对其进行操作,比较繁琐: WebElement element =driver.findElement(B ...
- java IO,bufferedReader类
1,掌握bufferedreader类作用 2,掌握键盘输入的基本格式. Buffer:表示缓冲区,之前的StringBuffer,缓冲区中的内容可以更改,可以提高效率. 如果要想接收任意长度的数据, ...