noisia - PostgreSQL向けの有害なワークロード生成器
(github.com/lesovsky)- 接続枯渇/ロック待ち/デッドロック/OOM/ディスク不足のような障害状況を意図的に作り出してテストするフォールトインジェクションツール
- アイドルトランザクション/ロールバック/デッドロック/一時ファイル/バックエンド終了から、WALの急増/テーブル膨張まで、さまざまなワークロードに対応
- 一部のワークロードは、max_connectionsの枯渇/レプリケーション遅延/ストレージ性能低下を超えて、PostgreSQLインスタンスのPANICまたは全体再起動を引き起こす可能性がある
- Dockerイメージですぐに実行できるほか、Goコードから個別のワークロードを取り込むことも可能。無限実行を避けるため、contextとタイムアウトの使用が必須
- 対応ワークロード
- idle transactions: トランザクションを開いたまま何もさせず、クリーンアップ(VACUUM)を妨げてテーブル/インデックスを膨張させる
- rollbacks: 意図的に誤ったクエリを投げてエラーを発生させ、rollback回数を増やす
- waiting transactions: 1つのセッションがテーブルをロックし、後続の接続が次々に待機して、最終的に接続上限(
max_connections)に達し、新規接続をブロックする - deadlocks: 2つのトランザクションを、互いに相手のロックを求めるデッドロック状態に陥らせる
- temporary files: メモリ(
work_mem)より大きなデータをソートさせ、ディスク上に一時ファイルを大量に吐き出させる(work_memを増やすと解消) - terminate backends:
pg_terminate_backend()などで実行中のセッション/クエリをランダムに強制終了する - failed connections: すべての接続を占有し、他のクライアントがまったく接続できないようにする。
max_connections上限を使い切る - fork connections: 毎回新しい接続で短いクエリだけを投げ、Postgresに子プロセスを過剰に生成させる
- backend-killer: 1つのセッションがprepared statementを積み上げ続けてメモリを膨張させ、OOM-killによってインスタンス全体を再起動させる
- slot-bloat: 誰も読まないreplication slotがWALを保持し、
pg_walでディスクを満杯にしてインスタンスをPANICさせる - wal-flood: 並列
UPDATEワーカーでWALを急増させ、レプリケーション遅延/I/O圧迫を発生させる(slot-bloatの「目に見える」版。ディスクが満杯になるかは環境による) - bloat-churn: 並列
UPDATEでautovacuumより速くテーブルを膨張させる。ただし停止後はVACUUM FULL/pg_repack/REINDEX CONCURRENTLYで元に戻せる
- 完全に理解しないまま実行してはならず、テスト目的に限定して使用すること
- BSD-3-Clauseライセンス
まだコメントはありません。