本发明涉及计算机服务器技术领域,尤其涉及一种硬盘性能稳定性的测试及展现方法。
背景技术:
随着it领域技术的不断发展,传统信息化服务以及日趋强大的云计算服务对服务器的存储需求越来越高。硬盘的性能稳定性作为服务器的一项重要指标,越来越被重视。这要求服务器在7*24小时的工作下,能够保证硬盘的性能维持在满足需求的位置,不能够出现忽高忽低的现象,这将影响服务器上运行的业务的性能,也是不利于硬盘本身的健康的。所以在服务器测试阶段,对硬盘的性能稳定性的测试就是必须的了。
以前的测试只关注硬盘性能的均值满足需求即可,没有整个运行过程的实时值的监控和处理、对比的测试。
技术实现要素:
为了解决以上技术问题,本发明提出了一种硬盘性能稳定性的测试及展现方法。具体地说是一种实用性强,可以自动化进行硬盘性能稳定性测试并将结果进行处理以便对比的方法。
本发明引入了一致性的测试概念:在性能均值的上下10%(此值可调)范围内的运行时间占总运行时间的比例。使用一致性对测试结果进行处理能够反映性能稳定性的好坏。
本发明的技术方案是:
一种硬盘性能稳定性的测试及展现方法,其具体实现过程为:
1、安装配置测试所需要的工具(fio、python等)和文件。
2、根据输入要测试的盘符,自动修改测试配置文件。
3、使用fio搭配预定的测试参数自动挨个对指定的硬盘进行性能测试,使用fio自带的write_iops_log和write_bw_log参数实时输出当前的性能值到指定命名对应的文件中存储。
4、性能测试完成后,对测试结果文件中的结果进行处理。根据一致性的概念,需要计算出测试总时间内性能的均值i,然后将每一个实时值j与计算出来的i进行比对,看是否超出了i±i*10%(此处的10%可调,根据实际需求进行更改)。如果超出了标准,则此实时值j算作不合格;如果没超出标准,则此实时值j算作合格。最后计算一下合格的总的数量,看占到总测试实时值的比例是多少(具体达标的比例根据实际需要更改)。
5、将结果用图表展现。获取所有的实时值,将所有的值按照时间顺序画成一个折线图。然后将前述计算得到的标准i±i*10%画成两条直线。这样三条线在一个图里面,就能够清楚的看到在哪些时间点出现了不在两条直线之间的值,即不符合标准的值。同时在图上将最大值、最小值、平均值、一致性的值、上下限的值根据第四步算出来之后自动添加到图片上显示。
本发明借助fio和python能够自动化的进行硬盘性能测试,并记录实时的性能值,然后将生成的结果进行处理,以图形化的方式展现出来。硬盘性能稳定性是否满足,一目了然。
附图说明
图1是本发明的流程示意图;
图2是最后生成的图片样例示意图。
具体实施方式
下面对本发明的内容进行更加详细的阐述:
1、安装测试所需要的python以及软件包。借助pip工具将所需要的软件包离线安装,不需要连接网络。
#!/bin/bash
root_dir=`pwd`
tar-zxfpython-2.7.12.tgz
tar-zxfsetuptools-28.8.0.tar.gz
tar-zxfpip-9.0.1.tar.gz
cdpython-2.7.12
./configure
make
makeinstall
cd$root_dir/setuptools-28.8.0
python2.7setup.pyinstall
cd$root_dir/pip-9.0.1
python2.7setup.pyinstall
cd$root_dir
pipinstall--no-index--find-links="offline/"-rrequirments.txt
echo"setenvironmentsuccefully!"
2、根据指定的盘符自动修改fio测试的配置文件。测试预设了六个配置文件,["seqprecondition.fio","seqwrite.fio","seqread.fio","randomprecondition.fio","randomwrite.fio","randomread.fio"],里面的filename=xxx为指定盘符测试参数。如下步骤自动去对这六个文件进行修改。
defchange_devicename(filename_test):
pattern=re.compile(r"filename=.*")
file_under_filter=open(filename_test,mode='r')
text_under_filter=file_under_filter.read()
file_under_filter.close()
new_text=re.sub(pattern=pattern,repl="filename=%s"%sys.argv[1],string=text_under_filter)
file_under_filter=open(filename_test,mode='w')
file_under_filter.write(new_text)
file_under_filter.close()
if__name__=='__main__':
filename_test_list=["seqprecondition.fio","seqwrite.fio","seqread.fio","randomprecondition.fio","randomwrite.fio","randomread.fio"]
foritem_change_devicenameinfilename_test_list:
change_devicename(item_change_devicename)
3、使用fio进行一致性测试,并保存测试结果。测试结果根据当前测试项目的名字自动命名。如测试项目为seqread.fio,则结果文件为seqread.fio.result
defget_data(filename_test,filename_result):
filename_display="%s.result"%filename_test
fio_process=subprocess.call("./fio%s>>results/%s"%(filename_test,filename_display),shell=true)
iffio_process==0:
print"run%ssuccessfully!"%filename_test
else:
print"fiorunfail!pleasecheck!"
4、测试结束之后,对测试结果进行处理:
#将测试结果全部读取入内存列表
iffilename_result!="none":
data_list_temp=[]
data_time=[]
data_over_list=[]
filename_to_filter=os.path.join("results",filename_result)
file_data=open(filename_to_filter,mode='r')
foritem_file_datainfile_data:
ifitem_file_data!=os.linesep:
data_data=item_change_devicename.split(',')[1]
data_list_temp.append(int(data_data.strip()))
#获取测试最后的2700个测试值
data_list_temp.reverse()
data_list=data_list_temp[:2700]
data_list.reverse()
length=len(data_list)
foriinrange(1,length+1):
data_time.append(i)
#计算平均值
average_data=float(sum(data_list))/float(len(data_list))
#计算一致性要求的±10%的上下限
data_high=average_data*1.1
data_low=average_data*0.9
#获取最大值和最小值,以及其所在的时间点
data_higest=max(data_list)
index_higest=data_list.index(data_higest)
data_lowest=min(data_list)
index_lowest=data_list.index(data_lowest)
#获取超出±10%的范围的测试值,并计算其数量
foritem_dataindata_list:
ifitem_data<=data_loworitem_data>=data_high:
data_over_list.append(item_data)
#计算一致性,并保留3位小数。
data_yizhixing=1-round(float(len(data_over_list))/float(len(data_list)),3)
#开始画图
data_x=numpy.array(data_time)
data_y=numpy.array(data_list)
data_high_list=[]
data_low_list=[]
forcountinrange(len(data_list)):
data_high_list.append(data_high)
data_low_list.append(data_low)
filename_to_write=filename_test.split('.')[0]
figure_1=plyt.figure(filename_to_write)
figure=figure_1.add_subplot(111)
plyt.title(filename_to_write)
#将所有测试值依据时间顺序画折线图
plyt.plot(data_x,data_y,color='red')
#画出上限
plyt.plot(data_x,numpy.array(data_high_list),color='blue')
#画出下限
plyt.plot(data_x,numpy.array(data_low_list),color='blue')
#添加上限注释
figure.annotate('high=%s'%data_high,xy=(1000,data_high),xytext=(1500,data_high))
#添加下限注释
figure.annotate('low=%s'%data_low,xy=(1000,data_low),xytext=(1500,data_low))
#添加平均值注释
figure.annotate('average=%s'%average_data,xy=(1000,average_data),xytext=(1500,average_data))
#添加一致性注释
figure.annotate('yizhixing=%s'%data_yizhixing,xy=(200,average_data),xytext=(300,average_data))
#添加最高点注释
figure.annotate('highest(xy)=(%s,%s)'%(index_higest,data_higest),xy=(index_higest,data_higest),xytext=(index_higest,data_higest))
#添加最低点注释
figure.annotate('lowest(xy)=(%s,%s)'%(index_lowest,data_lowest),xy=(index_lowest,data_lowest),xytext=(index_lowest,data_lowest))
time.sleep(1)
#将图片保存到results文件夹中
filename_to_write_all=filename_to_write+'_image.png'
filename_to_save=os.path.join("results",filename_to_write_all)
figure_1.savefig(filename_to_save)
if__name__=='__main__':
iflen(sys.argv)!=2:
print"usage:python2.7filter_perf_ssd/dev/sdxor/dev/nvme0n1"
sys.exit(1)
devicename_to_test=sys.argv[1]
filename_test_list=["seqprecondition.fio","seqwrite.fio","seqread.fio","randomprecondition.fio","randomwrite.fio","randomread.fio"]
filename_result_list=["none","seqwrite_bw.1.log","seqread_bw.1.log","none","randomwrite_iops.1.log","randomread_iops.1.log"]
print"begintotest%s"%devicename_to_test
#记录开始时间
print"begintimeis%s"%time.strftime('%y-%m-%d%h:%m:%s',time.localtime(time.time()))
ifos.path.exists("results")andos.path.isdir("results"):
shutil.rmtree("results")
os.mkdir("results")
forindex,iteminenumerate(filename_test_list):
print"begintotest%s"%item
get_data(item,filename_result_list[index])
#记录结束时间
print"endtimeis%s"%time.strftime('%y-%m-%d%h:%m:%s',time.localtime(time.time()))。