https://access.redhat.com/documentation/zh-cn/red_hat_enterprise_linux/7/html/7.2_release_notes/storage
DM 恢复至版本 4.2
已将 Device Mapper (DM) 升级至上游版本 4.2,该版本提供大量针对上一个版本的程序错误修复和增强,其中包括显著 DM 加密性能更新及 DM 核心更新,以支持多队列块 I/O 查询机制(blk-mq)。
使用 blk-mq 进行多重队列 I/O 调度
Red Hat Enterprise Linux 7.2 包含了一个用于块设备(称为 blk-mq)的新多重队列 I/O 调度机制。通过允许某些设备驱动映射 I/O 请求至多个硬件或软件队列提高性能。当多线程执行在单一设备直执行 I/O 时,性能的提高来自于锁竞争的减少。更新的设备,如非易失性存储器标准(Non-Volatile Memory Express,NVMe),因为对多个硬件提交和完成队列的原生支持以及低延迟性能的特点,它们最适合于使用这个功能。但性能的提高总是取决于具体的硬件和负载。
在下列驱动程序中实施 blk-mq 功能且默认启用它:virtio-blk、mtip32xx、nvme 和 rbd。
相关功能 scsi-mq 允许小型计算机系统接口(SCSI)设备驱动程序使用 blk-mq 基础结构。scsi-mq 在 Red Hat Enterprise Linux 7.2 中是作为技术预览提供。要启用 scsi-mq,请在内核命令行中指定
scsi_mod.use_blk_mq=y
。默认值为
n
(禁用)。
如果指定了
dm_mod.use_blk_mq=y
内核选项,就也可以配置使用基于请求的设备映射器(Device Mapper,DM)的 DM 多重路径目标设备使用 blk-mq 基础架构。默认值是
n
(禁用)。
如果底层的 SCSI 设备也使用 blk-mq,设置
dm_mod.use_blk_mq=y
可以减少 DM 层的锁消耗。
要确定 DM 多重路径设备是否在使用 blk-mq,请查看
/sys/block/dm-X/dm/use_blk_mq
,这中的
dm-X
用实际的 DM 多重路径设备替代。这是只读文件,它反映
/sys/module/dm_mod/parameters/use_blk_mq
中的全局值是创建基于请求的 DM 多重路径设备的时间。
最近Linux的最新内核已经r
el
ease到Linux-3.19-rc6,根据Linus的r
el
ease note,大约再经过一次rc7版本就可以正式r
el
ease了。Linux 3.19内核在
bl
ock层的最大变化就是增加了一个multi-queue
bl
ock layer,来更好的支持类似于NVME等支持multi-queue机制的设备。所谓的multi-queue机制就是在多核CPU的情况下
浏览器打开
在主机中,多cpu运行多个线程,每个线程都能和文件系统交互,文件系统层也是用多线程和bio层交互,但是,块设备层只有一个
队列
:
在块设备层,来自多个cpu的bio请求被放在同一个
队列
中,造成阻塞:
因此,提出了多
队列
的方法,在块设备层也做成多线程:
但是,在块设备层实现多个
队列
并不能像文件系统一样考虑,因为块设备层需要与硬件交互,这需要硬件也支持多
队列
,最理想的情况是,硬件支持的
队列
足够多,上层的每个
队列
(基于软件的
队列
),都有硬件
队列
和其关联。但有些时候,硬件支持的
队列
有限
浏览器打开
Flash的出现把存储的世界搅翻了天,仿佛一夜之间发现了新大陆,所有旧世界的东西都变得笨拙。NVMe驱动义无反顾地抛弃了Linux
blk
,开发自己的
队列
管理。
当第一次看到NVMe重新使用Linux
Bl
ock
队列
管理
blk
-
mq
的时候,还是比较惊讶的:现在的NVMe工作的好好的,为什么要换,增加
blk
-
mq
会不会造成性能下降?相信很多人都有这个疑惑。刚好手上有个centos7.2环境,我们就...
浏览器打开
按照老的套路,在分析一个driver时,我们首先看这个driver相关的kconfig及Makefile文件,察看相关的源代码文件.
在开始阅读一个driver,通常都是从module_init or syscall_init函数看起。
下面让我们开始nvme的旅程吧。
首先打开driver/
bl
ock下的kconfig文件,其中定义了
BLK
_DEV_NVME config,如下。
浏览器打开
前面使用单个数组随机访问的方式实现了
多重
栈的基本操作,这里通过来两个数组来随机访问实现
多重
队列
;
这里需要两个数组,因为
队列
需要添加元素和删除元素在不同的一端QueueNode front[MAX_SIZE] = {NULL}, rear[MAX_SIZE] = {NULL};
首先是
队列
添加元素的操作:
void QueueAddq(int i,
el
ement item)
Queue
浏览器打开
通常我们只用一个
队列
来实现各种
队列
功能。但考虑这样一种
队列
,它要求
队列
中的元素是笛卡尔坐标系里的点。即X坐标和Y坐标。
比如说,第一个进队的元素是(1,2),第二个元素为(1,1)。
接着第一个出队的元素为(1,2),再进一个元素为(3,3)
这样,
队列
浏览器打开
1,http://events.static.linuxfound.org/sites/events/files/slides/vault-2016.pdf 【Jens Axboe】 ***
2,Multi-Queue机制就是在多核CPU的情况下,将不同的
bl
ock层提交
队列
分配到不同的CPU核上,以更好的平衡IO的工作负载,大幅提高SSD等存储设备的IO效率。一些高端设备目前已经支持多队...
浏览器打开
新版内核在
blk
层加入了多
队列
功能,可以尽情发挥SSD的性能,开启多
队列
可以在编译内核的时候默认开启,也可以通过启动参数配置scsi_mod.use_
blk
_
mq
在/etc/default/grub中添加参数:
GRUB_CMDLINE_LINUX="scsi_mod.use_
blk
_
mq
=1" # 1是开启 0是关闭
更新grub:
sudo update-grub
或者直接编辑/boot/grub/grub.cfg在vmlinuz开头的一行结尾处添加
scsi_mod.use_
blk
_
mq
浏览器打开
上一篇已经讲述了
MQ
多
队列
的机制,利用cpu的多核,配上多
队列
机制,并发的处理IO请求,提高效率。
本篇详细讲述下从bio下发到IO调度器中,
MQ
队列
机制是如何一步步完成的。
1、
MQ
处理结构流图
从整个流程图可以看到,主要是分为三个部分:初始化硬件设备的target参数、初始化请求
队列
request_queue以及bio请求的处理过程。前面两个过程主要是完成底层存储设备向文件系统的注册,同时完...
浏览器打开