一種Linux系統的SCSITarget模式的數據I/O寫入方法
2023-09-27 06:43:15 1
專利名稱:一種Linux系統的SCSI Target模式的數據I/O寫入方法
技術領域:
本發明涉及一種磁碟數據讀寫方法,特別是一種Linux文件系統下的使用SCSI存儲設備的數據寫入方法。
背景技術:
傳統的Linux文件系統的標準I/O接口是基於數據拷貝操作的,即I/O操作會導致數據在作業系統的內核地址空間的緩衝區和應用程式用戶層地址空間定義的緩衝區之間進行拷貝。在這種機制中,磁碟驅動採用了 DMA方式,可以將數據直接從磁碟讀到頁緩存中,或者將數據從頁緩存直接寫回到磁碟上,而不能直接在應用程式地址空間和磁碟之間進行數據傳輸,這樣數據在傳輸過程中需要在應用程式地址空間和頁緩存之間進行多次數據拷貝操作,最大的好處就是可以減少磁碟I/O的操作,因為如果所請求的數據已經存放 在作業系統的高速緩衝存儲器中,那麼就不需要再進行實際的物理磁碟I/O操作。但是數據傳輸過程中的數據拷貝操作卻導致了極大的CPU開銷,從而限制了系統進行數據傳輸的性能。這個方法實現了內核態的Direct I/O方法,不僅避免了內存的拷貝,降低了 CPU的開銷,而且提高了系統的I/o性能。Direct I/O Target模式的接口,為主機提供虛擬SCSI設備,在傳統的Target驅動中,對主機發出的I/O的請求,直接調用標準的文件系統接口,讀寫數據,導致整個Direct I/O Target接口的I/O性能無法得到提高。原因在於主機的每次I/O請求的數據大小是隨機的,而Direct I/O則要求每次數據必須按照文件系統block對齊,這樣就無法利用內核態Direct I/O帶來的優點。而DCR作為一種嵌入式系統,性能則受到限制。
發明內容
本發明的目的是發明一種高效的Linux系統的Target模式的數據I/O方法。本發明適用於Linux系統,所述Linux系統使用Target模式驅動SCSI磁碟設備,其特徵在於提供一個在Target模式驅動和文件系統之間緩衝區,所述緩衝區由每個4KB長的Page組成的雙向循環鍊表,鍊表長度的值是1024到2048,所述的緩衝區內還設有偏移指針,數據首先被寫入緩衝區,當緩衝區內的新數據累積到4KB的長度的整數倍的時候,調用文件系統的Direct I/O接口,把數據寫入磁碟。所述的新數據寫入緩衝區的時候,最後一個寫長度如果無法對齊,就按照對齊的長度寫入,再調用truncate文件系統內核接口,把數據長度調整成正確的值。每個鍊表中包括多個Page,鍊表順序循環使用,在每次flush緩衝區的時候,把填滿的Page寫入文件系統。本發明的數據寫入方法,通過I/O緩衝區的設置和規則設計,實現了 SCSI I/O數據塊的對齊,結合文件系統的Direct 1/0,提高了系統的性能。
圖I模塊層次模型 圖2多個緩衝區填充的結構關係 圖3緩衝區的流程圖。
具體實施例方式以下將參照附圖對本發明的實施例進行描述
如圖I所示,本發明應用於Linux系統,這個系統中使用Target模式驅動SCSI磁碟設備。整個系統模塊層次的模型結構有4個層次,包括Targe t模塊100、緩衝區速緩存CachelOl、文件系統 Filesysteml02、磁碟 Diskl03。所述的Target模塊100是最終的數據存儲介質,數據先通過Target模塊100進行處理,然後通過緩衝區緩存CachelOl,經文件系統FileSystem再寫入磁碟。整個流程中具有一個數據處理方法,這個方法就是一個數據I/O方法,系統效率由此體現。所述的Cache模塊101是用來存放數據的緩存和對齊,有提高性能的作用。所述的Filesystem模塊102是管理磁碟上的文件,對文件進行讀寫、增加、刪除等操作。所述的Disk模塊103是用來存放數據的磁碟。如圖2所示,本發明的方法是提供一個在Target模式驅動和文件系統之間緩衝區,所述緩衝區由每個4KB長的Page組成的雙向循環鍊表,鍊表長度的值為1024到2048,所述的緩衝區內還設有偏移指針,數據首先被寫入緩衝區,當緩衝區內的新數據累積到4KB的長度的整數倍的時候,調用文件系統的D ir ec t I /O接口,把數據寫入磁碟。如圖2所示的緩衝區結構,包括四個Page多個緩衝區的Page可以循環順序使用,設置一個填充標記dirty和一個清空標記clean,當數據填滿一個Page的時候,就將這個Page改為dirty標記,在這個示意圖中,步驟104的Pagel和步驟105的Page2已經被寫滿,也就是標記了 dirty,步驟106的Page3隻被填滿了一部分,然後下一個寫命令的數據就可以繼續寫入;步驟107是完全空閒的Page4,可以被未來的寫命令使用。在每次Flush緩衝區的時候,將標記為dirty的Page的數據寫入磁碟。等操作完成以後,該Page再次被標識為clean進行下一次的使用。如圖3所示的緩衝區使用流程圖,步驟SI收到主機寫命令以後,步驟S2判斷是否為文件結束標誌,如果是的話就執行步驟S3寫入dirty,步驟S4是修改文件長度,然後就完成了數據寫入。如果步驟S2判斷文件沒有結束,就執行步驟S5取得空閒的Page,步驟S6表示接受主機的數據到空閒的Page並標記為dirty,如果是普通的寫命令,只要在緩衝區的鍊表裡找到空閒的Page,將數據接受到空閒的Page中,並把Page設置為dirty標記,步驟S7判斷鍊表裡的標記為dirty的Page是否超過了閥值,如果超過的話就執行步驟S8,把標記為dirty的Page寫入文件系統,步驟S9是寫入完成後,就將dirty標記的Page置為clean標記,可以再次使用。本發明的方法設計並實現了 SCSI Target模式的I/O緩存方法,使得主機寫來的隨機數據在緩存中累計,到一定的block對齊長度時,再調用內核Direct I/O接口,寫入數據。使得整個數據流程不需要使用CPU參與拷貝,極大地提高了系統的性能和效率。對於FC(光線卡)Target接口也同樣適 用。
權利要求
1.一種Linux系統的SCSI Target模式的數據I/O寫入方法,適用於Linux系統,所述Linux系統使用Target模式驅動SCSI磁碟設備,其特徵在於包括 提供一個在Target模式驅動和文件系統之間的緩衝區,所述的緩衝區是由每個長度為4KB的Page組成的雙向循環鍊表,鍊表長度範圍是1024到2048,所述的緩衝區內還設有偏移指針,數據首先被寫入緩衝區,當緩衝區內的新數據累積到4KB的長度的整數倍的時候,再調用文件系統的Direct I/O接口,把數據寫入磁碟。
2.根據權利要求I所述的一種Linux系統的SCSITarget模式的數據I/O寫入方法,其特徵在於所述的新數據寫入緩衝區的時候,如果最後一個寫長度無法對齊,就按照對齊的長度寫入,再調用truncate模塊,調整數據長度到正確的值。
3.根據權利要求I所述的一種Linux系統的SCSITarget模式的數據I/O寫入方法,其特徵在於所述的每個鍊表中包括多個Page,鍊表順序可以循環使用,在每次flush緩衝區的時候,把填滿的Page寫入文件系統。
全文摘要
本發明描述了在Linux系統下使用SCSI存儲設備的數據I/O寫入方法。該方法提供了一個在Target模式驅動和文件系統之間的緩衝區,緩衝區是由每個長度為4KB的Page組成的雙向循環鍊表,鍊表的長度範圍為1024~2048,緩衝區內設有偏移指針,數據首先被寫入緩衝區,當緩衝區內的新數據達到規定長度的整數倍的時候,就調用文件系統的DirectI/O接口,直接把數據寫入磁碟。當新數據寫入緩衝區的時候,如果最後一個寫長度無法對齊,就按照對齊的長度寫入,再調用truncate文件系統內核接口,調整數據的長度到正確的值。本發明通過I/O緩衝區的設置和規則設計,實現了SCSI中I/O數據塊的對齊,結合了文件系統的DirectI/O,從而提高了系統的性能。
文檔編號G06F3/06GK102681795SQ201210131288
公開日2012年9月19日 申請日期2012年5月2日 優先權日2012年5月2日
發明者張慶敏, 張衡, 胡剛, 謝海威 申請人:無錫眾志和達存儲技術有限公司