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的时候很渴望有一份完整的项目给我阅读,而网上的大部分项目拿过来都无法直接用,好不容易找到了一个学生管理系统也是漏洞百出.在此,我将边修改边学习这份代码,并且加上完全的注释 ...
随机推荐
- Yii2系列教程四:实现用户注册,验证,登录
上一篇写了一点点Yii2的数据库相关知识和强大的Gii,这一篇就如上一篇的最后所说的一样:在Yii2中实现用户的注册和登录. 你可以直接到Github下载源码,以便可以跟上进度,你也可以重头开始,一步 ...
- Yii2系列教程二:MVC,Forms和Layouts
上一篇文章我们简单地实现了Yii2框架安装和Hello World,而在这一篇文章当中,我们会带着好奇之心去探索一下在Yii2中的几个重要的元素组成:MVC,Forms和Layouts. 本文的目标是 ...
- POJ 3083:Children of the Candy Corn(DFS+BFS)
Children of the Candy Corn Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9311 Accepted: ...
- 工作流学习——Activiti流程变量五步曲
一.前言 上一篇文章我们将流程实例的启动与查询,任务的办理查询都进行了介绍,我们这篇文章来介绍activiti中的流程变量. 二.正文 流程变量与我们寻常理解的变量是一样的,仅仅只是是用在了我们act ...
- centos下hadoop的安装
hadoop的安装不难,可是须要做不少的准备工作. 一.JDK 须要先安装jdk.centos下能够直接通过yum install java-1.6.0-openjdk来安装.不同公布版的安装 ...
- 【Dos】Dos命令大全
dos命令大全 AT 计划在计算机上运行的命令和程序.ATTRIB 显示或更改文件属性.BREAK 设置或清除扩展式 CTRL+C 检查.CACLS 显示或修改文件的访问控制列表(ACLs).CALL ...
- 移动负载均衡技术(MBL)
移动负载均衡技术(MBL) 转至元数据结尾 附件:5 被admin添加,被admin最后更新于四月 27, 2015 转至元数据起始 互联网技术发展到今天,已经进入移动时代,很多在传统CS和BS的 ...
- jQuery框架源码解读
1.jQuery 1.9.1 parseJSON: function( data ) { // Attempt to parse using the native JSON parser first ...
- Android布局中match_parent和fill_parent的差别
今天在做项目的一个新功能的时候,从网上查找资源,发现android2.2中出现的MATCH_PARENT感到不明确.过去仅仅有FILL_PARENT和WRAP_CONTENT那么match_paren ...
- JS 自动计算HTML的font-size
Rem尺寸解决方案,需要配合一些js动态设置<html>标签的font-size 和 viewport来配合 <script> (function(doc, win) { va ...