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. ZOJ 3911 线段树

    题意:有N个数字,M个操作,然后回答每个Q开头的询问 操作形式: A val pos:在pos位置上+val Q l r:询问l~r之间有多少个质数 R val l r:把l~r之间的数字替换成val ...

  2. 判断是否存在哈密顿路--HDU 5424

    题意:给一张无向图,判断是否是哈密顿图. 哈密顿路:经过每个点有且仅有一次的一条通路. 方法:每次找度数最小的点作为起点,然后dfs整个图,看能遍历到的点的数目能否达到n. #include<i ...

  3. SVN 服务启动报错 0x8007042a

    服务器环境:Windows Server 2008 R2 企业版,Visual SVNServer 2.6.5 不能签出代码,发现svn服务关闭,手动启动报错: 事件查看器: Error: no li ...

  4. mongodb C# 驱动查询

    INoSqlProvider provider = NoSqlManager.Create("CloudTable"); IMongoCollection<FormMongo ...

  5. SDK截图程序(一)

    程序将系统窗口左上角100*100的图像复制到粘贴板上.程序的关键位置上加上了注释,相关知识<windows程序设计>第14章内容 #include <windows.h> # ...

  6. win7绕过开机密码攻略

    访问windows机器,经常会因为忘记了开机密码而苦恼.当然你也可以选择重装,这样最简单粗暴.如果有重要数据保存在C盘之类的(个人严重推荐不要保存到C盘),那就不是重装能解决的问题了.2014年12月 ...

  7. ubuntu14.04 下emacs 24 配置

    目的: 配置emacs 24 适合编程开发 主要参考JerryZhang的配置(Emacs 简易教程) http://www.perfect-is-shit.com/emacs-simple-tuto ...

  8. 用sql语句建表

    CREATE TABLE USER (id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, NAME VARCHAR(30) NOT NULL, p ...

  9. HDU 3342 Legal or Not(判断是否存在环)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3342 Legal or Not Time Limit: 2000/1000 MS (Java/Othe ...

  10. 转:在Android中使用AlarmManager

    原地址http://blog.csdn.net/maosidiaoxian/article/details/21776697 AlarmManager是Android中的一种系统级别的提醒服务,它会为 ...