カーネル AIO とO_DIRECT|O_SYNC
を使用すると、カーネル バッファーへのコピーがなく、データが実際にディスクにフラッシュされたときにきめ細かい通知を受け取ることができます。ただし、 のユーザー空間バッファにデータを保持する必要がありますio_prep_pwrite()
。
を使用splice()
すると、データをコピーすることなく、カーネル スペース バッファ (パイプ) からディスクに直接移動できます。ただし、splice()
データがキューに入れられるとすぐに戻り、ディスクへの実際の書き込みを待機しません。
目標は、データがフラッシュされたことを確認しながら、データをコピーせずにソケットからディスクに移動することです。以前の両方のアプローチを組み合わせる方法は?
と組み合わせるsplice()
とO_SYNC
、ブロックすることが期待splice()
され、複数のスレッドを使用してレイテンシをマスクする必要があります。または、非同期io_prep_fsync()
/を使用することもできますio_prep_fdsync()
が、これは特定の書き込みではなく、すべてのデータがフラッシュされるのを待ちます。どちらも完璧ではありません。
必要なのは、splice()
カーネル AIO との組み合わせであり、単一のイベント駆動型スレッドがデータをソケットからディスクに移動し、必要に応じて確認を取得できるように、ゼロ コピーと書き込みの非同期確認を可能にしますが、これはそうではないようです。サポートされています。良い回避策/代替アプローチはありますか?