1:EMC XtremIO解剖
经常听人说起全闪存阵列,牛逼哄哄的样子,那这个全闪存阵列到底是个什么东东?阿呆将以某一款EMC XtremIO为例来带你入门。
结构
如下图是一个标准的XtremIO全闪存阵列,含有两个X-Brick,之间用Infiniband互联。可以看出,X-Brick是核心,那么X-Brick里面究竟是那些东东?
我们来看看,一个X-Brick包括:
- 高级UPS电源;
- 2个存储控制器;
- 磁盘阵列存储柜DAE,放有很多个SSD,每个SSD都用SAS连接到存储控制器;
-
如果系统有多个X-Brick,那么需要2个Infiniband交换机来实现存储控制器高速互联;
存储控制器
如下图,存储控制器其实就是个Intel的服务器,配有两个电源,看起来是两个独立NUMA架构的CPU,2个Infiniband控制器,2个SAS HBA卡。Intel E5 CPU,每个CPU配有256GB内存。
屁股后面插好各种线缆,就是这样乱糟糟的。设计的架构适用于集群,所以线缆有很多是冗余的。
阵列正面照,LCD显示的是UPS电源状态。下图中一个个竖着的应该就是SSD阵列了。
配置
如下表,一个X-Brick容量是10TB,可用容量7.5TB,但是考虑到数据去重和压缩大概为5:1的比例,最终可用容量为37.5TB。
性能
参考链接里面貌似是EMC内部人士写的测试结果,他们在这个2个X-Brick的全闪存阵列跑了550个虚拟机,服务7000个用户服务器。每天平均读写带宽为350-400MB/s,IOPS 20k.最高时达到20GB/s,200k IOPS。
软件控制台
我们来看看软件控制台参数,第一个图左边显示数据降低率2.5:1,其中去重1.5:1,压缩1.7:1.右边是带宽,IOPS和延迟监控图,看起来能显示每个SSD当前的性能和汇总的读写性能。
下图是每个SSD的监控图,DAE中每个盘下面有模拟的灯,根据盘当前的读写活动不断闪烁,看起来非常酷!
2:EMC XtremIO硬件架构
EMC XtremIO是EMC对全闪存阵列市场的突袭,它从底层开始完全根据闪存特性设计,我们来看看Vijay Swami在个人博客上对XtremIO的详细分析。
硬件架构
如下图,一个X-Brick包含两个存储控制器,1个装了25个SSD的DAE,还有两个电池备用电源(BBU:battery backup unit)。每个X-Brick包含有25个400GB的SSD,原始容量10TB,使用的是高端的eMLC NAND Flash,一般擦写寿命比普通的MLC长一个数量级。如果只买一个X-Brick,配有两个BBU,其中一个是为了冗余,如果继续增加X-Brick,那么其他的X-Brick只需要一个BBU。
X-Brick支持级联来增加容量,所以是一种Scale-Out的架构,最多可以到4个甚至8个。
X-Brick之间采用40Gbps的Infiniband交换机互联。
上图是一个X-Brick存储控制服务器的所有端口,40Gbps Infiniband接口是为了后端数据连接,其实就是X-Brick之间的互联。那么,阵列和Host控制端怎么进行数据交互呢?可以看出,既可以使用8 Gbps FC,也可以使用10Gbps的iSCSI。那又是怎么连到那么多的SSD上呢?用的是6Gbps的SAS接口,和VNX类似。同时,包括电源和所有的接口都是有冗余的,用来故障时备用。这样一个X-Brick节点自己数据的存储怎么解决呢?它配有两个SSD,用来掉电时保存内存中的元数据,要知道去重还是很占用内存的,因为一般每个数据块需要计算出一个hash值,甚至双重hash,用hash值来判断唯一性。同时还有2个SAS硬盘,作为操作系统运行的磁盘。
这样一来,存储控制器有自己的硬盘,而不占用DAE里面的SSD阵列,闪存阵列只用于存储用户数据,受两个存储控制器管理。这种架构的好处是结构清晰,界限分明,未来还能直接升级存储控制器软硬件而不动闪存阵列里的数据。
再来看看每个存储控制器的配置:有两个CPU插槽的1U机箱,使用两个8核的Intel Sandy Bridge CPU,256GB内存。
3:吹最高性能的都是耍流氓
现在很多厂商都以吹嘘最高性能为荣,拿一个新盘,写一点数据,甚至往DRAM Cache里面写一点,读出来,就吹嘘带宽,IOPS,延迟。更有甚者,不写数据,空盘读,达到巅峰带宽,
简直把用户当三岁小孩。殊不知,对用户来讲,尤其是企业级用户,最高性能说明不了什么,只能忽悠那些不懂行的人,对真正业内人士来说,实际使用的稳定性能才是王道。
EMC全闪存阵列XtremIO,1个10TB的X-Brick,可用容量只有7.5TB,但是考虑到数据去重,用户能用的容量其实很大,跟实际的应用相关。比如虚拟桌面VDI应用,数据重复率很高,想想不同人安装的Windows XP虚拟机的系统文件基本都是一样的,去重可以省下多大的空间啊!但是像一般的数据库应用,重复率又很低,毕竟数据库存储的数据几乎是随机的。
不耍流氓的实际IOPS
我们来看看一个X-Brick的IOPS:
- 100% 4KB写:100K IOPS
- 50/50 4KB读/写:150K IOPS
-
100% 4KB 读:250K IOPS
如果是两个或更多X-Brick级联,性能线性增长,前面的数值翻几倍就可以了。如本文开头那张图所示。
有一点必须得强调,在现在牛皮吹的一个比一个大的时代,上面说的这个性能看起来一般,但是要知道,这可是实际使用的性能。而且不是空盘拿来跑跑的性能,而是全盘写了至少80%之后的性能。为什么要写至少80%才能测真正的性能?因为空盘写不会触发垃圾回收,用户占满了整个带宽,当盘快写满的时候,垃圾回收开始工作,用户能分到的带宽就少了,性能自然下降。而我们买了盘,肯定很快会写很多数据,所以只有快写满了才是常态。
4:装了安卓的iPhone你还买吗?
软件取胜之道
存储行业发展到今天,硬件越来越标准化,所以已经很难靠硬件出彩了。要么能够制造存储芯片,例如三星这种模式,从底层开始都自己做,靠巨大的出货量坐收硬件的利润,但这种模式投资巨大,一般人玩不来。要么就靠软件走差异化了,而且软件还有一个硬件没有的优势:非标准化,比如IBM的软件很多是基于自己的Unix系统开发,别人用了之后切换到其他厂家的软件难度很大,毕竟丢数据的风险不能随便冒。
看了前面的XtremIO硬件架构之后,不少人可能觉得并没有什么复杂的,基本上是个系统集成,组装机嘛,中国的山寨厂家也能搞一套出来。但是,全闪存阵列的核心在软件,软件做好了,才能让用户体验到闪存阵列的性能。试想,如果iPhone装的是Android系统,你还会花五六千大洋排队去买吗?估计连两三千都舍不得了吧!
XIO软件几大杀器
- 去重:提升性能,同时因为写放大降低,延长了闪存的寿命,提高可靠性。
- Thin Provisioning:分区的容量可以随着使用而自动增长(直到用满阵列),这样关键时候不会影响到性能。
- 镜像:先进的镜像架构保证了容量和性能不会受损。
- XDP数据保护:用RAID6保护数据。
-
VAAI集成。后面解释这是个什么东东。
XIO软件核心设计思想
- 一切为了随机性能
- 任何节点上访问任意数据块,都不能比其他情况增加多余的成本,就是必须是公平访问所有资源。这是为神马?这样的效果就是即使节点增加,性能可以线性增长,扩展性也好。
- 尽可能减少写放大
- 要知道,对SSD来讲写放大不仅导致寿命缩短,同时因为闪存的擦写次数升高,导致质量下降,数据可靠性也会下降。XIO的设计目标就是让后台实际写入的数据尽量少,起到一种数据衰减的作用。
- 不做全局垃圾回收
- XIO使用的是SSD阵列,而SSD内部是有高性能企业级控制器芯片的,当前的SSD主控都非常强大,垃圾回收效率很高,所以XIO并没有再重复做一遍垃圾回收。这样做的效果是降低了写放大,毕竟后台搬移的数据量少了,同时,节省出时间和系统资源来给其他软件功能,数据服务,VAAI等。
- 按照内容存放数据
- 数据存放的地址用数据内容生成,而跟逻辑地址无关。这样数据可以存放在任何位置,提升随机性能,同时还可以针对SSD做各种优化。
- 数据可以平均的放置在整个系统中。
- True Active/Active数据访问
- LUN没有所有者一说,所有节点都可以为任何卷服务,这样就不会因为某一个而性能受损。
-
扩展性好:性能,容量等都可以线性扩展。
5:深入XIO软件架构
新年刚过,最近京沪等一线和南京等准一线城市房价暴涨,楼市火热,推升了交易量。在这股疯了似的行情中,很多人估计都不敢相信自己的眼睛了:别说了,我想静静!大城市的房子是有限的,技术却是无限的,人的大脑很多都是尚未开发的荒地,既没有18亿亩土地红线,又没有土地出让金,阿呆哥带你花个十分钟,安安静静学习全闪存技术,把这些荒地开发起来。每天看一篇SSDFans的文章,一年后你的大脑就能建成一座SSD技术大厦了,而别人天天盯楼市的大脑还是荒地。
XtremIO软件为什么在Linux用户态?
如上图,XIO的全闪存阵列软件架构,XIO OS和XIO的软件都运行在Linux的用户态,这样有什么好处呢?我们知道,Linux系统分为内核态和用户态,我们的应用程序都在用户态运行,各种硬件接口等系统资源都通过内核态管理,用户态通过system call访问内核资源。XIO软件运行在用户态有几大优点:
- 避免了内核态的进程切换,速度快。
- 开发简单,不需要借助于各种内核接口,以及复杂的内存管理,异常处理。
-
不必收到GPL的约束。Linux是开源系统,程序在内核运行必然要用到内核代码,按照GPL的规定,就得开源,在用户态自己开发的应用就不受此限制。这种商业性软件,里面很多都是公司花了很多心血开发的核心技术,开源了就太不值得了。由此也可以看出软件对全闪存阵列的价值!开源了还能卖那么贵吗?或者说开源了,谁都可以组装起来,装一个开源软件,全闪存阵列就只能打价格战了,高科技当大白菜卖。
用户态掌控一切
在每个CPU上运行着一个XIOS程序:X-ENV,如果你敲一下“top”命令,就会发现这个程序掌控所有的CPU和内存资源。为什么这么做?就是为了XIO能100%使用硬件资源,能够运筹帷幄之中,决胜千里之外。知道自己赚多少钱,才能想清楚该怎么花啊。
第二个作用是,不给其他进程影响XIO性能的机会,保证性能的稳定。
第三个作用是提供了一种可能性:未来可以简单修改就移植到Unix或者Windows平台,或者从X86 CPU移植到ARM,PowerPC等CPU架构,因为都是上层程序,不涉及底层接口。
软件定义硬件
XtremIO完全是脱离了硬件的软件,为什么这么说?因为他们被EMC收购之后,很快就从自己的硬件架构切换到了EMC的白盒标准硬件架构,说明软件基本不受硬件限制。而且,XIO的硬件基本没有自己特殊的组件,不包含FPGA,没有自己开发的芯片、SSD卡、固件等,用的都是标准件。这样做的好处是可以使用最新最强大的X86硬件,还有最新的互联技术,比如比Infiniband更快的技术。如果自己开发了专用的硬件,要跟着CPU一起升级就很麻烦了,总是会慢一拍。
甚至,XtremIO完全可以只卖软件,只不过目前EMC没这么干而已。现在是硬件,软件,EMC客户服务一起卖。没准哪天,硬件不赚钱了,EMC就只卖XIO软件了呢。
6:EMC XtremIO核心软件流程
6大模块
XIO软件分为六个模块,来实现复杂的功能。包括三个数据模块R,C,D,三个控制模块P,M,L。
- P:Platform,平台模块。
- 监控系统硬件,每个节点有个P模块在运行。
- M:Management,管理模块。
- 实现各种系统配置。通过和XMS管理服务器通信,执行任务,比如创建卷,LUN的掩码,等从命令行或图形界面发过来的指令。有一个节点运行M模块,其他节点运行另一个备用M模块。
- L:Cluster,集群模块。
-
管理集群成员,每个节点运行一个L模块。
- R:Routing,路由模块。
- 其实就是把发过来的SCSI命令翻译成XIO内部的命令。
- 负责来自两个FC和两个iSCSI接口的命令,是每个节点的出入口看门大爷。
- 把所有读写数据拆成4K大小。
- 计算每个4K数据的HASH值,用的是SHA-1算法。
- 每个节点运行一个R模块。
- C:Control,控制模块。
- 包含了一个映射表:A2H(数据块逻辑地址——Hash值)。
- 镜像,去重,自动扩容等高级数据服务。
- D:Data,数据模块。
- 包含了另一个映射表:H2P(Hash值——SSD物理存放地址)。可见,数据的存放地址跟逻辑地址无关,只跟数据有关,因为Hash值通过数据算出来。
- 负责对SSD的读写。
-
负责RAID数据保护技术:XDP,XtremIO Data Protection。
读流程
- Host把读命令通过FC或iSCSI接口发送给R模块,命令包含数据块逻辑地址和大小。
- R模块把命令拆成4KB大小的数据块,转发给C模块。
- C 模块查A2H表,得到数据块的Hash值,转发给D模块。
-
D模块查H2B表,得到数据块在SSD中的物理地址,读出来。
不重复的写流程
1. Host把写命令通过FC或iSCSI接口发送给R模块,命令包含数据块逻辑地址和大小。
2. R模块把命令拆成4KB大小的数据块,计算出Hash值,转发给C模块。
3. C 模块发现Hash值没有重复,所以插入到自己的表里面,转发给D模块。
4. D模块给数据块分配SSD中的物理地址,写下去。
可去重的写流程
1. Host把读命令通过FC或iSCSI接口发送给R模块,命令包含数据块逻辑地址和大小。
2. R模块把命令拆成4KB大小的数据块,计算出Hash值,转发给C模块。
3. C 模块查A2H表(估计还有个H2A表,或者是个树,Hash数组之类),发现有重复,转发给D模块。
4. D模块
知道数据块有重复,就不写了,只是把数据块的引用数加个1。
可以看出,自动扩容和去重都是自然而然在后台完成的,不会影响正常读写性能。
7:VM复制竟然如此简单!
茫茫人海,漫漫人生路,有时候尽管我们选择了不同的道路,但最终还是走到了同一个归宿。没想到,整合文件系统和SSD映射表后的复制和有去重功能的全闪存阵列最终达到了一样的效果。
我们曾经畅想过整合了文件系统inode表和SSD映射表之后,复制会很简单,只需要两个逻辑块对应到一个物理块就可以了,并不需要读出来再写下去。要知道自从全闪存阵列有了去重功能之后,也有异曲同工之妙,复制这个基本的文件操作竟然如此简单:没有数据搬移,仅仅是某几个计数登记一下而已。下面我们细细道来。
ESXi和VAAI
首先我们来普及一下ESXi和VAAI两个名词。我也是百度的。
VMware的虚拟化产品,就个人、小企业而言,有Workstation、ESXi(vSphere,免费版)、VMware Server(免费版)可以选择,Workstation和VMware Server需要装在操作系统如Windows或Linux上,ESXi则内嵌操作系统,又免费。所以ESXi可以看成是虚拟机平台,上面运行着很多虚拟机。
VAAI,“vStorage APIs for Array Integration”,虚拟化领域的标准语言之一,其实就是ESXi等发命令的协议了。
复制流程
下图是复制前的数据状态。
- ESXi上的虚拟主机用VAAI语言发了一个虚拟机(VM)复制的命令。
- R模块通过iSCSI或FC收到了命令,并选择一个C模块执行复制。
- C模块解析出命令内容,把原来VM的地址范围0-6,复制到新的地址7-D,把结果发送给D模块。
- D模块查询Hash表,发现数据是重复的,所以没写数据,只把引用数增加1.
-
这样复制完成了,没有真正的SSD读写。
不过有个问题是,这些元数据操作都是在内存中完成的,那万一突然掉电了怎么办?XIO设计了一套非常复杂的日志机制:通过RDMA把元数据的改动发送到远端控制器节点,使用XDP技术把元数据更新写到SSD里面。XIO的元数据管理是非常复杂的,前面讲的流程只是简单介绍而已。
由于使用了A2H,H2P两张表,数据可以写到SSD阵列的任何一个地方,因为只跟数据的HASH有关,跟逻辑地址Address没关系。
8:中国为什么需要高铁?
最近两会召开,网友们在热追中国高铁十三五规划,尤其是福建到台北的海底高铁更是令人震撼。短短十多年的时间,中国居然成为了世界第一高铁大国,乘坐高铁成为了大家城市间出行的第一选择。那为什么中国这么热衷于建设高铁呢?
人多!就是因为中国人口众多,而且稠密,基本集中在东部地区,比如京沪线,普通铁路的运力根本不够这么多人的需求,飞机也没办法拉完这么多人。高铁速度快,自然单位时间内能运载更多的人,交通效率更高。
在存储领域也是这个道理,全闪存阵列底层采用了闪存,所以速度很快,为了不浪费闪存的速度,上层的通信也需要非常高效。本文揭秘XtremIO全闪存阵列的内部通信。
回顾R,C,D模块
前文介绍了R,C,D三个数据相关的模块。唉,等等,等等,这是什么东东?哈,早就知道你完全不记得了,也知道你懒得去翻历史文章,所以再解释一遍。
- R:Routing,路由模块。
- 其实就是把发过来的SCSI命令翻译成XIO内部的命令。
- 负责来自两个FC和两个iSCSI接口的命令,是每个节点的出入口看门大爷。
- 把所有读写数据拆成4K大小。
- 计算每个4K数据的HASH值,用的是SHA-1算法。
- 每个节点运行一个R模块。
- C:Control,控制模块。
- 包含了一个映射表:A2H(数据块逻辑地址——Hash值)。
- 镜像,去重,自动扩容等高级数据服务。
- D:Data,数据模块。
- 包含了另一个映射表:H2P(Hash值——SSD物理存放地址)。可见,数据的存放地址跟逻辑地址无关,只跟数据有关,因为Hash值通过数据算出来。
- 负责对SSD的读写。
-
负责RAID数据保护技术:XDP,XtremIO Data Protection。
可以看出,R和上层打交道,C是中间层,D和底层SSD打交道。记住这个就可以了。
物理连接
首先要搞清楚的是,这么模块物理上怎么放在控制服务器里面。前面说过,1个X-Brick的控制服务器有两个CPU,每个CPU运行一个XIOS软件。如下图,R,C模块运行在一个CPU上,D在另一个上。为什么要这么做呢?
因为Intel Sandy Bridge CPU集成了PCIe控制器(估计是说Sandy Bridge企业版CPU集成了PCIe 3.0接口,不需要通过南桥转接)。所以,在多CPU的架构中,让设备直连CPU的PCIe接口性能就会很高,而R,C,D的分布也是按照这个需求来设计的。例如SAS转接卡插到了CPU 2的PCIe插槽上,所以D模块就要运行在CPU 2上,这样性能才能达到最优。从这里,我们有可以看出XtremIO的架构上的优点,就是软件完全可以按照标准化硬件来配置,通过布局达到最优的性能。如果CPU的分布变化了,也会根据新的架构简单调整软件分布来提升性能。
模块间通信:扩展性极佳
我们再来说说正题:模块间怎么通信?其实并不要求模块必须在同一个CPU上,就像上图一样,R和C并不是一定要在一个CPU上才行。所有模块之间的通信通过Inifiniband实现,数据通路使用RDMA,控制通路通过RPC。我们来看看通信的时间成本:XtremIO的IO总共延时是600-700us,其中Infiniband只占了7-16us。Infiniband来互联的优点是什么?其实还是为了扩展性,X-Brick即使增加,延迟也不会增加,因为通信路径没变化:任意两个模块之间还是通过Infiniband通信,如果系统里面有很多R,C,D模块,当一个4K数据块发到一个前端R模块上,它计算Hash值,Hash会随机坐落在任意一个C上,没有谁特殊。这样一切都是线性的,X-Brick的增减,线性的导致性能增减。
10:大结局
XtremIO跟谁般配?
闪存价格还是比较昂贵的,尤其是企业级应用使用的eMLC或SLC,所以全闪存阵列XtremIO并不能取代大容量的存储阵列SAN。那它跟哪种应用场景比较般配呢?想想就知道了,闪存的优势就是延迟低,性能高,所以适用于容量要求不高,但是要求延迟低,高IOPS的应用,比如VDI(虚拟桌面基础架构,就是虚拟机),数据库,SAP等企业应用。
- 数据库是非常受益的,为什么呢?首先是性能高,其次有一大优点就是复制几乎不占用空间,所以用户可以很方便快速地把数据放很多个副本。
- 已经有人咋一个X-Brick上运行了2500-3500个VDI虚拟机,而延迟在1毫秒以内。虚拟机很多数据也是重复的,毕竟每个系统的文件都差不多,所以去重也能发挥大作用。
-
企业应用领域也有人使用XtremIO加速了关键应用。
总之,只要容量足够,那你的应用肯定用起来比以前快多了!
结语
看完了整个全闪存阵列XtremIO的技术揭秘,我们发现其实XIO的核心还是在软件,因为硬件都是标准件,X86服务器,SAS接口的SSD。AFA到底有什么独特的地方呢?
- 相比SSD,他没有垃圾回收,Wear Leveling,Read Disturb等等传统SSD的功能,因为这些都在SSD里面由主控搞定了。
-
相比传统阵列,它的特色是去重和RAID 6每次写到新的地址的功能。
以前可能你也不知道牛逼哄哄的全闪存阵列到底是怎么弄的,看完了这篇文章,相信你已经不觉得它神秘了。甚至可以这么简单的看:SSD是很多U盘的阵列,全闪存阵列是很多SSD的阵列,只不过U盘是最差的NAND Flash,SSD好一点,AFA用的更好。但是,每升一级,就是一次质变,要增加新的功能。
你想在SSD领域积累更多人脉、学习核心技术、掌握最新动态?我们建了一个微信群,方便SSD Fans们讨论SSD,闪存和存储相关的话题。群友既包括各大公司SSD、存储方面的技术精英,行业大牛,也有很多SSD爱好者。
欢迎各位SSD行业人士、使用者和爱好者加入,谢绝猎头,广告(可联系contact@ssdfans.com通过公众平台发布)。
加入后请修改昵称为:姓名(或昵称)–公司(或领域)–职业
例如;张三-Marvell-SSD FW QA
蛋蛋-SSD Controller-FW开发
微信加nanoarch为好友拉你入群。
引用
http://vjswami.com/2013/11/13/xtremio-hardwaresoftware-overview-architecture-deepdive/
http://sudomakeinstall.com/virtualization/emc-xtremio