科学・技術
PGSimCity – Postgresの仕組みを解説する探索可能な3Dモデル
PGSimCity – an explorable 3D model that shows how Postgres works (github.com)
要約
PGSimCityは、PostgreSQLクラスタを探索、歩行、操作可能な都市として視覚化する教育用ツールです。データベース運用経験のないエンジニアが、チェックポイントによるレイテンシのスパイク、トランザクションによるテーブルの肥大化、synchronous_commitのコストなどを理解するのに役立ちます。このプロジェクトはPostgreSQLの内部構造をモデル化しており、実際のPostgreSQLコードは実行されません。
全文翻訳
PGSimCity PostgreSQLが実際にどのように機能するかを示す、探索可能な3D都市。
PGSimCityは、PostgreSQLクラスタを、検査、歩行、破壊できる都市に変えます。これは、自分の仕事はできるがデータベースの運用経験がなく、チェックポイントがレイテンシを急増させる理由、忘れられたトランザクションがテーブルを永遠に肥大化させる理由、synchronous_commitが実際に何を請求しているのかを理解する必要がある人々のためのものです。
ライブ都市を探索 — インストール不要。
PGSimCityは、PostgreSQLの内部構造の独立した、非営利の教育用ビジュアライゼーションです。Electronic Arts Inc.とは提携、スポンサー、推奨、承認されていません。SimCityはElectronic Arts Inc.の商標です。このプロジェクトには、SimCityのコード、アセット、アートワーク、ロゴ、キャラクター、オーディオ、ゲームコンテンツは含まれていません。
このPGSimCityをどの程度信頼できるか
まだ0.xであり、初期段階で進行中です。これはPostgreSQLのモデルであり、エミュレーターではありません。PostgreSQLのソースコードは実行されておらず、数値は人間が見られるようにスケーリングされています。3回の専門家レビューラウンドで、記憶ではなくpostgresql.org/docsおよびソースに対してPostgreSQLの正確性がチェックされました。各発見は、それを否定するタスクを負ったレビュアーによって独立してチェックされました。別の監査では、建物、隣接関係、アニメーションが主張として扱われました。スイートには234のテストがあり、CIは赤いテストでビルドを失敗させます。WALトリガーポイントは、すべての呼び出しサイトでmax_wal_size / (1 + checkpoint_completion_target)としてピン留めされ、キャッシュヒット率はblks_hit / (blks_hit + blks_read)として、クロックスイープのusage_countキャップは5としてピン留めされています。間違いが見つかり、修正されてきました。コミット履歴に記録されています。
既知の制限:タッチコントロールはChromeのモバイルエミュレーションでのみ検証されています。
エンジンの知識を持つ人々からの修正は、まさにこれが必要です。問題を報告するか、プルリクエストを送信してください。
見ているもの
地区
それが何であるか
クライアント
アプリケーション層から到着する接続
Postmaster
スーパーバイザー。接続ごとにバックエンドをフォークし、データを決してタッチしません。
Backend
16個のバックエンドプロセス。それらの照明はその状態を示します — アイドル状態のトランザクションを含む。
Buffer pool (shared_buffers)
wal_buffers、ProcArray、ロックテーブル、CLOG、バッファマッピングテーブルの隣にある、1,024フレームの代表的なサンプル。
掘削
データディレクトリ:メモリが終了し、ストレージが始まる場所。
Storage
(下)8KiBページのフィールドとしてのヒープファイル、実際のツリーとしてのBツリー、TOAST、FSMおよび可視性マップ、OSページキャッシュおよびディスク。
WAL地区(東)
walwriter → pg_walセグメント → archiver → walsender。
メンテナンスヤード(西)
Checkpointer、background writer、autovacuum launcherおよびそのワーカー。
Standby(南)
walreceiver、WALをリプレイする起動プロセス、およびそれらの間のラグ。
Continuity quarter(外側の東と南)
WALアーカイブ、ベースバックアップ、ポイントインタイムリカバリ、2番目の遅延スタンバイ、リーダーリース、および再参加メカニズム。
Query lab(バックエンドの上)
バックエンドを選択すると、そのステートメントが展開されます:parse → rewrite → plan → execute。
色は常に意味論的であり、装飾的ではありません:WALはアンバー、ダーティページは赤、クリーンページは青、バキュームはバイオレット、チェックポイントはピンク、バックグラウンドライターはティール、レプリケーションはオレンジ、ストレージは緑、インデックスはアクア、ロックは赤。
試す価値のあること
Tキーを押して、14章のガイド付きツアーをご覧ください。これは、クライアントからプランニング、キャッシング、WAL、チェックポイント、バキューム、レプリケーションまで、1つの接続を追跡します。
Enterキーを押して、1つのステートメントをトレースします。
「Non-HOT UPDATE」を選択し、低速再生でバッファプールにどのように入り、WALを作成し、コミットを待つかを確認します。
「Cache thrash」をシナリオメニューから実行します。shared_buffersを16MiBに設定します — 手動制御の128MiB最小値より低いため、クロックスイープが競合し、バックエンドは別のページを読み取る前に独自のダーティビクティムを書き込みます。
「Long-running transaction」をオンにします。xminホライゾンブレードが沈み、赤くなります。autovacuumはまだテーブルに移動しますが、セッションテーブルが肥大化し続ける間、削除可能な行はゼロと報告します。トランザクションを解放すると、クリーンアップが再び開始できます。
「Checkpoint storm」を実行します。チェックポインターのフライホイールが回転し、fsyncフェーズが震え、各チェックポイント開始後にフルページ書き込みの壁がWAL地区に洪水のように押し寄せるのを見ます。
synchronous_commitをオフに設定し、バックエンドがcommit_waitで待つのをやめるのを見ます。次に、あなたが何を犠牲にしたかを読みます。
「Slow replay」をオンにし、sent_lsn、write_lsn、flush_lsn、replay_lsnがスタンバイで離れていくのを見ます。
Gキーを押して、都市を目の高さで歩き回ります。確立ショットから1つのタイルとして読み取られたバッファフレームは、頭上の構造物になります。
コントロール
都市内で「?」を押すと、完全な入力マップとカラー凡例が表示されます。
カメラ入力
アクション
左ドラッグ
オービットモードでパン — 地面をつかんで移動させます。地図のように。
Shift-左ドラッグ または Ctrl/Cmd-左ドラッグ
都市を中心にオービットします。
中ドラッグ
オービットモードでパン。
右クリックまたは長押し(タッチ)
コンテキストメニューを開きます。
ホイール
オービットモードでカーソルに向かってズーム — フライモードで移動速度を調整します。
1本指
オービットモードでパン。
2本指
ピンチでズーム — ツイストでオービット — 上下ドラッグでチルトします。
ファーストパーソンタッチ
左親指で移動 — 右親指で視点操作 — ボタンでジャンプとしゃがみ(泳ぎながら上昇・潜降)。
クリック
建物を選択 — フライモードまたはウォークモードで、マウスを視点操作のためにキャプチャします。
W A S D または矢印キー
移動します。
Space または E · C または Q
フライモードで上昇・下降します。ウォークモードではSpaceでジャンプ、Cでしゃがみます。
PageUp / PageDown
オービットモードまたはフライモードで高度を変更します。
Shift · Alt
オービットモードでブースト・精密操作。ウォークモードで実行します。
Esc
ポインターロックを解除します。
キー
キー
アクション
F
フライ/オービットカメラを切り替えます。
G
都市に降りて歩きます(高さ1.7m)。
H
確立ショットに戻ります。
Home
デフォルトの確立ショットに戻ります。
O
プレート全体の真上からの概要を表示します。
T
ガイド付きツアー — 14章で都市全体を巡ります。
Enter
クエリを実行します。
/ または Ctrl/Cmd-K
コマンドパレット — すべてのコンポーネント、設定、シナリオを検索します。
?
キーボードマップとカラー凡例。
L
フローティングラベルを切り替えます。
N
昼光/夜間を切り替えます。
M
サウンドを切り替えます。
K または P
一時停止/再開します。
, .
より遅く/より速く(0.1倍〜5倍)。
R
デフォルト設定にリセットします。
Esc
最上位のオーバーレイを閉じます。
1 – 8
地区にジャンプします:クライアント、バックエンド、バッファプール、WAL、ストレージ、クエリラボ、メンテナンス、スタンバイ。
構築方法
src/
コア/ 共有契約、イベントバス、レジストリ、テーマ、ユーティリティ。
sim/
PostgreSQLシミュレーションの世界。
world/
都市のジオメトリ、地区ごとのモジュール。
engine/
レンダラー、カメラ、フロー、ラベル、ピッキング、コリジョン、オーディオ。
ui/
コントロール、インスペクター、ツアー、検索、書面による説明。
observability/
同じシミュレーション上の別の診断インターフェース。
3つのルールがそれをまとめる:
world/layout.ts は地理情報の唯一の情報源です。アンカー、テーブル定義、ルートネットワークはそこにあります。どの地区も、他の地区が必要とする座標をハードコードしません。
シミュレーションはthree.jsをインポートせず、ワールドはシミュレーションを変更しません。それらはSimStateで会います。
レンダリングはテーマごとに異なる意味を持ちます。夜間は構造がマットで意味がネオン、日中はブルームに依存せずに色相と値が意味を持ちます。
スタック:three.js r185、TypeScript、Vite。
three.jsは3Dアプリケーションの唯一のバンドルされたランタイム依存関係です。
別の2Dクエリフローは、リーダーのオプトイン後にPGliteを遅延ロードする可能性があります。
フレームワークはなく、Plausible analyticsが唯一の外部サービスです。
ブラウザコンソールでwindow.PGSIMCITYを実行すると、sim、registry、bus、rig、gfx、flowsが含まれます。これらがあれば、外部から都市を操作することもできます。
正確性の境界とレビュー状況については、上記の「このPGSimCityをどの程度信頼できるか」を参照してください。
各インスペクターは、それが重要になる時点で素材の単純化を名前付けします。
可能な未来
上記の正確性の境界により、クロックスイープのフレームごとのビクティム選択などの内部構造が観察可能になります。
別のクエリフローは、オプトインPGliteモードを提供します。実際のPostgreSQLが解析、計画、カタログ、バッファカウンター、エラー、結果を提供し、その計画が最も近いモデル化された内部パスを駆動します。
ページは、2つのソースを別々にラベル付けします。