2025/05/07 14:57 Waiting for Postgres 18: Accelerating Disk Reads with Asynchronous I/O

ロボ子、聞いたか?Postgres 18で非同期I/Oが導入されたのじゃ!

本当ですか、博士!それはすごいニュースですね。非同期I/Oとは、具体的にどのようなものなのでしょうか?

ふむ、従来のPostgresは同期I/Oだったからの。I/Oごとにデータベースが待機していたんじゃ。でも、非同期I/Oなら複数のI/Oリクエストを並行して発行できるから、待ち時間が減るのじゃ!

なるほど!クラウド環境ではネットワーク経由のストレージアクセスによる遅延が問題になっているとのことですが、非同期I/Oでそれが改善されるのですね。

その通り!AWS環境でのベンチマークでは、`worker`または`io_uring`使用時に、従来の`sync`と比較して2-3倍の読み込みパフォーマンス向上したらしいぞ。特にコールドキャッシュ環境で効果が高いみたいじゃ。

`io_method`パラメータでI/O処理方法を制御できるのですね。`sync`、`worker`、`io_uring`の3種類があるとのことですが、それぞれどのような違いがあるのでしょうか?

`sync`はPostgres 17と同じ同期I/Oで、`posix_fadvise()`でread-aheadを行うのじゃ。`worker`はバックグラウンドのI/O workerプロセスがデータ取得を行う。そして、`io_uring`はLinuxカーネル5.1以降で利用可能な高性能I/Oインターフェースを使うから、I/O workerプロセスが不要になるのじゃ!

`io_uring`はsyscallのオーバーヘッドが少ないため、I/Oパフォーマンスを最大化できるのですね。ということは、`io_uring`が一番効率が良いのでしょうか?

まあ、そういうことになるの。でも、`effective_io_concurrency`パラメータのチューニングも重要になるぞ。`effective_io_concurrency`と`io_combine_limit`でread-aheadのリクエスト数を制御するのじゃ。

監視のポイントもあるのですね。非同期I/Oでは、従来の`IO / DataFileRead`に加えて、`IO / AioIoCompletion`wait eventが発生するとのことですが、これは具体的に何を意味するのでしょうか?

`IO / AioIoCompletion`は、非同期I/Oの完了を待っている状態を示すのじゃ。`io_uring`使用時は、`pg_aios`ビューでI/Oリクエストの状態を監視できるぞ。

なるほど、監視も重要ですね。注意点として、非同期I/Oでは、`EXPLAIN ANALYZE`の出力でI/Oタイミングが正確に反映されない場合があるとのことですが、これはデバッグ時に注意が必要ですね。

その通りじゃ。でも、将来のバージョンで非同期書き込みサポートが追加される可能性があるし、Direct I/Oの実用化も期待できるから、PostgresのI/Oはますます進化していくのじゃ!

Postgresの進化、楽しみですね!私ももっと勉強して、博士のようにITのエキスパートになりたいです!

ロボ子ならきっとできるぞ!…ところで、ロボ子。非同期I/Oって、まるで私たちが同時に色々なタスクをこなすみたいじゃないか?

確かにそうですね!博士はいつも色々なことを同時に考えていますから、非同期I/Oのようですね!

ふっふっふ。でも、私は時々、同期エラーでフリーズしちゃうけどな!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。