Flash的出现把存储的世界搅翻了天,仿佛一夜之间发现了新大陆,所有旧世界的东西都变得笨拙。NVMe驱动义无反顾地抛弃了Linux blk,开发自己的队列管理。

当第一次看到NVMe重新使用Linux Block队列管理blk-mq的时候,还是比较惊讶的:现在的NVMe工作的好好的,为什么要换,增加blk-mq会不会造成性能下降?相信很多人都有这个疑惑。刚好手上有个centos7.2环境,我们就来一探究竟:

上图是我按NVMe是否使用blk-mq做的简单测试,可以看到,从Latency和IOPS两个方面都没有较大变化,说明blk-mq的引入带来的overhead非常小。那么blk-mq是怎么做到的呢?

就从blk-mq的那篇paper说起吧。在<Linux Block IO: Introducing Multi-queue SSD Access on Multi-core Systems>中,作者着重强调了之前single-queue的缺陷(多核竞争访问引入锁,跨NUMA中断处理,跨NUMA内存访问),非常不适合为现代的多路服务器高性能介质服务。痛定思痛,在blk-mq中对这方面大做修改。

blk-mq引入了两层Queue的概念,Software Queue和 Hardware Queue。这样的设计有多个目的:

1,在Software Queue中把Queue的数量设置死(与Core数量相等或者与MUMA 数量相等),这样就不会产生竞争了

2,Hardware数量由底层驱动决定,可以是一个或者多个;这也是为了尽快和之前的SATA SAS使用的单队列兼容

3,在software Queue里把 I/O Scheduling等Block积累几十年的Feature用起来,与底层驱动的联系由Hardware Queue负责。

那Software Queue和Hardware Queue的数量应该是多少呢?作者用实验给出了答案:如下在每个Core上发送相同数量的I/O,然后测试不同Hardware Queue和Software Queue的数量对性能产生的影响。

单个Software Queue的情况下,无论Hardware Queue是多少,性能都很差!

每个Core配一个Software Queue的情况下,Hardware Queue与Software Queue相等的情况下最好(core少的情况下跟NUMA一样也取得不错的性能)!

当然,这个测试也有一定的局限性,就是在单个Queue的情况下,测了最差的情况(所有的Core都去访问一个Queue)。


由于NVMe本身就是Multi-Queue的设计,跟这种队列配合起来还是比较容易的。只要将Hardware Queue和NVMe Queue一一对应就行。要移植NVMe到blk-mq最主要的工作就是定义下面的结构体。

第一个成员queue_rq指定blk-mq向驱动提交request的函数,第二个map_queue定义如何将software queue和hardware queue对应,第三个init_hctx是hardware Queue创建时调用(可以在这里将NVMe Queue与Hardware Queue绑定),init_request是在分配Request时调用,timeout是发生timeout时的调用。这些函数都是供blk-mq使用的。

blk-mq通过一个blk_mq_tag_set结构体来定义队列组合(可以指定timeout值,iodepth和hardware queue的个数等)。NVMe驱动在每一个设备加载时就定义一个这样的对象,然后在分配namespace的时候使用ns->queue = blk_mq_init_queue(&dev->tagset)给每个Namespace分配一个队列(request_queue 类型,包含hardware queue和software queue信息)。

下面是NVMe驱动定义的Hardware Queue初始化时的调用函数,可以看到将NVMe Queue赋给了Hardware Queue的driver_data。

当blk-mq下发Request的时候,会传递Hardware Queue对象,通过取出hardware Queue的driver_data,就可以得到Request对应的nvme queue了。

所以,用了blk-mq,NVMe驱动再也不用管request要放到哪个NVMe Queue了,而且I/O timeout,I/O统计这些都可以交给blk干。最重要的,还能够享受blk的IO scheduling 等功能。并入blk-mq后,NVMe驱动轻松了很多,性能有很好,对于开发者来说,何乐而不为?

参考文献

Linux Block IO: Introducing Multi-queue SSD Access on Multi-core Systems

提示

本文选自公众号《存储技术最前线》,欢迎关注获取最新文章。

往期NVMe驱动文章回顾

NVMe驱动解析-注册设备

NVMe驱动解析-关键的BAR空间

NVMe驱动解析-DMA传输

NVMe驱动解析-响应I/O请求

