前两天朋友问笔者能不能帮忙一同测试一下PureStorage数据存储的性能;正好最近笔者也在准备PureStorage Flash Array以及Flash Blade相关认证,就欣然同意配合并参与了PureStorage高性能存储的开箱之旅。

先来说明一下本次测试的环境:

  • 融合交换机:Cisco FI6248交换机*2台,网络与存储上联均为双活冗余架构;每台融合交换机分别有10Gbps以太网链路*1上联到Homelab核心设备N3K;由于“财力有限”,存储上联采用8Gbps FCP链路*1(总带宽16Gbps)直连到PureStorage C40高性能存储;
  • 服务器:Cisco C220 M4S机架式服务器[CPU:E5-2660 v3 @ 2.60GHz] 2台,分别以10Gbps的光纤线连接到融合交换机上,总带宽为20Gbps;对于服务器来说所有与集中式存储之间的SAN流量均通过FCoE方式经由融合交换机转发。
  • 集中式存储:PureStorage FlashArray C40高性能存储,Purity版本为6.3.5;由于Homelab环境融合交换机的端口授权有限,因此C40的两个控制器分别只能有1根上行链路;且因为端口速率向下匹配兼容,因此整体的SAN链路带宽合计为16Gbps。

测试步骤一:设备上架

C40是一台4U的设备,在没有安装硬盘的情况下笔者对它的重量评价是:“一个人抬有点吃力,两个人抬绰绰有余”。安装操作非常简单:只需要将两根导轨安装并固定在标准机架后,再将存储轻放在导轨基座上并固定即可。全部的安装时间不会超过3分钟,相对来说算是集中式存储界的一股“清流”。

测试步骤二:初始化配置

笔者有幸在Homelab倒腾过PureStorage FlashArray的X20以及C40两款存储产品,总结下来FA的硬件初始化就分成几个简单的步骤:

  • 上架跳线加电自检;
  • 通过Console完成带外管理网络地址的分配;
  • 验证带外管理连通正常,使用pureuser账户登录后进行后续的一系列管理员配置操作。

测试步骤三:准备若干台服务器(虚拟机)作为性能测试客户端

如下图所示,我采用两台虚拟机同时运行vdbench执行性能测试脚本。

两台虚拟机各自分配16vCPU(2sockets,8cores/socket)、32GB内存,操作系统版本为CentOS7.6。至于为什么需要采用两台虚拟机同时运行,答案会在本篇博文的最后再向各位解释。回到测试用例本身,虽然两台虚拟机需要同时运行vdbench脚本,但真正的“控制台”只要一个。通常情况下,管理员可以通过SSH方式访问其中的一台虚拟机命令行,随后同时开启多台虚拟机的“vdbench联动”。这就需要管理员在进行测试之前准备以下工作:

上传vdbench.zip压缩包并解压到两台虚拟机相同的路径,如/root/vdbench;

默认情况下,当用户尝试使用SSH方式访问一台目标服务器的时候,系统会提醒管理员输入用户名和密码,如下图所示:

为了实现SSH免密登录,管理员需要创建RSA密钥对来实现这个需求。以本示例为例,管理员需要从控制台服务器172.20.11.150免密访问172.20.11.151服务器,因此需要在172.20.11.150服务器上通过ssh-keygen命令来创建一组公钥和私钥。
使用的命令很简单:
# ssh-keygen -t rsa

被创建的公钥和私钥默认保存路径是/root/.ssh,
其中公钥文件为:/root/.ssh/id_rsa.pub
私钥文件为:/root/.ssh/id_rsa

随后通过ssh-copy-id命令将172.20.11.150服务器的公钥复制到目标服务器172.20.11.151上;
# ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.20.11.151

如果管理员对SSH访问的方式想进一步加强安全管控,可以选择修改SSHD配置文件,将
PasswordAuthentication yes 改为
PasswordAuthentication no。

至此,虚拟机服务器的准备工作暂时告一段落,接下来需要在PureStorage C40的控制台上划分存储卷。

测试步骤四:使用Purity划分存储卷

