Con il kernel AIO e O_DIRECT|O_SYNC
, non c'è copia nei buffer del kernel ed è possibile ottenere una notifica a grana fine quando i dati vengono effettivamente scaricati sul disco. Tuttavia, richiede che i dati vengano conservati nei buffer dello spazio utente per io_prep_pwrite()
.Linux splice() + kernel AIO quando si scrive su disco
Con splice()
, è possibile spostare i dati direttamente sul disco dai buffer di spazio del kernel (pipe) senza doverli mai copiare. Tuttavia, splice()
restituisce immediatamente dopo l'accodamento dei dati e non attende la scrittura effettiva sul disco.
L'obiettivo è spostare i dati da socket a disco senza copiarli mentre si riceve la conferma che è stato eliminato. Come combinare entrambi gli approcci precedenti?
Combinando splice()
con O_SYNC
, mi aspetto che splice()
blocchi e si debbano utilizzare più thread per mascherare la latenza. In alternativa, è possibile utilizzare lo standard asincrono io_prep_fsync()
/io_prep_fdsync()
, ma questo attende che tutti i dati vengano svuotati, non per una scrittura specifica. Nessuno dei due è perfetto
Ciò che sarebbe necessario è una combinazione di splice()
con kernel AIO, che consente la copia zero e la conferma asincrona delle scritture, in modo che un singolo thread guidato da eventi possa spostare i dati dai socket al disco e ottenere le conferme quando richiesto, ma ciò non sembra essere supportato C'è un buon approccio alternativo/alternativo?