RAID 5(三)簡單的讀寫

2021-05-24 02:51:51 字數 2279 閱讀 6740

這些文章已經寫了好幾年了,可能已經過時了。在msn space和qqzone幾經輾轉之後,我想也許這些技術文章還是放在搞技術的部落格中更能幫助人。於是做了乙個艱難的決定,把這些文章一篇篇搬過來!絕對是原創的。

一次簡單的讀處理

這一切都是從make_request開始的。make_request的其中乙個引數就是bio,至於乙個bio是怎麼送到make_request中的,這與塊裝置驅動內容相關,具體內容可以檢視ldd3和ulk3,你或者可以從block/ll_rw_blk.c的generic_make_request函式開始尋找答案。

在make_request中,我們首先需要知道這個bio是要讀哪個stripe的哪個dev。這些資訊從raid5_compute_sector函式中獲得。這兩個資訊就被放在new_sector和dd_idx中,根據new_sector資訊,我們呼叫get_active_stripe取出乙個 stripe_head即sh來處理這次讀請求,根據dd_idx資訊,我們呼叫add_stripe_bio將bio放入相應的dev,也就是放入 sh->dev[dd_idx].toread鍊錶。

到此,就可以將sh送入handle_stripe函式中作第一輪處理。既然說是一次簡單的讀請求,那麼我們忽略掉部分複雜的處理。在 handle_stripe中,看到相應dev的toread鍊錶有請求,而且這個dev狀態為empty,我們就會將本dev標記為want,最後將這 個dev的req標記為讀請求通過generic_make_request送交下層disk處理。還記得麼,empty狀態,want狀態,req在前面已經介紹過了。請注意,在送到下層之前req的bi_rw標記為讀以外還將其bi_end_io這個callback設為 raid5_end_read_request。就這樣第一輪的handle_stripe結束,這個sh也被放入handle_list等待第二輪處理。在make_request中,可以看到這些動作都處在乙個迴圈之中,關於這個迴圈的作用暫且先放一放。

下層完成讀操作後,raid5_end_read_requset被呼叫,讀成功的話,則這個dev狀態轉為clean,而raid-5的守護執行緒 raid5d被喚醒。在raid5d中handle_stripe再次被呼叫對這個sh做第二輪處理。這次handle_stripe一看到相應的dev已經為clean狀態,則將緩衝頁中的資料copy到bio的相應頁中,最終等整個bio的資料都完備了,則呼叫這個bio的bi_end_io來通知上層i/o完成。

如此這般,一次簡單的讀請求處理完畢。

一次簡單的寫處理

寫處理相對於讀則更加複雜,因為除了正常的資料以外還要計算及寫入校驗資料。

寫處理也是從make_request開始的,前面讀處理中描述的get_active_stripe和add_stripe_bio在寫處理中也是一樣的,唯一的區別是bio將被放入dev的towrite鍊錶。接著sh被送入handle_stripe處理。

為了簡化起見,我們假設這次sh中要處理只有乙個寫bio,而且這次寫的內容覆蓋了整個dev的緩衝區頁。handle_stripe首先需要決定是要做 read-modify-write(rmw)還是reconstruct-write(rcw)。這兩個概念以後會解釋。根據我們的假設,這裡rmw的 可能性更高,所以我按rmw來解釋。於是如果這個有towrite的dev和parity的dev的狀態仍為empty,handle_stripe就會將它們狀態轉為want。大家如果看**,這裡會看到只有在這個sh狀態為stripe_preread_active才會將dev由empty轉為 want,這是raid-5中乙個巧妙的地方,這裡我們只是假設sh的狀態已經符合條件。接下了這些dev的req被作為讀請求送到下層裝置,第一輪的 handle_stripe處理就此結束。

接下來,下層處理完畢,兩個dev的狀態轉為clean,raid5d被喚醒對這個sh進行第二輪處理。這一輪處理最重要的就是 compute_parity這個函式,此時compute_parity所做的事情跟我在raid-5原理中的敘述一樣。在 compute_parity中,bio的相應頁的內容被copy到dev的緩衝頁中,校驗dev的頁內資料也是最新的了,而且bio也從towrite 鏈轉入written鏈。它們的狀態被設為dirty,並在最後它們的req作為寫請求送到下層裝置。

下層寫完成之後,callback函式raid5_end_write_request被呼叫,dev的狀態由dirty轉為clean。raid5再次醒來對這個sh做第三輪處理。這一輪處理非常簡單,看到資料dev和校驗dev狀態均為clean,就可以呼叫bio的bi_end_io通知上層本次寫請 求完成。

make_request是一切處理的源頭,請看下一集:)

RAID 5(十三)其它

這些文章已經寫了好幾年了,可能已經過時了。在msn space和qqzone幾經輾轉之後,我想也許這些技術文章還是放在搞技術的部落格中更能幫助人。於是做了乙個艱難的決定,把這些文章一篇篇搬過來!絕對是原創的。前面幾篇林林總總,從raid 5原理,到錯誤,失效處理,主要還是圍繞資料處理的方方面面來說的...

raid5故障回放

故障回放 硬體 dell伺服器r720 陣列 raid 5 h310 系統 windows 2008 r2 計畫在伺服器進行sql資料庫恢復操作 sql2008 r2 資料庫備份檔案800m,在還原操作中,進行到備份檔案讀取時,sql程式一直出現假死 換到普通pc機執行此操作正常 無響應情況。並且對...

RAID5和RAID10在磁碟讀寫選擇對比

磁碟讀寫速度的關鍵之一 cache cache技術最近幾年,在磁碟儲存技術上,發展的非常迅速,作為高階儲存,cache已經是整個儲存的核心所在,就是中低端儲存,也有很大的cache存在,包括最簡單的raid卡,一般都包含有幾十,甚至幾百兆的raid cache。cache的主要作用是什麼呢?作為快取...