Skip to content

PostgreSQLの並行配送・SQL・履歴保持を改善 - #1

Merged
aida0710 merged 4 commits into
mainfrom
perf/postgres-optimization
Sep 27, 2026
Merged

aida0710 merged 4 commits into
mainfrom
perf/postgres-optimization

Conversation

@aida0710

@aida0710 aida0710 commented Sep 27, 2026 •

Copy link
Copy Markdown
Member

同じchannelの送信が排他ロックで直列になり、履歴や古い統計によって受信・再生が遅くなるため、送信を共有ロックへ変更し、本文の主キー参照と期間索引を使うSQLへ改善します。登録との排他とREAD COMMITTEDを明示し、待機中に登録したノードへの配送を維持します。

保持期限は既定で無効です。channel内の全登録ノードが有効にした場合だけ、最長の保持・再生期間を過ぎたACK済みフレームを削除します。未ACKは維持し、SQL予算を超えたときは削除件数を半減します。受領情報に配送の世代を含め、削除前の古いACKが新しい同一UUIDの配送を消さないようにしました。既存DBには更新版schema.sqlの再適用が必要です。

検証:

  • PostgreSQL 16/17/18のCI成功。実DB17件、REPEATABLE READ既定の競合6件、SQLの実走査件数検証、fmt、Clippy、単体試験、配布物作成を実行。
  • 72試行で552,960送信・884,736配送の内容とACKを確認。3ノード/1400B/batch128の中央値は約54,654→179,109kbps(3.28倍)。2/3ノード・64/1400B・batch1/32/128、各3回、削除無効。
  • 古いchannel統計が残る受信は213.474→1.157ms、25万件の古い履歴に対する初回再生は55.630→0.174ms。時間の閾値に頼らず、全走査の反復をCIで検出。
  • 保持5秒・掃除100msの301秒耐久で1,683,456送信・3,366,912配送を照合。未ACK0、平均約62,555kbps、RSS約32〜37MiB。掃除は8回SQL予算に達し、小さいバッチへ調整して継続。
  • 初期統計からの12条件、旧スキーマのデータを保持する更新・再適用、IPC配送、CLI追加・更新・設定検証も成功。

速度はPostgreSQL 17.11の4CPU/2GiBコンテナ、loopback/TLSなし、fsync/synchronous_commit=onで測った3ノード合計です。本体パイプライン・IPC・NICの帯域は含みません。保持期間は最低保持時間で、容量上限ではありません。DB再起動後の自動復旧とOS隔離は追加していません。v0.2.0の版・更新手順とタグのCI公開ジョブを追加しました。公開前にバイナリ・manifest・SQLと全配布物のSHA256を照合し、公開済み版は上書きしません。公開手順の回帰試験6件も成功しています。

送信を共有ロックへ変更し、受信と初回再生のSQLを改善する。任意の保持期限と負荷に応じた掃除を追加し、世代付きACKで古い受領情報による誤削除を防ぐ。競合・キャンセル・移行・IPCの回帰試験とコンテナの耐久測定を整備する。
本文参照のchannelをInitPlanで受け取り、UUIDとの主キー探索を安定させる。統計の偏りを再現する実行計画検証を追加し、PostgreSQL 16/17/18のCIで走査件数の回帰を検出する。
@aida0710
aida0710 marked this pull request as ready for review September 27, 2026 08:11
@aida0710
aida0710 merged commit f95e710 into main Sep 27, 2026
8 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant