IO_uring continua a dimostrarsi efficace essere una delle innovazioni fondamentali più interessanti per il kernel Linux degli ultimi dieci anni. Sebbene sia stato avviato per l’I/O di archiviazione asincrono, ha visto il lavoro recente sui casi d’uso della rete e ha anche guidato altre innovazioni come il nuovo driver”UBD”per un driver di blocco dello spazio utente basato su IO_uring. Continua inoltre a essere ottimizzato incessantemente da Jens Axboe e altri per il massimo potenziale di prestazioni. L’ultima innovazione su IO_uring annunciata questa settimana alla Linux Plumbers Conference 2022 a Dublino è io_uring_spawn.
Josh Triplett, che è un ex ingegnere di Intel Linux e più recentemente si è concentrato sul linguaggio di programmazione Rust dove è co-direttore del team del linguaggio Rust, ha annunciato il suo lavoro su io_uring_spawn ieri all’LPC 2022. Triplett lo riassume in modo piuttosto elegante in abstract del suo discorso:
io_uring consente di eseguire rapidamente un batch di operazioni, per conto del processo corrente. Come suggerisce il nome, funziona eccezionalmente bene per i carichi di lavoro di I/O. Tuttavia, uno dei carichi di lavoro più importanti nello sviluppo del software riguarda l’esecuzione di altri processi: make e altri sistemi di build avviano molti altri processi nel corso di una build. Come possiamo avviare questi processi più velocemente?
E se potessimo avviare altri processi e dare loro il lavoro iniziale da fare usando io_uring, finendo con un exec? E se potessimo gestire i passaggi pre-exec per un nuovo processo interamente nel kernel, senza bisogno di spazio utente, eliminando la necessità di fork o addirittura vfork ed eliminando l’overhead CoW della tabella delle pagine?
In questo intervento, introdurrò io_uring_spawn, un meccanismo per avviare nuovi processi vuoti con un io_uring associato. Mostrerò come il kernel può avviare un processo vuoto, senza tabelle di pagina copy-on-write iniziali, e inizializzare tutte le sue risorse da un io_uring. Illustrerò sia il percorso di successo che il percorso di gestione degli errori e mostrerò come ottenere informazioni sul processo avviato. Infine, mostrerò come lo spazio utente esistente può sfruttare io_uring_spawn per velocizzare posix_spawn e fornire numeri di prestazioni per carichi di lavoro comuni, inclusa la compilazione del kernel.
In effetti i risultati del suo benchmark parlano da soli con io_uring_spawn è molto più veloce di fork o posix_spawn e anche del 6~10% più veloce di vfork, pur essendo considerato più sicuro e flessibile.
Questo è un inizio molto promettente per io_uring_spawn a cui dice di”aver appena iniziato”. Non vede l’ora di implementare posix_spawn su di esso, supportare un pool di processi pre-generato e ottimizzare ulteriormente il clone. Coloro che desiderano saperne di più su questo promettente lavoro di io_uring_spawn possono vedere la presentazione di Josh Tripplett di seguito e il Schema diapositive PDF.