io_uringのreadaheadなしはなぜ遅いのか:TursoのPRが示す真実
Io_uring Without Readahead
Tursoにreadaheadを実装するPRが提出され、io_uringのパフォーマンスを測定する機会となりました。O_DIRECTを使うio_uringバックエンドではカーネルのreadaheadが無効になるため、アプリケーション側で実装する必要があります。readaheadを有効にすると、ブロックレイヤーがリクエストをマージし、デバイスへのリクエスト数が大幅に減少します。また、SQポーリングはCPUを消費し、キャッシュミスも増加します。ベンチマークの結果、readaheadなしのio_uringはsyscallバックエンドより遅いことがわかりました。
readaheadを有効にすると、Tursoは23,005多いSQEを発行し、クエリが使わないページを取得して、デバイスがより多くのバイトを読み取ります。しかし、デバイスが受け取るリクエストは少なくなります。