4 ポイント 投稿者 GN⁺ 2025-05-08 | 2件のコメント | WhatsAppで共有
  • 現在ベータ1のPostgres 18は、非同期I/O(Asynchronous I/O) のサポートを導入し、特にクラウド環境での読み取り性能を大幅に改善
  • 新しい設定値 io_method により、従来のsync方式に加えて worker、io_uring方式を選択可能
  • AWSベースのベンチマーク結果では、io_uring 使用時にディスク読み取り性能が最大3倍向上
  • ただし、非同期化によって従来のクエリ分析(EXPLAIN ANALYZE)におけるI/Oタイミングの解釈がより難しくなる
  • 新しい監視ビュー(pg_aios) とチューニングパラメータ effective_io_concurrency により、性能最適化が必要

Postgres 18への非同期I/O導入

  • 従来、PostgresはブロッキングI/Oモデルを使用し、各ディスク読み取りが完了するまで待機
  • ネットワークベースのストレージ(EBSなど)での高いレイテンシにより、クラウド環境でボトルネックが発生
  • 非同期I/Oは複数のディスク読み取りを並列処理可能にし、CPU使用率と全体スループットを高める

Postgres 17の事前準備:Read Stream API

  • Postgres 17では read_stream API を導入し、読み取り処理の抽象化を標準化
  • ただし、これは依然としてOSのページキャッシュに依存しており、Postgres自身のshared bufferには直接反映されない
  • Postgres 18では、カーネルヒントではなく直接的な非同期読み取りが可能に

新しい設定:io_method

  • Postgres 18は postgresql.confio_method 設定を追加し、次の3つのオプションを提供:

io_method = sync

  • 既存のPostgresと同じ同期方式
  • posix_fadvise() ベースの先読み要求方式を使用

io_method = worker(デフォルト)

  • I/O専用のワーカープロセスが非同期にデータを読み取り、共有バッファへ渡す
  • メインプロセスは読み取り処理で停止せずに継続実行可能
  • デフォルトのワーカー数は3で、io_workers 設定で調整可能

io_method = io_uring

  • Linuxカーネル5.1以降で利用可能な高性能I/Oインターフェース
  • ワーカープロセスなしでも、カーネルとの共有リングバッファを通じて直接非同期読み取りを実行
  • 新しいカーネル、ファイルシステム、設定が必要

非同期I/Oの性能ベンチマーク(AWSベース)

  • テスト環境:
    • AWS c7i.8xlarge(32 vCPU、64GB RAM)
    • 100GB io2 EBS、20,000 IOPS
    • 3.5GB規模のテーブルに対して SELECT COUNT(*) を実行

コールドキャッシュ性能比較:

バージョン/設定 実行時間(ms)
Postgres 17 (sync) 15,831
Postgres 18 (sync) 15,071
Postgres 18 (worker) 10,052
Postgres 18 (io_uring) 5,723
  • io_uringsync と比べて2.8倍の性能向上
  • クラウドにおけるディスクレイテンシ最小化に卓越した効果

effective_io_concurrency のチューニング

  • Postgres 18では、このパラメータが内部の非同期read-ahead要求数に影響
  • デフォルト値が1 → 16に引き上げられ、io_combine_limit との積で最大読み取り範囲を決定
  • 高レイテンシなクラウド環境では大きな値が有利な場合があるが、ワークロードごとのベンチマークが必要

新しい監視ツール:pg_aios

  • pg_stat_activity では非同期処理時に**AioIoCompletion イベント**として表示され、バックエンドの待機分析が難しい
  • io_uring の場合、カーネルが直接処理するためI/O状態がPostgresから見えない
  • pg_aios ビューを通じて、現在進行中の非同期リクエストの詳細情報を確認可能
    SELECT * FROM pg_aios;  
    
  • SUBMITTED, COMPLETED_IO などの状態と対象ブロック情報を確認可能

注意点:I/Oタイミング情報の解釈の変化

  • 従来の EXPLAIN ANALYZE で表示されていた I/O Timings は同期方式でのみ信頼可能
  • 非同期化された workerio_uring 使用時には、並列処理とワーカー分散によりタイミング情報の解釈が歪む
  • 実際のI/O負荷を判断する際は、shared read バッファ数と pg_aios の活用が推奨される

結論

  • Postgres 18は読み取り中心ワークロードの性能向上に実質的に貢献
  • 特にクラウド環境の高レイテンシディスクを利用する場合に大きな利点がある
  • 同時に、観測指標の解釈、性能チューニング、設定適用方法についての再学習が求められる
  • 今後のPostgres 19では非同期書き込み対応も期待される

2件のコメント

 
jujumilk3 2025-05-09

Postgres は本当に最高、超すごい

 
GN⁺ 2025-05-08
Hacker Newsの意見
  • Linuxでは preadv2(..., RWF_NOWAIT) を使ってページキャッシュから非同期読み取りを実行できる。これは io_method = worker でレイテンシを下げるのに役立つ可能性がある
    • メインスレッドで NOWAIT 読み取りを試し、失敗した場合にのみワーカースレッドへオフロードする方法が提案されている
  • この新しい非同期I/O機能がLinux専用なのかという質問がある
    • WindowsにはIOCPと独自のIORing実装があり、macOSはPOSIX AIOをサポートしている
    • WindowsのIORing実装への言及があまり多くないことが指摘されている
  • FreeBSDの aio(4) には多くの作業が行われており、Linux/glibc aioの欠点がない点から、その動作の仕組みは興味深いだろうという意見
  • MySQLのInnoDBとの類似性についての質問がある
  • io_uring のセキュリティ問題への懸念があり、多くのLinux管理者やディストリビューションがこれを無効化しているのかという質問がある
  • NVMeでこの機能を本番投入したいという意見があり、主要クラウドプロバイダーがこれをASAPで提供してくれることを望んでいる
    • 性能向上が非常に魅力的だとしている
  • Hetzner EX-44サーバーにPostgresを導入した経験の共有
    • コストパフォーマンスが非常に高く、エンタープライズ級の容量を低コストで提供する
    • TailScaleを使ってセキュリティを強化し、パブリックネットワークへの露出を完全になくしている
    • 最適化アプローチには、PGTuneによるワークロード別設定、PgHeroによるリアルタイム性能監視、pgcronによる自動 VACUUM ANALYZE ジョブなどが含まれる
    • ZSTD圧縮バックアップ向けのカスタムCLIユーティリティを開発し、高い圧縮率と高スループットを維持しつつ自動S3アップロードをサポートしている
    • この構成は安定しており高性能で、十分な成長余地がある
  • AWSインスタンスの20k IOPSについての半ば冗談めいた意見
    • コンシューマー向けNVMeは約100万超のIOPSを提供しており、PCIe 5.0 NVMeによってさらに増えると見込まれている
    • クラウドの恣意的な制限が多くの問題を引き起こしていると考えている
    • 非同期IOは非常に有用だが、100万IOPSのNVMeでは重要性がやや低くなるだろう
    • クラウドコストは非常に高く、安価なコンシューマーハードウェアとの性能差が大きい
  • Postgres、MariaDB、Percona間の性能比較についての質問がある
    • それぞれのデータベースがどのようなケースで優れているのか気にしている
  • より多くの同時接続を許可するアップデートがいつリリースされるのかという質問がある
    • pgbouncer の利用をやめられることを期待している