背景:我對 的潛在效能提升非常感興趣io_uring
,但我對 C、Linux 核心或區塊裝置的內部運作原理還不夠熟悉,無法實現有意義的基準測試。我不是尋找硬數字,只是在尋找一個架構概述,為我繼續研究提供資訊。
想像一下,我有一個程序,它重複地將十個 4 位元組整數批次附加到檔案中,然後同步它。我想切換到一個模型,將批次中的每個整數附加到自己的檔案中。也就是說:我將向 10 個檔案中的每一個檔案寫入一個 4 位元組 int 並同步所有檔案。
使用同步 IO,原始方案使用 2 個系統呼叫(1 個寫入 + 1 個同步),而 int-per-file 方法使用了驚人的 20 個系統呼叫(10 個寫入 + 10 個同步)。就係統呼叫而言,io_uring
節省的成本將是巨大的:一次io_uring
提交即可實現相當於 20 個系統呼叫的效果。我不清楚的是如何休息write
一旦提交發生,Linux 機器的規模就會擴展。
- 大多數磁碟是否對並行寫入有一定程度的硬體支援?或者也許 SSD 可以,但旋轉磁碟不行?
- 寫入是否透過管道(通過總線?)傳輸到磁碟,以便核心不必等待每個寫入的往返回應?
- 核心本身是否最終會對通過 請求的所有系統呼叫進行排隊
io_uring
? - 還有其他我沒有考慮到的瓶頸嗎?
很可能我的思考模式是錯的。非常感謝任何指點!
答案1
大多數磁碟是否對並行寫入有一定程度的硬體支援?或者也許 SSD 可以,但旋轉磁碟不行?
幾乎所有磁碟都會這樣做,無論它們是旋轉磁碟還是固態磁碟(即使旋轉磁碟也有緩存,因此對於少量數據,它們看起來不會太慢)。廉價的USB 金鑰或SD 卡將實現較差的並發性,但也會有一定程度的並行性...就單一裝置的最大並行命令而言,SATA 最多可以有32 個,SCSI 往往在10 到100 之間, NVMe 可以達到 1000 秒(我認為規範將您限制為最大 65536,但我不知道有哪個設備可以達到這麼高)。
寫入是否透過管道(通過總線?)傳輸到磁碟,以便核心不必等待每個寫入的往返回應?
是的,可以並行發送多個寫入(或讀取)。然而,這種情況是否發生取決於許多因素(例如,核心可能會將它們組合在一起以提高效率,可能需要同步,因此必須清空隊列等)
核心本身是否最終會對透過 io_uring 請求的所有系統呼叫進行排隊?
或許。io_uring
如果不會阻塞,則會內聯完成 I/O,否則會排隊。從使用 io_uring 實現高效 IO:「更重要的是,對於不會阻塞的操作,資料是內聯提供的」。
還有其他我沒有考慮到的瓶頸嗎?
是的。io_uring
目前還不清楚您是否每秒執行足夠的 I/O 來真正看到諸如...之類的好處。如果您正在執行緩衝 I/O,即使在同步中,核心也會產生並行性,因為您正在寫入 RAM,然後核心會在可能的情況下並行地從 RAM 中轉出。 (請注意,前面的項目並不是詳盡的清單)
(標題中的問題)
io_uring 的並發寫入擴充效果如何?
可以到很好,具體取決於您使用的核心以及提交 I/O 的方式。請參閱此中的參考資料和鏈接回答“Linux 上真的沒有非同步區塊 I/O 嗎?”。
參考
- 塊層介紹- 討論塊層的兩部分系列
- Linux Block IO:在多核心系統上引入多佇列 SSD 訪問- 描述Linux多隊列架構變化的論文
- 這Linux Block I/O 層簡介YouTube 影片示範