Purity是用于管理PureStorage FlashArray C40的控制台,管理员只需要通过浏览器访问C40的管理地址就能访问Purity管理界面。
不过在执行存储卷的划分等操作之前,管理员首先需要确认测试用宿主机(本示例中为几台ESXi服务器)的WWPN;最简单的确认方式是登录vCenter控制台,选中需要查看WWPN的ESXi服务器,进入配置-存储-存储适配器,选中对应的HBA控制器后就能查看WWNN和WWPN号。

接下来访问Purity,划分出若干存储卷;为了能较好地模拟工作负载,笔者一共在C40上创建了十二个存储卷用于测试。
那么问题来了?和之前所提需要两台服务器做测试一样,采用十二个存储卷的原因会在后续给出。
管理员输入凭据后访问Purity,点击进入Storage-Volumes页面,再点击右上角的+号,就能打开存储卷添加向导;

管理员可以选择逐个添加存储卷,也可以遵循命名规范批量添加存储卷,如下图所示,笔者用统一的命名规范一次性添加了十二个存储卷用于vdbench测试,每个存储卷配额200GB空间。

此时无论是ESXi服务器还是测试用的虚拟机服务器还无法识别到这些刚创建的存储卷,接下来还需要进行几个操作;
首先,无论前端服务器是裸金属方式还是采用虚拟化方式,都需要在Purity界面以“主机”形式进行定义,点击进入Storage-Hosts,点击右上的+号添加主机;

管理员可以根据实际情况定义主机名称,但对于前端服务器采用ESXi虚拟化的场景来说,管理员需要选择“ESXi”作为“Personality”参数;

完成主机的添加操作后,点击这台主机的名称超链接,进入到主机配置界面完成后续的操作。
接下来需要为这台定义好的主机关联WWPN号;
配置的过程也非常简单,点击Host Ports右侧竖排的三个点,选择Configure WWNs;

在左侧的Existing WWNs中找到该服务器的WWPN号,然后点击右侧的+号,添加到右侧的Selected WWNs;

最后,需要将已经创建的存储卷关联到这台ESXi服务器,操作的方式是点击Connected Volumes右侧竖排的三个点,选择Connect…

系统会自动识别出可关联的存储卷,管理员选中后点击下方的Connect就完成了存储卷的关联。

至此,Purity管理界面侧的配置全部完成。

测试步骤五,SAN交换机完成Zone划分和激活

在笔者的环境中,FI融合交换机被配置成“SAN Switch模式”,因此类似Zone的划分和ZoneSet的激活均可以通过UI界面直观的完成。如果环境是主机/服务器-SAN交换机-SAN存储的架构,那么就需要在SAN交换机上完成类似的操作,具体的配置就根据环境的不同而有所区分了。本文不在这里做过多的演示和赘述。

测试步骤六,在ESXi服务器上完成虚拟机磁盘的挂载

NFS类型的外置存储暂且不论,我们知道无论是本地存储、SAN存储还是iSCSI存储,当其被配置成ESXi可使用的数据存储时,都会被格式化成“VMFS”文件系统。无论是NFS文件系统还是VMFS文件系统,虚拟机磁盘都会以VMDK的形式被保存。但本示例中,笔者将会用“裸磁盘映射”的形式为虚拟机添加磁盘。使用裸磁盘映射的理由是为了避开VMFS文件系统对测试结果可能造成的影响;在实际生产中,对于“独占”存储卷的场景来说(通常是数据库),也同样会采用裸磁盘映射的方式进行。
配置的步骤非常简单,首先编辑虚拟机设置,选择添加新设备-磁盘、驱动器和存储-RDM磁盘;

如果之前已经完成了上述所有的配置,那么在选择目标LUN的界面上就能看到十二块200GB的存储卷;选择其中的一个,点击确定后完成虚拟机一块磁盘的添加操作;在本实例中,第一台服务器172.20.11.150需要添加额外的八块RDM磁盘,而另一台服务器172.20.11.151需要添加额外的四块RDM磁盘。

最后在两台测试用虚拟机上,通过命令查看磁盘是否已经被正确添加,
# fdisk -l
新添加的磁盘会被标识为/dev/sd{x},x为顺序字母,第二块磁盘为sdb,第三块为sdc,以此类推……

至此,所有的准备工作完成,可以开始设置vdbench脚本参数执行性能测试了。

测试步骤七:设计测试脚本

