强势回归,Linux blk用实力证明自己并不弱!
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驱动文章回顾

强势回归,Linux blk用实力证明自己并不弱!的更多相关文章
- 《Bluez 》Beta版强势回归!!!
Bluez .Beta 巅峰塔防 强势回归! Z.XML为您呈现 经过了第二轮迭代,我们骄傲的宣布,Bluez Beta版本,正式发布. 下载地址:-> 第二轮的迭代是辛苦的,但是不同于其他队伍 ...
- 幻世(OurDream)2D图形引擎大更新——炫丽粒子特效强势回归!
本次更新终于让各位期待已久的绚丽粒子系统特效强势回归到幻世当中了.凭借新引擎强大而又高效的绘图,新的粒子系统将比旧有版本(原Ycnd 2D)在性能上有极大幅度的增强,增幅超过十倍! 更强的性能!更好的 ...
- 重磅:谷歌强势回归! google大会报名
google退出中国已经很久了,有关google回归的消息也流传了很久,今天,我们迎来了回归的开幕式. 1.中国区开发者网站 不需要梯子,赶紧取感受下吧: https://developers.goo ...
- 万星开源项目强势回归「GitHub 热点速览 v.22.38」
本周霸榜的 GitHub 项目多为老项目,比如:老面孔的 theatre 凭借极其优秀的动画功底连续三天霸榜 TypeScript 类目.借 Figma 被 Adobe 收购之风,又出现在 GitHu ...
- 文章汇总(包括NVMe SPDK vSAN Ceph xfs等)
基础部分 NVMe驱动解析-前言 NVMe驱动解析-注册设备 NVMe驱动解析-关键的BAR空间 NVMe驱动解析-DMA传输(热门) NVMe驱动解析-响应I/O请求 用一个简单的例子窥探NVMe的 ...
- 为什么 Linux Mint 比 Ubuntu好?
Linux Mint由Linux Mint Team团队于2006年开始发行,是一份基于Debian和Ubuntu的Linux发行版.其目标是提供一种更完整的即刻可用体验,这包括提供浏览器插件.多媒体 ...
- React Native填坑之旅 -- 回归小插曲
回归RN,非常开心啊! 在React Native 0.49.5上开发,直接遇到一个ios模拟器的问题.这个问题很简单就是Bundle URL not present. 在网上找了很多的解决方法,都不 ...
- 使用Linux工作之Fedora KDE
小明拿着在Windows下不断蓝屏的T440和公司建议不使用云笔记的规定,心下想着,是时候回归linux了... 一.系统的获取与启动盘的制作 fedora20 KDE版 liveusb-creato ...
- Linux mint 17.3系统安装及常用开发办公软件部署
关于为什么选择linuxmint17.3作为个人办公开发系统的选择说明: 编者按]提起Linux系统,大家可能最先想到的就是 Linux Mint 和 Ubuntu 两个版本了.近来,开源界貌似激进了 ...
随机推荐
- [Java Basics3] XML, Unit testing
What's the difference between DOM and SAX? DOM creates tree-like representation of the XML document ...
- JS小总结
今天看了一下js的部分总结了一下 函数的定义首先是命名函数function funcName函数还有匿名函数 var funcName = function()普通函数和匿名函数在调用上基本没有什么区 ...
- 黑马程序员:Java编程_网络编程
=========== ASP.Net+Android+IOS开发..Net培训.期待与您交流!=========== 网络编程就是两个(或多个)设备(例如计算机)之间的数据传输,更具体的说,网络编程 ...
- JS原生效果瀑布流布局的实现(一)
JS原生效果 实现: HTML页面布局: <!DOCTYPE html> <html> <head> <meta charset="utf-8&qu ...
- Javascript 事件对象(六)事件默认行为
事件默认行为: 阻止默认事件普通写法:return false;屏蔽右键菜单 : oncontextmenu <!DOCTYPE HTML> <html> <head& ...
- 记录DIV中滚动位置刷新页面位置保持不变
一.js部分: <script type="text/javascript"> $(document).ready(function () { ...
- 帝国cms内容批量替换
方法一:栏目-其他相关-批量替换字段值 方法二:通过sql替换 UPDATE phome_ecms_news SET body=REPLACE(body,'原来','现在')
- android颜色指列表
<?xml version="1.0" encoding="utf-8" ?> 2 <resources> 3 <color na ...
- SYSLOG审记日志的配置。
前言 syslog是UNIX系统中提供的一种日志记录方法(RFC3164),syslog本身是一个服务器,程序中凡是使用syslog记录的信息都会发送到该服务器,服务器根据配置决定此信息是否记录,是记 ...
- 2. Transcribing DNA into RNA
Problem An RNA string is a string formed from the alphabet containing 'A', 'C', 'G', and 'U'. Given ...