强势回归,Linux blk用实力证明自己并不弱!的更多相关文章

  1. 《Bluez 》Beta版强势回归!!!

    Bluez .Beta 巅峰塔防 强势回归! Z.XML为您呈现 经过了第二轮迭代,我们骄傲的宣布,Bluez Beta版本,正式发布. 下载地址:-> 第二轮的迭代是辛苦的,但是不同于其他队伍 ...

  2. 幻世(OurDream)2D图形引擎大更新——炫丽粒子特效强势回归!

    本次更新终于让各位期待已久的绚丽粒子系统特效强势回归到幻世当中了.凭借新引擎强大而又高效的绘图,新的粒子系统将比旧有版本(原Ycnd 2D)在性能上有极大幅度的增强,增幅超过十倍! 更强的性能!更好的 ...

  3. 重磅:谷歌强势回归! google大会报名

    google退出中国已经很久了,有关google回归的消息也流传了很久,今天,我们迎来了回归的开幕式. 1.中国区开发者网站 不需要梯子,赶紧取感受下吧: https://developers.goo ...

  4. 万星开源项目强势回归「GitHub 热点速览 v.22.38」

    本周霸榜的 GitHub 项目多为老项目,比如:老面孔的 theatre 凭借极其优秀的动画功底连续三天霸榜 TypeScript 类目.借 Figma 被 Adobe 收购之风,又出现在 GitHu ...

  5. 文章汇总(包括NVMe SPDK vSAN Ceph xfs等)

    基础部分 NVMe驱动解析-前言 NVMe驱动解析-注册设备 NVMe驱动解析-关键的BAR空间 NVMe驱动解析-DMA传输(热门) NVMe驱动解析-响应I/O请求 用一个简单的例子窥探NVMe的 ...

  6. 为什么 Linux Mint 比 Ubuntu好?

    Linux Mint由Linux Mint Team团队于2006年开始发行,是一份基于Debian和Ubuntu的Linux发行版.其目标是提供一种更完整的即刻可用体验,这包括提供浏览器插件.多媒体 ...

  7. React Native填坑之旅 -- 回归小插曲

    回归RN,非常开心啊! 在React Native 0.49.5上开发,直接遇到一个ios模拟器的问题.这个问题很简单就是Bundle URL not present. 在网上找了很多的解决方法,都不 ...

  8. 使用Linux工作之Fedora KDE

    小明拿着在Windows下不断蓝屏的T440和公司建议不使用云笔记的规定,心下想着,是时候回归linux了... 一.系统的获取与启动盘的制作 fedora20 KDE版 liveusb-creato ...

  9. Linux mint 17.3系统安装及常用开发办公软件部署

    关于为什么选择linuxmint17.3作为个人办公开发系统的选择说明: 编者按]提起Linux系统,大家可能最先想到的就是 Linux Mint 和 Ubuntu 两个版本了.近来,开源界貌似激进了 ...

随机推荐

  1. Object.prototype 与 Function.prototype 与 instanceof 运算符

    方法: hasOwnProperty isPrototypeOf propertyIsEnumerable hasOwnProperty 该方法用来判断一个对象中的某一个属性是否是自己提供的( 住要用 ...

  2. JAVA Web day03--- Android小白的第三天学习笔记

    3.5.6.Math对象(了解) 无需创建,直接Math.方法来进行使用.(内置对象) Math方法 random() 随机生成0~1数字 round(x) 对X进行四舍五入 3.5.7.RegExp ...

  3. SQL函数创建错误

    [Err] 1418 - This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration a ...

  4. 《剑指offer》面试题11: 数值的整数次方

    面试题11: 数值的整数次方 剑指offer面试题11,题目如下 实现函数double power(double base,int exponent),求base的exponent次方, 不得使用库 ...

  5. 2016年JS面试题目汇总

    1.怎样添加.移除.移动.复制.创建和查找节点? //1)创建新节点 createDocumentFragment() //创建一个DOM片段 createElement() //创建一个具体的元素 ...

  6. css 文本气泡样式

    1.简易气泡 eg: html部分: <div class="bubble">我是气泡文本</div> css部分: //小三角.bubble:before ...

  7. React(JSX语法)----JSX拼写

    注意:For DOM differences,such as the inline style attribute,check here. // bad: it displays "FIrs ...

  8. 转载《Android LayoutInflater详解》

    在实际开发中LayoutInflater这个类还是非常有用的,它的作用类似于findViewById().不同点是LayoutInflater是用来找res/layout/下的xml布局文件,并且实例 ...

  9. HTTP请求 GET POST 网络编程实现

      HTTP请求 GET POST 网络编程实现(转) 原文地址 http://bbs.neworigin.net/forum.php?mod=viewthread&tid=488 在开发网络 ...

  10. HDU2647

    第一道逆拓扑纪念一下... #include<iostream> #include<cstdio> #include<cstring> #include<cm ...