为了理解SmartCloud环境中的短暂存储性能,我们使用vdbench设置了一项基准测试。vdbench是一个I/O工作负载生成器,用于验证数据完整性和度量直接附加和网络连接的存储的性能。它是一个免费的工具,容易使用,而且常常用于测试和基准测试。
我们得出的结论是,缓存是I/O基准测试中的一个重要元素。本文介绍我们设置基准测试的步骤并展示结果。但是首先我们会简要介绍我们使用的以下产品和工具。
首先从SmartCloud开始,这是一个以基于内核的虚拟机(KVM)为基础构建的公共云服务,是x86架构上的Linux的一个全面的虚拟化解决方案。SmartCloud是一个完整的基础架构即服务(IaaS)产品。可将它用作构建平台即服务(PaaS)和软件即服务(SaaS)解决方案的基础。
SmartCloud的关键特性包括:自助配置虚拟服务器机器和虚拟存储空间(持久性存储)网络功能即用即付的结算策略自动配置资源开放API可用于开发脚本和软件来增强自动化VM大小涵盖从一个虚拟CPU和2GB内存到16个CPU和32GBRAM。Windows和Linux操作系统都可部署,包括RedHatEnterpriseLinux和SUSELinux。
在我们的基准测试中,我们将重点看看短暂存储。
我们使用vdbench来测试原始磁盘和文件系统。它有一个Web用户界面可显示详细的性能报告。vdbench由SunMicrosystems的HenkVandenbergh开发,以前称为StorageTek。vdbench是使用Java编写的。它在Solaris、Windows、HP-UX、AIX、Linux、MacOSX、zLinux和原生VMware上经过了测试。
在我们的基准测试中,我们通过使用RedHatLinux配置一个VM来创建短暂存储。它类似于下图:
您应该已安装并正在运行SmartCloud。接下来,您必须分配一个虚拟块设备和一个ext3文件系统,然后安装vdbench。
以下代码将分配一个虚拟块设备:
[idcuser@vhost1291~]$sudoddif=/dev/urandomof=fs_1GB.ext3bs=512count=2097152oflag=sync,direct[idcuser@vhost1291/]$sudochmod664fs_1GB.ext3[idcuser@vhost1291/]$sudomkfs-text3-qfs_1GB.ext3fs_1GB.ext3isnotablockspecialdevice.Proceedanyway(y,n)y[idcuser@vhost1291/]$sudomount-text3-osync,loopfs_1GB.ext3/mnt/fs_mount[idcuser@vhost1291mnt]$fdisk-lfs_1GB.ext3Disk/fs_1GB.ext3:0MB,0bytes255heads,63sectors/track,0cylindersUnits=cylindersof16065*512=8225280bytesSectorsize(logical/physical):512bytes/512bytesI/Osize(minimum/optimal):512bytes/512bytesDiskidentifier:0x00000000Disk/fs_1GB.ext3doesn'tcontainavalidpartitiontable[idcuser@vhost1291/]$sudoumount-l/mnt/fs_mount/[idcuser@vhost1291/]$sudolosetup-d/dev/loop0安装vdbench现在是时候下载和安装vdbench。
[root&vhost4377idcuser]#mvvdbench502.zip/var/www/html/[root&vhost4377idcuser]#cd/var/www/html/[root&vhost4377html]#mkdirvdbench502[root&vhost4377html]#unzipvdbench502.zip–dvdbench502/[root&vhost4377html]#cdvdbench502要运行该工具,您需要安装Java运行时环境,在本例中安装OracleJDK。清单4.安装Java运行时环境[idcuser&vhost4377~]$sudo–s|cd[root&vhost4377~]#wget[root&vhost4377~]#rpm–ivhjdk-7u3-linux-i586.rpm[root&vhost4377~]#vi.bashrcJAVA_HOME=/usr/java/jdk1.7.0_03CLASSPATH=.:$JAVA_HOME/lib/tools.jarPATH=$JAVA_HOME/bin:$PATHexportJAVA_HOMECLASSPATHPATH[root&vhost4377~]#source.bashrc启动基准测试之前,使用默认的参数检查安装是否成功完成。[root&vhost4377vdbench502]#./vdbench-t编写一个parmfile要更详细地控制工具参数,编写一个parmfile,您可在其中指定不同的选项。
对于一个虚拟块设备
对于一个虚拟块设备,配置以下参数:
HD:主机定义
SD:存储定义
WD:工作负载定义
RD:运行定义
对于一个文件系统
对于一个文件系统,配置以下参数:
HD:主机定义。与虚拟块设备相同。
FSD:文件系统定义
FWD:文件系统工作负载定义
运行之后的输出文件夹文件
每次运行后,vdbench会创建一个包含以下文件的输出文件夹:
我们运行了3个不同的测试。
在第一个测试中,使用一个parmfile定义对单个原始磁盘的单次运行测试。
名为sd1的存储指向大小为4MB的设备/dev/rdsk/c0t0d0s0。
定义了工作负载wd1来在存储sd1上运行,其中读取操作占100%,每个操作涉及到一个4KB数据块。
定义了运行,以100个操作/秒的速度使用工作负载wd110秒。
*SD:StorageDefinition*WD:WorkloadDefinition*RD:RunDefinition*sd=sd1,lun=/dev/rdsk/c0t0d0s0,size=4mwd=wd1,sd=sd1,xfersize=4096,readpct=100rd=run1,wd=wd1,iorate=100,elapsed=10,interval=1*Singlerawdisk,100%randomreadof4KBblocksatI/Orateof100for10seconds测试2在此测试期间,parmfile定义了对一个文件系统和对远程主机129.35.213.249的一次测试。HD包含安装在远程主机上的vdbench的完整路径,以及用于通信的shell(ssh或ownrsh)。
在本例中,vdbench表示rsh。User=root是拥有远程主机上的进程的用户。文件系统的定义支持创建一个包含3个级别的结构,每个级别包含两个目录和两个文件(借助于选项distribution=all)。工作负载包含80%的读取操作(20%的写入操作)、一个随机文件选择操作和随机文件I/O。操作涉及到4KB的数据块。
该运行以最大速率使用此工作负载600秒,每秒抽样一次并在启动时格式化文件系统。
hd=resource1,system=129.35.213.249,vdbench=/var/www/html/vdbench,shell=vdbench,user=rootfsd=fsd1,anchor=/fs,width=2,depth=3,files=2,distribution=all,size=4m,openflags=(o_dsync,o_rsync)fwd=fwd1,fsd=fsd1,host=resource1,xfersize=4096,operation=read,rdpct=80,fileselect=random,fileio=random,threads=1rd=run1,fwd=fwd1,fwdrate=max,format=yes,elapsed=600,interval=3测试3在此测试中,parmfile定义一个要在其中执行测试的SmartCloud主机。存储是一个临时创建的1GB大的虚拟块设备,称为disk1.raw。
所有设置都以再现最坏的情形(没有任何命中区域)为导向,以加快响应速度,使用open-flags来打开文件或设备以避免使用缓冲区缓存(o_direct)。
工作负载定义强化了同时避免读取和写入命中(rhpct=0whpct=0)的概念,随机寻道百分比为100%。该测试执行11次,每次按照一条定义的曲线执行1500秒。第一次运行尝试发现最大的i/o速率。其他运行将I/O速率增加10%,一直从10增加到100。每次运行生成一个具有指数分布的工作负载。
hd=resource1,system=129.35.209.189,vdbench=/var/www/html/vdbench503,shell=vdbench,user=rootsd=sd1,lun=/home/idcuser/disk1.raw,hitarea=0m,offset=32256,openflags=o_directwd=wd1,sd=sd1,host=resource1,xfersize=4096,rdpct=40,rhpct=0,whpct=0,seekpct=100rd=run1,wd=wd1,iorate=curve,curve=(10-100,10),format=yes,elapsed=1500,warmup=18,distribution=exponential,pause=60,interval=6,threads=1基准测试分析中使用的VM包括:
测试带来了哪些问题?我们学到了什么?
缓存是I/O基准测试中的一个关键方面。缓存是一个非常难以处理的变量,因为它依赖于许多因素。缓存影响着读取/写入性能,但只有在多次访问单个数据块或在启用了延迟写入时。
有时您可能对存储设备的真实和机械性能感兴趣,测试使用它的最糟情形。为此,每个操作系统都允许使用不同规则打开一个文件。
借助O_DIRECT,对于用户空间缓冲区传递给读取/写入系统调用[一个]参数来调用的物理内存,内核会直接从/向它执行DMA。所以用户空间内存与内核缓存之间的复制不会花费CPU和内存带宽(比如缓存查找、每页锁定等)。
这无疑适用于一种经典的基础架构,如图9所示。
如图10所示,使用SmartCloud创建的虚拟化基础架构上会发生什么?
在这些测试期间,我们认识到,禁用缓存支持在几乎所有情形中都不是一种好的选择。禁用缓存只能用于基准测试用途。
在我们的研究中,我们的想法是发现一个虚拟化的共享云基础架构的行为:如果启用了缓存,性能可能类似于一种专用的私有虚拟基础架构。
在云环境中,其他客户端的使用会影响到许多无法预测的变量;这一般会影响I/O性能。