Volendo evitare di attendere le pipe tramite l’opzione IOCB_NOWAIT per migliorare ulteriormente le prestazioni di IO_uring, Jens Axboe ha implementato tale funzionalità e in un semplice test sta riscontrando miglioramenti delle prestazioni da 10x a 23x.

“Una cosa che è sempre stata un po’più lenta di quanto vorrei con io_uring è la gestione delle pipe. Non supportano IOCB_NOWAIT, quindi dobbiamo inviarle a io-wq per la gestione. Questa serie aggiunge il supporto per FMODE_NOWAIT alle pipe”, ha iniziato una delle ultime serie di patch di Axboe. Ma è più eccitante sapere come è finito quel messaggio:

Curioso di sapere quanto sia grande la differenza, ho scritto un piccolo benchmark che apre semplicemente 128 pipe e poi fa 256 cicli di lettura e scrittura su loro. Questo è stato eseguito 10 volte, scartando la prima esecuzione perché è sempre un po’più lenta. Prima della patch:

Media: 262,52 msec
Stdev: 2,12 msec
Min: 261,07 msec
Max 267,91 msec

e dopo la patch:

Media: 24,14 msec
Stdev: 9,61 msec
Min: 17,84 msec
Max: 43,75 msec

o un miglioramento delle prestazioni (ed efficienza) di circa 10 volte.

Ho eseguito le patch attraverso i test ltp pipe e splice, non è stata osservata alcuna regressione.

Sebbene un miglioramento di 10 volte sia abbastanza entusiasmante, Axboe allora ha fatto seguito con un miglioramento di 23 volte!

Il test precedente era per una pipe vuota quando viene emessa la lettura, se il test viene modificato per avere dati quando, allora sembra ancora migliore:

Prima:

Media: 249,24 msec
Stdev: 0,20 msec
Min: 248,96 msec
Max: 249,53 msec

Dopo:

Media: 10,86 msec
Stdev: 0,91 msec
Min: 10,02 msec
Max: 12,67 msec

o un miglioramento di circa 23 volte.

Speriamo che questo supporto FMODE_NOWAIT per pipe sia pronto per il rilascio con il kernel Linux 6.4 quest’estate.

Categories: IT Info