Pipe FMODE_NOWAIT Support Sent In For Linux 6.4 As A 10~23x Performance Improvement
While the Linux 6.4 merge window is closing this weekend, today on the last full day of the period is Jens Axboe submitting pipe FMODE_NOWAIT support as what he's described as a big performance and efficiency improvement.
With an earlier incarnation of the FMODE_NOWAIT support for pipes patches, Axboe explained:
But where things really get wild is the scale of the performance/efficiency gain from it:
He later added in that patch series:
The patches set for merging into Linux 6.4 set FMODE_NOWAIT support for pipes but disable it if using splice/vmsplice on the pipe. This pull request is what's now pending for the pipe FMODE_NOWAIT support.
With an earlier incarnation of the FMODE_NOWAIT support for pipes patches, Axboe explained:
"One thing that's always been a bit slower than I'd like with io_uring is dealing with pipes. They don't support IOCB_NOWAIT, and hence we need to punt them to io-wq for handling. This series adds support for FMODE_NOWAIT to pipes."
But where things really get wild is the scale of the performance/efficiency gain from it:
"Curious on how big of a difference this makes, I wrote a small benchmark that simply opens 128 pipes and then does 256 rounds of reading and writing to them. This was run 10 times, discarding the first run as it's always a bit slower. Before the patch:
Avg: 262.52 msec
Stdev: 2.12 msec
Min: 261.07 msec
Max 267.91 msec
and after the patch:
Avg: 24.14 msec
Stdev: 9.61 msec
Min: 17.84 msec
Max: 43.75 msec
or about a 10x improvement in performance (and efficiency).
I ran the patches through the ltp pipe and splice tests, no regressions observed. Looking at io_uring traces, we can see that we no longer have any io_uring_queue_async_work() traces after the patch, where previously everything was done via io-wq."
He later added in that patch series:
"The above test was for a pipe being empty when the read is issued, if the test is changed to have data when, then it looks even better:
Before:
Avg: 249.24 msec
Stdev: 0.20 msec
Min: 248.96 msec
Max: 249.53 msec
After:
Avg: 10.86 msec
Stdev: 0.91 msec
Min: 10.02 msec
Max: 12.67 msec
or about a 23x improvement."
The patches set for merging into Linux 6.4 set FMODE_NOWAIT support for pipes but disable it if using splice/vmsplice on the pipe. This pull request is what's now pending for the pipe FMODE_NOWAIT support.
3 Comments