本发明涉及服务器存储领域,具体地说是一种快速检测数据存储链路稳定性的方法。
背景技术:
通常,随着互联网技术的快速发展,数据量雪崩式的增加,海量的数据需要存储,存储子系统作为数据存储的主要链路及媒介显得尤为重要;不仅需要巨大容量的云盘,而且对存储子系统链路的稳定性提出来了很高的要求。
服务器存储的整个链路主要包括以下几个部分:操作系统、驱动、中央处理器(CPU:Central Processing Unit)、SATA/SAS控制器。数据传输的链路是双向的;考虑到存储类服务器对硬盘数量的要求,有时还需要扩展硬盘接口,使得整个存储子系统链路上的元器件增加,伴随而来的则是整个存储链路的稳定性及可靠性的减弱。因此为了排除该方面的隐患,在部署数据中心之前首先要做的是检查存储链路的稳定性,而存储链路的不稳定性主要表现在硬盘存储的数据被破坏,即数据bit位被修改,由“0”变为“1”,或者由“1”变为“0”;而这种数据bit被修改是很难被发现的。
为克服该问题,本文提出一种快速检测数据存储链路稳定性的方法。
技术实现要素:
本发明的技术任务是提供一种快速检测数据存储链路稳定性的方法。
本发明的技术任务是按以下方式实现的,一种快速检测数据存储链路稳定性的方法,具体的方法步骤如下:首先,通过数据存储链路向硬盘内部写入数据;其次,通过同一条数据存储链路从硬盘内部读取数据;最后将写入的数据和读取的数据做比较,并将比对结果输出至屏幕,即可判断存储链路有无异常。
优选的,所述的数据存储链路包括中央处理器、PCIE-SWITCH转换芯片和HDD controller控制芯片以及硬盘;数据存储电路的传输过程如下:
中央处理器的一个PCIEX4经过一个PCIE-SWITCH转换芯片,转换为4个PCIEX1,每一个PCIEX1信号分别连接到一个控制器芯片上,进行协议转换为硬盘控制器,每一个硬盘控制器下面连接4个硬盘,这样数据就可以通过这条链路写入到硬盘里面,数据可被写入,也可被读取,整条存储链路是双向传输的。
优选的,当数据比特位被修改,由“0”变为“1”,或者由“1”变为“0”,将写入的数据和读取的数据作比较时,即可发现屏幕上的输出的比对结果显示两者不一致,从而判断出数据存储链路存在异常。
本发明的一种快速检测数据存储链路稳定性的方法和现有技术相比,有益效果如下:
1、通过系统下检测硬盘存储的数据bit是否发生翻转,可以直观的检测数据存储链路的稳定性;
2、可以快速的检测整个数据存储链路,包含链路中的元器件的稳定性,可以直观的看出存储链路是否有异常,方便快捷;
3、通过这种检测方案,提高了数据中心存储类服务器的稳定性及可靠性,进而提高了市场竞争力。
附图说明
附图1为数据存储链路的结构示意图。
具体实施方式
一种快速检测数据存储链路稳定性的方法,具体的方法步骤如下:首先,通过数据存储链路向硬盘内部写入数据;其次,通过同一条数据存储链路从硬盘内部读取数据;最后将写入的数据和读取的数据做比较,并将比对结果输出至屏幕,即可判断存储链路有无异常。
优选的,所述的数据存储链路包括中央处理器、PCIE-SWITCH转换芯片和HDD controller控制芯片以及硬盘;
如图1所示,为数据存储链路示意图。其中CPU是中央处理器;PCIE-SWITCH和HDD controller是两个不同功能的集成电路芯片;HDD表示硬盘。CPU的一个PCIEX4经过一个PCIE-SWITCH转换芯片,转换为4个PCIEX1;每一个PCIEX1信号分别连接到一个控制器芯片上,进行协议转换为HDD控制器;每一个HDD控制器下面链接4个HDD,这样数据就可以通过这条链路写入到硬盘里面;数据不只是被写入,还有被读取,因此整条存储链路是双向传输的。
由于数据传输链路是双向的,写入硬盘的数据可以通过原来的存储链路读取出来;如果整个数据存储链路以及链路上的元器件本身没有异常,写入硬盘的数据是不会发生改变的。因此,我们就可以对硬盘写入固定的数据,比如全写“0”,然后读取硬盘数据,最后将读取出来的数据与原来的数据进行对比,并且输出对比结果至屏幕,这样,我们就可以直观的看出链路有无异常,就可以把潜在隐患扼杀在数据中心部署之前。
实施例1:
为清楚的说明本文所提出一种快速检测数据存储链路稳定性的方法的实现情况,结合图1来说明实现步骤。具体如下:
1)在操作系统下,对硬盘写入固定的数据;
2)在操作系统下,从硬盘中读取其中的数据;
3)最后,自动对比写入和读取的数据,并将对比结果中数据不一致的数据位输出至屏幕上。
4)具体的实现代码如下:
#define _GNU_SOURCE
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include <stdlib.h>
#include <errno.h>
staticmode_t mode = 0655;
static void printf_buf(const void *buf, intbuf_size)
{
int i;
for (i = 0; i <buf_size/4; i++) {
intval = (int)*((int *)buf +i);
if (val) {
printf("@%d", i);
if (val != 0x400)
printf(":%d", val);
printf(" ");
}
}
printf("\n");
}
staticintfill_file_by_buffer(const char *path, const void *wbuf,
intbuf_size, intio_cnt, int direct)
{
int i, fd, ret;
int err = 0;
int flags;
if (direct)
flags = O_DIRECT | O_RDWR | O_CREAT;
else
flags = O_RDWR | O_CREAT;
fd = open(path, flags, mode);
//lseek(fd, 0, SEEK_SET);
for (i = 0; i <io_cnt; i++) {
ret = write(fd, wbuf, buf_size);
if (ret < 0)
err = ret;
}
//fdatasync(fd);
close(fd);
return err;
}
staticintcheck_file_by_buffer(const char *path, const void *wbuf,
void *rbuf, intbuf_size,
intio_cnt, int direct)
{
int i, fd, ret;
int err = 0;
int flags;
if (direct)
flags = O_DIRECT | O_RDWR;
else
flags = O_RDWR;
fd = open(path, flags);
//lseek(fd, 0, SEEK_SET);
for (i = 0; i <io_cnt; i++) {
ret = read(fd, rbuf, buf_size);
if (ret < 0) {
printf("read error %d %d\n", ret, i);
err = ret;
break;
}
if (memcmp(wbuf, rbuf, buf_size) != 0) {
printf("mismatch @ %d\n", i);
//printf_buf(wbuf, buf_size);
printf_buf(rbuf, buf_size);
}
}
close(fd);
return err;
}
staticintcheck_disk_ram(const char* path, const void *wbuf, void *rbuf,
intbuf_size, intio_cnt)
{
int ret1, ret2;
int ret3 = 0, ret4 = 0;
ret1 = fill_file_by_buffer(path, wbuf, buf_size, io_cnt, 0);
ret2 = check_file_by_buffer(path, wbuf, rbuf, buf_size, io_cnt, 1);
if (ret1 || ret2)
printf("check by buffer write error\n");
/*
ret3 = fill_file_by_buffer(path, wbuf, buf_size, io_cnt, 1);
ret4 = check_file_by_buffer(path, wbuf, rbuf, buf_size, io_cnt, 1);
if (ret3 || ret4)
printf("check by direct write error\n");
*/
return ret1 || ret2 || ret3 || ret4;
}
int main(intargc, char *argv[])
{
intcnt;
void *wbuf0, *wbuf1, *rbuf;
int err;
intbuf_size = 4096 * 16; // 64K
intrcnt = atoi(argv[1]);
char *path0 = argv[2];
char *path1 = argv[3];
//char *path0="/home/disk6/test_zero.txt";
//char *path1="/home/disk6/test_one.txt";
intio_cnt = 1024 * 8; // 512M
printf("%d %s %s\n", rcnt, path0, path1);
wbuf0 = malloc(buf_size);
wbuf1 = malloc(buf_size);
rbuf = memalign(buf_size, buf_size);
if (!wbuf0 || !wbuf1 || !rbuf)
return -ENOMEM;
memset(wbuf0, 0, buf_size);
memset(wbuf1, 0xff, buf_size);
for (cnt=0;cnt!=rcnt;cnt++) {
printf("%d:\n", cnt);
err = check_disk_ram(path0, wbuf0, rbuf, buf_size, io_cnt);
if (err) {
printf("check write 0 error %d\n", cnt);
break;
}
sleep(1);
}
}
这样,本文提出一种快速检测数据存储链路稳定性的方法即可得以实现。本文提出一种快速检测数据存储链路稳定性的方法,在服务器存储数据之前对链路稳定性进行检测。具体方法为:首先,系统下通过存储链路向硬盘内部写数据;其次,同样通过存储链路从硬盘内部读取数据;最后将写入的数据和读取的数据做比较。这种方法能够对所有存储链路上的器件进行检测,一旦有某个子链路或者某个元器件有故障,第一时间就可以发现,将潜在的隐患扼杀在数据中心部署之前。
通过上面具体实施方式,所述技术领域的技术人员可容易的实现本发明。但是应当理解,本发明并不限于上述的几种具体实施方式。在公开的实施方式的基础上,所述技术领域的技术人员可任意组合不同的技术特征,从而实现不同的技术方案。