多命名空间结合cgroup保障存储QoS
6月, Step Ahead 向前一步——Memblaze 新品发布会在北京召开,Memblaze在发布会现场围绕PBlaze5 910/916及510/516两大系列NVMe SSD的能源效率、Trim保障云业务、多命名空间与cgroup结合保障存储QoS等主题做了演示方案。这些方案全面展示了Memblaze新一代NVMe SSD产品的优势,而且对于企业用户部署和使用NVMe SSD,构建高速、高效的存储系统同样具有借鉴意义。
在此我们将对这些关键的技术细节通过系列文章解读,本文主要介绍的是多命名空间结合cgroup保障存储QoS的方案。
关于多命名空间和cgroup
多命名空间(为方便解释相关操作及原理,后文命名空间会写成namespace)是PBlaze5系列NVMe SSD的一项关键特性,用户空间被多个namespace划开。 在PBlaze5系列产品中,可以将逻辑块按需划分为最多32个namespace,每个namespace拥有独立逻辑地址和NSID,独立格式化和访问。Controller 就是通过 NSID 来引用特定的 namespace 。
划分了32个namespace的PBlaze5
每个namespace 都可以单独配置硬盘的参数,如配置不同的物理扇区大小、执行trim指令、数据保护、加密等。需要指出的是多名命空间在NVMe SSD的实现原理在NVMe标准协议中有明确的定义,但是不同厂商对其有不同的解释。
这就是多命名空间,他为上层的资源调度机制提供了一个基础平台。结合cgroup就可以控制存储的QoS。(关于多命名空间更多细节,参见文章《实锤,PBlaze5实力演绎multiplenamespaces 功能(上)》和《实锤,PBlaze5实力演绎multiplenamespaces 功能(下)》)。
cgroup(control group)是Linux内核提供的一种可以限制、记录、隔离进程组(process groups)所使用的物理资源(如:CPU, Memory, IO等)的机制。最初由Google的工程师提出,2007 年进入 Linux 2.6.24 内核。cgroup 也是 LXC/Docker 为实现虚拟化所使用的资源管理手段。可见cgroup对于Linux的资源管理和容器的实现都具有重要的意义,并且这是一项较为成熟的技术。
cgroup分v1和v2两个版本,v1实现较早但是应用较为广泛;v2则是重新设计之后的版本,该版本从Linux 4.5内核开始可以用于生产环境,并且v1和v2可以混合使用。由于当下cgroup v1版更加成熟,本文也使用v1版进行介绍。
使用cgroup之前需要介绍几个比较重要的概念:
• 任务(task)。在 cgroup 中,任务就是系统的一个进程;
• 控制组(control group)。控制组就是一组按照某种标准划分的进程。cgroup 中的资源控制都是以控制组为单位实现。一个进程可以加入到某个控制组,也从一个进程组迁移到另一个控制组。一个进程组的进程可以使用 cgroup 以控制组为单位分配的资源,同时受到 cgroup 以控制组为单位设定的限制;
• 层级(hierarchy)。控制组可以组织成 hierarchical 的形式,既一颗控制组树。控制组树上的子节点控制组是父节点控制组的孩子,继承父控制组的特定的属性;
• 子系统(subsystem)。一个子系统就是一个资源控制器,本文介绍的方案使用的就是blkio子系统,其他的还有memory、cpu、cpuset等等子系统。子系统必须附加(attach)到一个层级上才能起作用,一个子系统附加到某个层级以后,这个层级上的所有控制族群都受到这个子系统的控制。
关于cgoup的相关信息和使用方法都可以在其官方文档中找到,这里不多赘述,只对blkio子系统使用进行一个介绍。blkio子系统主要功能是控制磁盘等块设备的性能等参数,挂载cgroup root目录以及blkio子系统如下所示:
echo "259:0 102400" > blkio.throttle.read_bps_device
echo "259:0 10" > blkio.throttle.read_iops_device
在对应的子系统目录下通过mkdir创建资源组,rmdir可将对应资源组删除。实际操作中,以读的IOPS和带宽为例,可以分别设置两个参数的上限,如下所示:
mount -t tmpfs cgroup_root /sys/fs/cgroup
mkdir /sys/fs/cgroup/blkio
mount -t cgroup -o blkio none /sys/fs/cgroup/blkio
第一条命令将259:0设备(这里的设备可以是namespace,下同)的读带宽限定在100KB/s,第二条命令将259:0设备读iops限定在10。用户可以依照上面的命令格式对读和写的IOPS和带宽分别进行设置,cgroup会依据多个阈值对设备(这里可以是多个1到多个namespace)的性能进行精准的控制,如此一来,即便是读写混合、多种I/O size混合的应用场景,NVMe SSD的QoS仍然有保障。
测试结果展示
多命名空间结合cgroup保障存储QoS的方案能够实现的效果在日前Step Ahead 向前一步——Memblaze 新品发布会上进行了详细的展示,这里我们对进行再次解读。
测试条件
Server: PowerEdge R730xd
cpu:Intel(R) Xeon(R) CPU E5-2640 v3 @ 2.60GHz
Memory:64GB
Storage:PBlaze5 910 U.2 3.84T NVMe SSD
测试软件:fio-3.2
实验介绍
在戴尔的R730xd上装一块3.84TB的PBlaze5 910 NVMe SSD,创建8个相同容量的namespace。使用fio进行测试,并对读IOPS的控制效果,事实上用户可以依据自身需求对写IOPS,写带宽以及读带宽依照这个思路进行操作。
3.2 测试步骤
1) 创建8个相同容量namespace
2) 初始化处理,确保设备进入稳态
3) 进行IO测试1
前4个namespace读iops限制为3万
后4个namespace读iops限制为1万
4KB 100%随机读,fio queue depth=1,300秒
4) 进行IO测试2
前4个namespace读iops限制为6万
后4个namespace读iops限制为1万
4KB 100%随机读,fio queue depth=16,300秒
测试结果展示
多命名空间将NVMe SSD的用户空间划分为多个区域,不同的区域可以独立进行Trim、格式化等操作。并且上层的一些高级功能的实现构建了一个基础平台,cgroup就是这样高级功能中的代表。cgroup诞生于谷歌,并在Linux生态中实践多年,是一项对底层硬件资源管控的成熟技术。多命名空间与cgroup的结合是IT系统中一个软硬件结合并充分发挥各自优势的方案,各类虚拟化、容器、云计算、云存储等应用场景都可以借助这一方案保障存储系统的QoS。
相关阅读:
cgroup v1官方文档https://www.kernel.org/doc/Documentation/cgroup-v1/cgroup.txt
cgroup v1中块设备控制文档https://www.kernel.org/doc/Documentation/cgroup-v1/blkio-controller.txt
Cgroup与LXC简介http://blog.51cto.com/speakingbaicai/1359825
CGroup 介绍、应用实例及原理描述
https://www.ibm.com/developerworks/cn/linux/1506_cgroup/index.html
测试结果视频
https://www.bilibili.com/video/av26458755/
下一篇: Java魔法类Unsafe详解
推荐阅读