在./vdbench文件夹下,创建一个测试脚本,笔者命名为wldtest001.txt;
参考配置如下:

# 对于多机环境,需要管理员定义hd(host define)参数
# 定义vdbench路径,多工作负载服务器之间可以通过ssh访问的有权限的账户
hd=default,vdbench=/root/vdbench,user=root,shell=ssh
# 定义工作负载服务器的命名以及IP地址,这里的服务器名只是为了vdbench脚本做标识,并非一定要和真实的服务器名对应
hd=host1,system=172.20.11.150
hd=host2,system=172.20.11.151
# openflags=directio即采用无缓冲缓存的方式执行读写操作,threads=18即单sd最大并发io为18,具体参数可根据CPU性能进行适当的调整
sd=default,openflags=directio,threads=18
# sd(storage define)参数,用于定义测试使用的存储设备,sd的命名只是标识,而host和lun必须和真实的环境对应起来
sd=sdb1,host=host1,lun=/dev/sdb
sd=sdb2,host=host1,lun=/dev/sdc
sd=sdb3,host=host1,lun=/dev/sdd
sd=sdb4,host=host1,lun=/dev/sde
sd=sdb5,host=host1,lun=/dev/sdf
sd=sdb6,host=host1,lun=/dev/sdg
sd=sdb7,host=host1,lun=/dev/sdh
sd=sdb8,host=host1,lun=/dev/sdi
sd=sdb9,host=host2,lun=/dev/sdb
sd=sdb10,host=host2,lun=/dev/sdc
sd=sdb11,host=host2,lun=/dev/sdd
sd=sdb12,host=host2,lun=/dev/sde
# wd(workload define)参数,定义工作负载参数,seekpct=random即随机寻道,rdpct=100即100%读,xfersize=8k即传输的数据大小,默认为4k,本次测试用例采用8k
wd=wd1,sd=sd*,seekpct=random,rdpct=100,xfersize=8k
# rd(run define)参数,定义运行时参数,iorate=max即最大工作速率运行io负载,本示例中采用100%的方式,因此iorate设置为max,warmup=10即预热时间,用于让测试结果更为精确的设置,以为这10以内的测试结果不纳入结果统计范畴,elapsed=600即测试运行10分钟,interval即每秒钟报告一次结果
rd=rd1,wd=wd1,iorate=max,warmup=10,elapsed=600,interval=1

说实话,笔者是第一次接触vdbench,许多参数的定义也只是摸着石头过河,各位朋友可以根据自己环境的实际情况和测试需求进行调整。

测试步骤八:设计测试脚本

完成脚本的定义后,执行测试并等待结果输出;
# ./vdbench -f ./wldtest001.txt

从测试的结果上看:
在笔者的环境中,8k工作负载100%的IOPS大部分都接近20万。通过一个简单的换算,不难得出有效带宽的数值:
有效带宽≈8KB*200,000=1,600,000KB=1,600MB=1,600*8Mbs=12.8Gbps,差不过80%最大带宽,应该是笔者环境的极限了
(其实笔者还测试过16k工作负载,虽然IOPS降低到100,000左右,但是有效带宽也就80%左右了)

上图中前两个样本的IOPS明显低于平均值,这也就是笔者在测试脚本中需要定义warmup的原因。

最后来说说为什么笔者采用两台测试用服务器+十二块硬盘来运行vdbench,原因是笔者一开始尝试用一台服务器+一块盘,测试IOPS差不多是25K左右,这意味着测试用例尚未对C40造成任何负载压力;于是笔者一度将硬盘加到十块,但发现硬盘超过八块之后,虚拟机服务器的CPU使用率持续增高,但IOPS变化不大,且从vCenter上查看虚拟机CPU的ready time,发现存在一定的争用,这又说明现在的瓶颈依旧不在C40,而是在测试服务器(虚拟机)本身;于是在设计两台服务器+合计十二块硬盘后,从结果上看差不多达到了笔者环境的极限。因此如果诸位在自己的环境尝试用vdbench进行数据存储性能测试的时候,需要根据实际情况来调整参数的设置。

笔者基于上述步骤进行了多组用例测试,想要了解更多PureStorage FlashArray高性能存储的信息可以关注笔者的公众号分享。