雖然 Linux 6.4 合併窗口將在本週末關閉,但今天是該期間的最後一整天,Jens Axboe 提交了管道 FMODE_NOWAIT 支持,他將其描述為性能和效率的重大改進。

隨著對管道的 FMODE_NOWAIT 支持的早期化身補丁, Axboe 解釋說:

“處理管道時總是比我希望的 io_uring 慢一點。它們不支持 IOCB_NOWAIT,因此我們需要將它們放到 io-wq 用於處理。本系列增加了對管道 FMODE_NOWAIT 的支持。這造成了很大的不同,我寫了一個小的基準測試,它只打開 128 個管道,然後對它們進行 256 輪讀寫。這運行了 10 次,丟棄了第一次運行,因為它總是有點慢。在補丁之前:

平均:262.52 毫秒
標準偏差:2.12 毫秒
最小:261.07 毫秒
最大 267.91 毫秒

補丁後:

平均:24.14 毫秒
標準偏差:9.61 毫秒
最小:17.84 毫秒
最大值:43.75 毫秒

或性能(和效率)提高約 10 倍。

我通過 ltp 管道和拼接測試運行補丁,沒有觀察到回歸。查看 io_uring 跟踪,我們可以看到在補丁之後我們不再有任何 io_uring_queue_async_work() 跟踪,之前一切都是通過 io-wq 完成的。”

他後來 在該補丁系列中添加:

“以上測試是針對管道在發出讀取時為空,如果測試更改為有數據時,那麼它看起來會更好:

之前:

平均:249.24 毫秒
標准開發: 0.20 毫秒
最小值:248.96 毫秒
最大值:249.53 毫秒

之後:

平均值:10.86 毫秒
標準偏差:0.91 毫秒
最小值:10.02 毫秒
最大值:12.67 毫秒

或大約 23 倍的改進。”

為合併到 Linux 6.4 中設置的補丁設置了對管道的 FMODE_NOWAIT 支持,但如果使用則禁用它管道上的 splice/vmsplice。This pull request 是現在的等待管道 FMODE_NOWAIT 支持。

Categories: IT Info