簡體   English   中英

在塊層/設備上繞過4KB塊大小限制

[英]Bypassing 4KB block size limitation on block layer/device

我們正在開發一種ssd類型的存儲硬件設備,它可以一次接收大塊大小> 4KB的讀/寫請求(即使是MB大小)。 我的理解是linux及其文件系統會將文件“砍掉”成4KB的塊大小,這些塊大小將被傳遞給塊設備驅動程序,這需要用來從設備中物理填充塊(例如,用於寫入)

我也知道內核頁面大小在此限制中起作用,因為它設置為4KB。

對於實驗,我想知道是否有辦法實際增加這個塊大小,這樣我們將節省一些時間(而不是多次4KB寫入,我們可以用更大的塊大小來做)。

有沒有FS或任何現有的項目我可以看看這個? 如果沒有,那么做這個實驗需要什么 - 需要修改linux的哪些部分? 試圖找出所需的困難和資源水平。 或者,如果甚至不可能這樣做和/或任何理由我們甚至不需要這樣做。 任何評論表示贊賞。

謝謝。

4k限制是由於頁面緩存造成的。 主要問題是,如果你有一個4k的頁面大小,但塊大小為32k,如果文件長度只有2000字節會發生什么,所以你只分配一個4k的頁面來覆蓋塊的前4k。 現在有人試圖抵消20000,並寫一個字節。 現在假設系統承受了很大的內存壓力,而前一個2000字節的4k頁面是干凈的,會被推出內存。 如何跟蹤32k塊的哪些部分包含有效數據,以及當系統需要在偏移20000處寫出臟頁時會發生什么?

另外,讓我們假設系統存在巨大的內存壓力,我們需要寫出最后一頁; 如果沒有足夠的內存可用於實例化32k塊的其他28k,那么我們可以執行讀 - 修改 - 寫周期只是為了在偏移20000處更新那個臟的4k頁?

這些問題都可以解決,但需要在VM層進行大量手術。 VM層需要知道對於這個文件系統,頁面需要一次以8個頁面的塊進行實例化,如果有內存壓力推出特定頁面,則需要寫出所有8個頁面同時如果它是臟的,然后同時從頁面緩存中刪除所有8個頁面。 所有這些都意味着您希望跟蹤頁面使用情況和頁面臟污,而不是在4k頁面級別,而是在復合32k頁面/“塊”級別。 它基本上將涉及對VM子系統的幾乎每個部分的更改,從頁面清理器到頁面錯誤處理程序,頁面掃描程序,寫回算法等等等。

還要考慮一下,即使你雇用一個Linux VM專家來完成這項工作(硬盤供應商會非常喜歡你,因為他們也希望能夠部署具有32k或64k物理扇區大小的HDD),它將會在這樣一個經過修改的VM層出現在Red Hat Enterprise Linux內核或SuSE或Ubuntu的等效企業或LTS內核之前5到7年。 因此,如果您正在一家希望將您的SSD產品銷售到企業市場的初創公司工作 - 您現在也可以放棄這種方法。 在資金耗盡之前,它不會起作用。

現在,如果您正在為一家正在制作自己的硬件(如Facebook,亞馬遜,谷歌等)的大型雲公司工作,也許您可​​以走這條特定的道路,因為他們不使用添加新的企業內核以冰川的速度運行 - 但出於這個原因,他們希望相對靠近上游內核,以最大限度地降低維護成本。

如果您為這些大型雲計算公司之一工作,我強烈建議您聯系同一領域的其他公司,也許您可​​以與他們合作,看看您是否可以一起完成這種開發工作嘗試在上游進行這種改變。 這真的, 真的不是一件簡單的變化,但---特別是由於上游Linux內核開發人員的需求,這不是負在通常情況下,這將涉及> 4K塊設備在不久的將來任何時候的表現產生影響。 如果你在Facebook,谷歌,亞馬遜等地工作,這不是你想要作為內核的私人改變而維護的那種改變,而是你想要上游的東西,因為其他方面它將是一個巨大的,侵略性的變化,支持它作為一個樹外補丁將是一個巨大的頭痛。

雖然我從未為Linux編寫過設備驅動程序,但我發現這不太可能是驅動程序接口的真正限制。 我想你可能希望將I / O分解為分散 - 收集列表,其中列表中的每個條目長一頁(以提高內存分配性能並減少內存碎片),但大多數設備類型現在可以直接處理這些,而且我認為驅動程序界面中的任何內容都不需要它。 實際上,向塊設備發出請求的最簡單方法(在第13頁上描述 - 標記為該文本的第476頁)看起來像是接收到:

  • 扇區起始編號
  • 一些部門要轉移( 沒有提到限制 ,更不用說8個512B扇區的限制)
  • 指向將數據寫入/讀取數據的指針(對於這個簡單的情況,不是分散 - 收集列表,我猜)
  • 這是讀取還是寫入

我懷疑,如果你只看到4K訪問,這可能是調用者一次請求超過4K的結果 - 如果你在設備上運行的文件系統只發出4K讀取,或者任何使用文件系統一次只能訪問一個塊,設備驅動程序無法自行更改它!

對於像數據庫讀取工作負載這樣的隨機訪問模式,一次使用一個塊是常見的,但是傳統(非寫入時復制)文件系統上的數據庫日志或FS日志寫入或大型串行文件讀取會發出大的I / O更像是什么你期待的。 如果您想嘗試直接對您的設備發出大量讀取以查看是否可以通過您現在擁有的任何驅動程序,您可以使用dd if=/dev/rdiskN of=/dev/null bs=N來查看是否增加了bs參數從4K到1M顯示了顯着的吞吐量增加。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM