本發(fā)明涉及服務(wù)器存儲領(lǐng)域,具體地說是一種快速檢測數(shù)據(jù)存儲鏈路穩(wěn)定性的方法。
背景技術(shù):
通常,隨著互聯(lián)網(wǎng)技術(shù)的快速發(fā)展,數(shù)據(jù)量雪崩式的增加,海量的數(shù)據(jù)需要存儲,存儲子系統(tǒng)作為數(shù)據(jù)存儲的主要鏈路及媒介顯得尤為重要;不僅需要巨大容量的云盤,而且對存儲子系統(tǒng)鏈路的穩(wěn)定性提出來了很高的要求。
服務(wù)器存儲的整個鏈路主要包括以下幾個部分:操作系統(tǒng)、驅(qū)動、中央處理器(CPU:Central Processing Unit)、SATA/SAS控制器。數(shù)據(jù)傳輸?shù)逆溌肥请p向的;考慮到存儲類服務(wù)器對硬盤數(shù)量的要求,有時還需要擴(kuò)展硬盤接口,使得整個存儲子系統(tǒng)鏈路上的元器件增加,伴隨而來的則是整個存儲鏈路的穩(wěn)定性及可靠性的減弱。因此為了排除該方面的隱患,在部署數(shù)據(jù)中心之前首先要做的是檢查存儲鏈路的穩(wěn)定性,而存儲鏈路的不穩(wěn)定性主要表現(xiàn)在硬盤存儲的數(shù)據(jù)被破壞,即數(shù)據(jù)bit位被修改,由“0”變?yōu)椤?”,或者由“1”變?yōu)椤?”;而這種數(shù)據(jù)bit被修改是很難被發(fā)現(xiàn)的。
為克服該問題,本文提出一種快速檢測數(shù)據(jù)存儲鏈路穩(wěn)定性的方法。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明的技術(shù)任務(wù)是提供一種快速檢測數(shù)據(jù)存儲鏈路穩(wěn)定性的方法。
本發(fā)明的技術(shù)任務(wù)是按以下方式實(shí)現(xiàn)的,一種快速檢測數(shù)據(jù)存儲鏈路穩(wěn)定性的方法,具體的方法步驟如下:首先,通過數(shù)據(jù)存儲鏈路向硬盤內(nèi)部寫入數(shù)據(jù);其次,通過同一條數(shù)據(jù)存儲鏈路從硬盤內(nèi)部讀取數(shù)據(jù);最后將寫入的數(shù)據(jù)和讀取的數(shù)據(jù)做比較,并將比對結(jié)果輸出至屏幕,即可判斷存儲鏈路有無異常。
優(yōu)選的,所述的數(shù)據(jù)存儲鏈路包括中央處理器、PCIE-SWITCH轉(zhuǎn)換芯片和HDD controller控制芯片以及硬盤;數(shù)據(jù)存儲電路的傳輸過程如下:
中央處理器的一個PCIEX4經(jīng)過一個PCIE-SWITCH轉(zhuǎn)換芯片,轉(zhuǎn)換為4個PCIEX1,每一個PCIEX1信號分別連接到一個控制器芯片上,進(jìn)行協(xié)議轉(zhuǎn)換為硬盤控制器,每一個硬盤控制器下面連接4個硬盤,這樣數(shù)據(jù)就可以通過這條鏈路寫入到硬盤里面,數(shù)據(jù)可被寫入,也可被讀取,整條存儲鏈路是雙向傳輸?shù)摹?/p>
優(yōu)選的,當(dāng)數(shù)據(jù)比特位被修改,由“0”變?yōu)椤?”,或者由“1”變?yōu)椤?”,將寫入的數(shù)據(jù)和讀取的數(shù)據(jù)作比較時,即可發(fā)現(xiàn)屏幕上的輸出的比對結(jié)果顯示兩者不一致,從而判斷出數(shù)據(jù)存儲鏈路存在異常。
本發(fā)明的一種快速檢測數(shù)據(jù)存儲鏈路穩(wěn)定性的方法和現(xiàn)有技術(shù)相比,有益效果如下:
1、通過系統(tǒng)下檢測硬盤存儲的數(shù)據(jù)bit是否發(fā)生翻轉(zhuǎn),可以直觀的檢測數(shù)據(jù)存儲鏈路的穩(wěn)定性;
2、可以快速的檢測整個數(shù)據(jù)存儲鏈路,包含鏈路中的元器件的穩(wěn)定性,可以直觀的看出存儲鏈路是否有異常,方便快捷;
3、通過這種檢測方案,提高了數(shù)據(jù)中心存儲類服務(wù)器的穩(wěn)定性及可靠性,進(jìn)而提高了市場競爭力。
附圖說明
附圖1為數(shù)據(jù)存儲鏈路的結(jié)構(gòu)示意圖。
具體實(shí)施方式
一種快速檢測數(shù)據(jù)存儲鏈路穩(wěn)定性的方法,具體的方法步驟如下:首先,通過數(shù)據(jù)存儲鏈路向硬盤內(nèi)部寫入數(shù)據(jù);其次,通過同一條數(shù)據(jù)存儲鏈路從硬盤內(nèi)部讀取數(shù)據(jù);最后將寫入的數(shù)據(jù)和讀取的數(shù)據(jù)做比較,并將比對結(jié)果輸出至屏幕,即可判斷存儲鏈路有無異常。
優(yōu)選的,所述的數(shù)據(jù)存儲鏈路包括中央處理器、PCIE-SWITCH轉(zhuǎn)換芯片和HDD controller控制芯片以及硬盤;
如圖1所示,為數(shù)據(jù)存儲鏈路示意圖。其中CPU是中央處理器;PCIE-SWITCH和HDD controller是兩個不同功能的集成電路芯片;HDD表示硬盤。CPU的一個PCIEX4經(jīng)過一個PCIE-SWITCH轉(zhuǎn)換芯片,轉(zhuǎn)換為4個PCIEX1;每一個PCIEX1信號分別連接到一個控制器芯片上,進(jìn)行協(xié)議轉(zhuǎn)換為HDD控制器;每一個HDD控制器下面鏈接4個HDD,這樣數(shù)據(jù)就可以通過這條鏈路寫入到硬盤里面;數(shù)據(jù)不只是被寫入,還有被讀取,因此整條存儲鏈路是雙向傳輸?shù)摹?/p>
由于數(shù)據(jù)傳輸鏈路是雙向的,寫入硬盤的數(shù)據(jù)可以通過原來的存儲鏈路讀取出來;如果整個數(shù)據(jù)存儲鏈路以及鏈路上的元器件本身沒有異常,寫入硬盤的數(shù)據(jù)是不會發(fā)生改變的。因此,我們就可以對硬盤寫入固定的數(shù)據(jù),比如全寫“0”,然后讀取硬盤數(shù)據(jù),最后將讀取出來的數(shù)據(jù)與原來的數(shù)據(jù)進(jìn)行對比,并且輸出對比結(jié)果至屏幕,這樣,我們就可以直觀的看出鏈路有無異常,就可以把潛在隱患扼殺在數(shù)據(jù)中心部署之前。
實(shí)施例1:
為清楚的說明本文所提出一種快速檢測數(shù)據(jù)存儲鏈路穩(wěn)定性的方法的實(shí)現(xiàn)情況,結(jié)合圖1來說明實(shí)現(xiàn)步驟。具體如下:
1)在操作系統(tǒng)下,對硬盤寫入固定的數(shù)據(jù);
2)在操作系統(tǒng)下,從硬盤中讀取其中的數(shù)據(jù);
3)最后,自動對比寫入和讀取的數(shù)據(jù),并將對比結(jié)果中數(shù)據(jù)不一致的數(shù)據(jù)位輸出至屏幕上。
4)具體的實(shí)現(xiàn)代碼如下:
#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);
}
}
這樣,本文提出一種快速檢測數(shù)據(jù)存儲鏈路穩(wěn)定性的方法即可得以實(shí)現(xiàn)。本文提出一種快速檢測數(shù)據(jù)存儲鏈路穩(wěn)定性的方法,在服務(wù)器存儲數(shù)據(jù)之前對鏈路穩(wěn)定性進(jìn)行檢測。具體方法為:首先,系統(tǒng)下通過存儲鏈路向硬盤內(nèi)部寫數(shù)據(jù);其次,同樣通過存儲鏈路從硬盤內(nèi)部讀取數(shù)據(jù);最后將寫入的數(shù)據(jù)和讀取的數(shù)據(jù)做比較。這種方法能夠?qū)λ写鎯︽溌飞系钠骷M(jìn)行檢測,一旦有某個子鏈路或者某個元器件有故障,第一時間就可以發(fā)現(xiàn),將潛在的隱患扼殺在數(shù)據(jù)中心部署之前。
通過上面具體實(shí)施方式,所述技術(shù)領(lǐng)域的技術(shù)人員可容易的實(shí)現(xiàn)本發(fā)明。但是應(yīng)當(dāng)理解,本發(fā)明并不限于上述的幾種具體實(shí)施方式。在公開的實(shí)施方式的基礎(chǔ)上,所述技術(shù)領(lǐng)域的技術(shù)人員可任意組合不同的技術(shù)特征,從而實(shí)現(xiàn)不同的技術(shù)方案。