技术领域
本发明涉及到存储器测试技术,具体的说是一种测试RAID存储器IO的SAS端口带宽的方法。
背景技术:
RAID(Redundant Arrays of Independent Disks,磁盘阵列)存储器是一种廉价的磁盘冗余阵列,能够提供一个独立的大型存储设备解决方案。RAID中利用个别磁盘提供数据所产生加成效果,提升整个磁盘系统效能,提高了硬盘系统容量、速度,使数据更加安全,更加易于磁盘的管理。当任意一个磁盘故障时,仍可读出数据,在数据重构时,将数据经计算后重新置入新硬盘中。
RAID存储器具有分块技术:把数据分块写到阵列中的磁盘上;交叉技术:对分布式的数据采用交叉式进行读写,提高访问速度;重聚技术:对多个磁盘空间重新编址,数据按照编址后的空间存放。RAID存储器主要特点如下:1、物理上多个磁盘,但操作系统看是一个逻辑磁盘;2、数据分布在磁盘阵列中的磁盘存储器上;3、采用冗余技术和校验技术提高可靠性,可恢复数据;4、RAID速度快、容量大、功耗低、价格便宜、容易扩展。RAID磁盘阵列支援自动检测故障硬盘、重建硬盘坏轨的资料、支持不须停机的硬盘备援HotSpare,并支持不须停机的硬盘替换HotSwap、扩充硬盘容量等。
目前随着IT领域技术的不断发展,鉴于RAID存储器具有诸多优点,成为大数据时代的主流产物,也随着涉足领域的逐渐增多,市场存储器需求量逐渐增大。公司存储器出货量越来越大,能够按时的达成生产排配准时出货,不但关系到公司的信誉也代表一个公司的生产能力,同时也影响着客户的满意度。企业注重生产速度的同时也要求品质有保障,对于研发及生产的测试要求越来越高。无论是研发段还是生产线的测试,产品的测试能够高效的完成是至关重要的一个环节。
针对存储器的测试,进行自动化的切入是必要的;所以对RAID存储器IO的SAS端口带宽测试是极为重要的一个测试环节。然而,目前RAID存储器IO的SAS端口带宽测试一直是一个人工操作的项目,需要大量人为操作参与进来,这就不可避免的出现由于人为因素造成的失误,致使测试不准确,测试时间长效率低,又不会产生测试log,测试管控不够全面,产品品质得不到保障。
技术实现要素:
本发明针对目前技术发展的需求和不足之处,提供一种测试RAID存储器IO的SAS端口带宽的方法。
本发明所述一种测试RAID存储器IO的SAS端口带宽的方法,解决上述技术问题采用的技术方案如下:所述一种测试RAID存储器IO的SAS端口带宽的方法,在linux系统下,使用perl语言编写的自动化脚本,基于FIO,通过SAS线对端口的带宽进行测试;主要包括如下步骤:1)扫描存储器中I/O的序列号,2)自动判断I/O类型并自动加载驱动脚本,3)硬件检测,4)设置上下I/O的IP;设置系统下成功后重启I/O;5)检测I/O的IP设置是否成功,6)执行IO SAS端口的带宽测试。
优选的,使用SAS线、网线、串口线将存储器与服务器连接好,并在服务器端装好测试的自动化脚本。
优选的,所述步骤2)自动判断I/O类型并自动加载驱动脚本,若加载成功自动化脚本继续,加载失败打印error,处理异常后重新执行自动化脚本。
优选的,所述步骤3)硬件检测,通过串口线及SAS线抓取信息,自动判断服务器与存储器的连接状态及各个模块的在位状况,若状态都正常则继续运行,若判断出存储器端及服务器端有异常则会在终端报错“test fail”,同时打印error信息,排除问题后继续重新测试。
优选的,所述步骤5)检测I/O的IP设置是否成功,若成功则继续进行下步测试,不成功则结束,终端打印出error信息;然后排除异常重新测试。
优选的,所述步骤6)执行IO SAS端口的带宽测试;若带宽测试正常,则继续测试,若带宽达不到标准则测试停止,终端打印出error信息,解决异常问题后重新测试。
优选的,端口测试执行2h,期间若测试fail,终端打印error信息后测试停止,解决异常问题后重新测试;若测试 pass,打印test pass,测试结束。
本发明所述一种测试RAID存储器IO的SAS端口带宽的方法与现有技术相比具有的有益效果是:本发明通过linux 下perl 语言所编写的自动化脚本,测试全程自动化执行,并保存测试log,减少了不必要的人机交互过程,节省人力、时间、成本等资源,提高了测试效率和准确性,同时测试的覆盖率极高,确保产品出货质量;该方法操作简单,无需经验也可完成相关操作,任何的问题产品都会被拦截下来并准确定位问题,可应用于大多数存储器产品,具有较好的推广使用价值。
附图说明
附图1为所述一种测试RAID存储器IO的SAS端口带宽的方法的实施流程图。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚明白,以下结合具体实施例,对本发明所述一种测试RAID存储器IO的SAS端口带宽的方法进一步详细说明。
实施例:
本实施例所述测试RAID存储器IO的SAS端口带宽的方法,是在linux下基于FIO测试存储器中RAID类型的IO的SAS端口带宽,使用perl语言编写的自动化脚本,基于FIO,通过SAS线对端口的带宽进行测试;并将产生的测试log 打印在终端,同时也保存在服务器上,让测试有绝对的保障。所述FIO是一个I / Oc测试工具,用于基准测试和压力/硬件验证,它支持多种不同类型的I / O引擎,诸如sync,mmap,libaio,posixaio,SG v3,splice,null,network,syslet,guasi,solarisaio等,它可以在块设备以及文件上工作。
附图1为所述测试RAID存储器IO的SAS端口带宽的方法的实施流程图,如附图1所示,该方法的具体实施过程如下:
1、搭建硬件测试环境;准备好HBA card、SAS线、网线、串口线、HDD等物料后,将存储器与服务器连接好;
搭建软件测试环境;服务器端装好测试自动化脚本(挂载U盘mount /dev/sdb4 /mnt ; 复制即可cp /mnt/port_chk /usr/local/bin/Neptune/;);
2、系统下执行自动化脚本(加执行权限chmod +x port_chk;执行命令./port_chk);log同步生产(log会自动写在以时间命名的文件夹中,路径可以自己通过配置文件指定;脚本中断log自动结束);
3、扫描存储器中I/O的序列号,自动化脚本根据序列号在数据库中调出相关数据;
print "Please scan uiom sn[]: ";
chomp($uiom_sn=<STDIN>);
4、自动判断I/O类型并自动加载驱动脚本,加载成功自动化脚本继续,加载失败打印error,处理异常后重新执行自动化脚本;
sub load_driver;
if($fc) {`modprobe mptfc`} --FC类型的I/O
if($sas){`modprobe mptsas`} ---SAS类型的I/O;
5、硬件检测,通过串口线及SAS线抓取信息,自动判断服务器与存储器的连接状态及各个模块的在位状况(包括HDD,SAS线、FC线的连接状态,IO的状态),若状态都是OK的会继续运行,若判断出存储器端及服务器端有异常则会在终端报错“test fail”,同时打印error信息,排除问题后继续重新测试;
sub get_device
my ($encl) = @_;
my @sg_map = `sg_map -x -i`;
登串口:
@MCports = ();
@FUports = ();
for (1..$expectedUUTs) {
my $slot = $_;
for (A,B) {
my $ctrl = $_;
my $mc = getConfig("uut$slot.ctrltest.ctrl$ctrl.com2");
my $fu = getConfig("uut$slot.ctrl$ctrl.fu");
push @MCports, $mc;
push @FUports, $fu;
6,设置上下I/O的IP;设置系统下成功后重启I/O;
if($is_iscsi and $restarting) {
# setting new iSCSI IPs seems to help iscsi reliability
printout("both","\nSetting new IPs on all controllers...\n\n");
} else {
printout("both","\nSetting unique IPs on all controllers...\n\n");
}
}
if ($ctrl eq 'a') { $last = '1' } else { $last = '2' }
$set_ip_address = "10.0.0." . $slot . $last;
7、检测I/O的IP设置是否成功,成功则继续进行下步测试,不成功则脚本结束,终端打印出error信息;然后排除异常重新测试;如果IP设置成功则继续下一步测试;
unless($noSetup == 1){
unless(set_and_verify_ip_address($ctrl)) {
printout("both","ERROR ! Could not set Controller $Ctrl on $mc to IP address $set_ip_address\n");
exit(1);
8、执行IO SAS端口的带宽测试;若带宽测试正常,则继续测试,若带宽达不到标准则测试停止,终端打印出error信息,解决异常问题后重新测试;
foreach(@FIO_RESULTS) {
dprint("[$sgstr]:$_");
if ( $_ =~ /io\-1/ ) { $fionum = 1;
}elsif( $_ =~ /io\-2/ ) { $fionum = 2;
$fiobw = ( split /bw\=/, $_ )[1];
$fiobw = ( split //s/, $fiobw )[0];
if( $fiobw =~ /MiB/, $fiobw ){
$fiobw = 1 * ( split /MiB/, $fiobw )[0];
9、端口测试执行2h,期间若测试fail,终端打印error信息后测试停止,解决异常问题后重新测试;若测试 pass,打印test pass,测试结束。
本实施例所述测试RAID存储器IO的SAS端口带宽的方法,所使用的自动化脚本的具体内容如下:
foreach(@FIO_RESULTS) {
dprint("[$sgstr]:$_");
if ( $_ =~ /io\-1/ ) { $fionum = 1;
}elsif( $_ =~ /io\-2/ ) { $fionum = 2;
}elsif( $_ =~ /io\-3/ ) { $fionum = 3;
}elsif( $_ =~ /io\-4/ ) { $fionum = 4;
}elsif( $_ =~ /read\s+\:/ or $_ =~ /write\:/ ){
$fiobw = ( split /bw\=/, $_ )[1];
$fiobw = ( split //s/, $fiobw )[0];
if( $fiobw =~ /MiB/, $fiobw ){
$fiobw = 1 * ( split /MiB/, $fiobw )[0];
}elsif($fiobw =~ /KiB/, $fiobw ){
$fiobw = 0.001 * ( split /KiB/, $fiobw )[0];
}else{
$fiobw = 0;
}
$fioio = ( split /io\=/, $_ )[1];
$fioio = ( split /bw/, $fioio )[0];
if( $fioio =~ /MiB/, $fioio ){
$fioio = ( split /MiB/, $fioio )[0];
$fioio =~ s/\,//g;
$fioio = 1 * $fioio ;
#测试端口带宽
sub load_driver {
#fill something
if($fc) {`modprobe mptfc`}
if($sas){`modprobe mptsas`}
@lsmod_out=`lsmod | grep mptsas`;
until(@lsmod_out) {
printout("both","SAS driver not loaded\n");
printout("both","loading SAS driver...\n");
system("modprobe mptsas");
sleep 5;
@lsmod_out=`lsmod | grep mptsas`;
}
#加载IO的驱动
$CS::failSub=\&serialWarn;
$tmpUUTs=0;
$CS::no_close = 0;
#调用数据包,进入串口;
if($defaultsOnly) {
printout("both","detecting attached controllers...\n");
} else {
if($is_iscsi and $restarting) {
# setting new iSCSI IPs seems to help iscsi reliability
printout("both","\nSetting new IPs on all controllers...\n\n");
} else {
printout("both","\nSetting unique IPs on all controllers...\n\n");
}
}
if(not $defaultsOnly) {
unless(boldly_go($mc)) { exit(1) }
@FDE = CS::serial("set fde-state repurpose", "#"); # harmless if MC CLI don't support
printout("log","'set fde-state repurpose' result:\n@FDE");
unless($noSetup == 1){
unless(set_and_verify_ip_address($ctrl)) {
printout("both"," ERROR ! Could not set Controller $Ctrl on $mc to IP address $set_ip_address\n");
exit(1);
}
}
$ip_address = CS::get_ip($ctrl);
printout("log"," Controller $Ctrl on $mc IP address set to $ip_address (mcIndex=$mcIndex)\n");
}
#设置IO 的IP。
上述具体实施方式仅是本发明的具体个案,本发明的专利保护范围包括但不限于上述具体实施方式,任何符合本发明的权利要求书的且任何所属技术领域的普通技术人员对其所做的适当变化或替换,皆应落入本发明的专利保护范围。