1. 程式人生 > >文件系統中的journal device和write cache

文件系統中的journal device和write cache

文件系統 journal device write cache

眾所周知,文件系統中的journal device主要有兩個目的:

1.保證數據的一致性;

2.縮短寫響應時間


要保證數據的一致性,當然避免不了和磁盤write cache的交互,這體現在兩個層次:


1.文件系統中對journal device的寫

充分利用journal device的寫速度快的特點,寫操作先到journal device設備,一次寫到journal device的事務包括要寫的data和下次取它才需要的最少的meta data。如何確保這些數據徹底落到journal device上,有兩種處理方式:

a.完全disable disk write cache,這樣保證每次對journal device的寫都已經返回;

b.利用disk write cache flush機制,在用作journal device的設備上的每次寫在隔一段時間就flash write cache,或者在


2. 文件系統對物理磁盤的寫

對於最終落到存儲設備上的寫,因為有journal device背書,可以異步也可以同步寫,但要求保證對於每次寫事務:寫返回之前肯定能確保數據落到磁盤,而不會在write cache裏。考慮到和journal device的配合,一般流程包括兩個線程:


2.1落盤線程


a.從journal device讀取還未了落盤的寫請求記錄;

a.執行真正磁盤寫;

b.調用對於磁盤設備的flushwrte cache操作;

c.對於已經完全落盤的操作,從journal device中去掉對應的記錄

d.返回


至此,一次徹底落盤的寫才算完成。


2.2寫提交線程

a.打包寫請求中的data和metadata (包括offset,起始地址等),生成對journal device寫的原始數據

b.從journal device上尋找合適的空間,記錄上面的寫請求,也就上把上面的原始數據寫入;

c.如果journal device的寫緩存沒有關閉,刷journal device的寫緩存,確保數據落到journal device物理存儲設備上;

d.向上層返回寫請求


至此,一次寫請求返回。


根據上面分析,寫響應時間是從寫請求發出到寫提交線程中的步驟d完成的時間。由於通常日誌設備比普通磁盤的讀寫速度快很多,因此它能大大縮短寫響應時間。但如果journal device上的寫請求由於沒有及時下發,被撐滿了,那麽它就基本上只有執行落盤線程的路徑了,可也遇見此時寫響應時間會急劇增加很多。


綜合考慮到寫提交線程和落盤線程的配合,可以看到在有文件系統journal device背書的情況下,落盤線程可以從同步寫變成異步寫,只要最終保證寫請求能夠按照先來後到的順序落盤即可,這樣理論上能夠增加IO吞吐量。但是實際要達到這一效果,需要journal device和磁盤的緊密協同才行。


3.刷寫緩存的操作和關閉寫緩存的方法


可以參考下面對SCSI/sas盤的刷寫緩存的操作:

static int flushSCSIwc(int fd) {

struct sg_io_hdr io_hdr;

unsigned char sense_b[32];

unsigned char cmdp[10];


memset(&io_hdr, 0, sizeof(struct sg_io_hdr));

memset(sense_b, 0, sizeof(sense_b));

memset(cmdp, 0, sizeof(cmdp));


io_hdr.interface_id = ‘S‘;

io_hdr.dxfer_direction = SG_DXFER_NONE;

cmdp[0] = 0x35;

cmdp[1] = 0x00;

cmdp[2] = 0x00;

cmdp[3] = 0x00;

cmdp[4] = 0x00;

cmdp[5] = 0x00;

cmdp[6] = 0x00;

cmdp[7] = 0x00;

cmdp[8] = 0x00;

cmdp[9] = 0x00;

io_hdr.cmdp = cmdp;

io_hdr.cmd_len = sizeof(cmdp);

io_hdr.sbp = sense_b;

io_hdr.mx_sb_len = sizeof(sense_b);

io_hdr.timeout = 60000;


if(ioctl(fd, SG_IO, &io_hdr) == -1)


if(io_hdr.status != 0)

return EIO;


return 0;

}


而關閉寫緩存的辦法也很簡單:

hdparm -W1 /dev/sdq

當然也可以用MegaCLI或者lsitutil等工具來控制。



本文出自 “存儲之廚” 博客,轉載請與作者聯系!

文件系統中的journal device和write cache