• เครื่องมือฉีดความล้มเหลวสำหรับสร้างสถานการณ์ขัดข้องอย่างจงใจเพื่อทดสอบ เช่น การเชื่อมต่อหมด/การรอล็อก/เดดล็อก/OOM/ดิสก์เต็ม
  • รองรับเวิร์กโหลดได้หลากหลาย ตั้งแต่ทรานแซกชันค้าง/rollback/เดดล็อก/ไฟล์ชั่วคราว/การปิด backend ไปจนถึง WAL พุ่งสูง/ตารางบวม
  • เวิร์กโหลดบางแบบอาจทำให้เกิดทั้งการใช้ max_connections จนหมด ความล่าช้าในการทำ replication ประสิทธิภาพสตอเรจลดลง ไปจนถึง PANIC หรือการรีสตาร์ตทั้งอินสแตนซ์ ของ PostgreSQL
  • รันได้ทันทีผ่าน Docker image หรือดึงเวิร์กโหลดแต่ละตัวไปใช้จากโค้ด Go ได้ โดยจำเป็นต้องใช้ context และการกำหนดเวลา timeout เพื่อหลีกเลี่ยงการรันไม่รู้จบ
  • เวิร์กโหลดที่รองรับ
    • idle transactions: เปิดทรานแซกชันทิ้งไว้โดยไม่ทำอะไร ขัดขวางการเก็บกวาด (VACUUM) และทำให้ตาราง/ดัชนีบวม
    • rollbacks: จงใจส่งคิวรีที่ผิดเพื่อให้เกิดข้อผิดพลาดและเพิ่มจำนวน rollback
    • waiting transactions: ให้หนึ่งเซสชันล็อกตารางไว้ แล้วการเชื่อมต่อถัด ๆ ไปต้องรอต่อคิว จนสุดท้ายแตะขีดจำกัดการเชื่อมต่อ (max_connections) และบล็อกการเชื่อมต่อใหม่
    • deadlocks: ทำให้สองทรานแซกชันเข้าสู่ภาวะเดดล็อกที่ต่างฝ่ายต่างต้องการล็อกของกันและกัน
    • temporary files: บังคับให้มีการ sort ข้อมูลที่ใหญ่กว่าหน่วยความจำ (work_mem) จนเทไฟล์ชั่วคราวลงดิสก์ (work_mem มากพอก็จะไม่เกิด)
    • terminate backends: บังคับปิดเซสชัน/คิวรีที่กำลังรันแบบสุ่มด้วย pg_terminate_backend() เป็นต้น
    • failed connections: ยึดการเชื่อมต่อทั้งหมดไว้จนไคลเอนต์อื่นไม่สามารถเชื่อมต่อได้เลย ทำให้ใช้ขีดจำกัด max_connections จนหมด
    • fork connections: ยิงคิวรีสั้น ๆ ด้วยการเชื่อมต่อใหม่ทุกครั้ง เพื่อทำให้ Postgres สร้าง child process มากเกินไป
    • backend-killer: ให้หนึ่งเซสชันสะสม prepared statement ต่อเนื่องจนหน่วยความจำพองตัว และทำให้อินสแตนซ์ทั้งตัวรีสตาร์ตจาก OOM-kill
    • slot-bloat: replication slot ที่ไม่มีใครอ่านจะกัก WAL ไว้จน pg_wal เติมดิสก์เต็ม และทำให้อินสแตนซ์เกิด PANIC
    • wal-flood: ใช้ worker UPDATE แบบขนานเพื่อทำให้ WAL พุ่งสูง สร้าง replication lag/แรงกดดันต่อ IO (เวอร์ชันที่ "มองเห็นได้" ของ slot-bloat ส่วนการทำให้ดิสก์เต็มขึ้นอยู่กับสภาพแวดล้อม)
    • bloat-churn: ใช้ UPDATE แบบขนานทำให้ตารางบวมเร็วกว่าที่ autovacuum จะตามทัน แต่หลังหยุดแล้วสามารถกู้กลับได้ด้วย VACUUM FULL/pg_repack/REINDEX CONCURRENTLY
  • ห้ามรันโดยที่ยังไม่เข้าใจทั้งหมด และควรใช้ เพื่อการทดสอบเท่านั้น
  • สัญญาอนุญาต BSD-3-Clause

ยังไม่มีความคิดเห็น

ยังไม่มีความคิดเห็น