io_uring 的並發寫入擴充效果如何?

io_uring 的並發寫入擴充效果如何?

背景:我對 的潛在效能提升非常感興趣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 嗎?”

參考

相關內容