noisia - ตัวสร้างเวิร์กโหลดอันตรายสำหรับ PostgreSQL
(github.com/lesovsky)- เครื่องมือฉีดความล้มเหลวสำหรับสร้างสถานการณ์ขัดข้องอย่างจงใจเพื่อทดสอบ เช่น การเชื่อมต่อหมด/การรอล็อก/เดดล็อก/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
- idle transactions: เปิดทรานแซกชันทิ้งไว้โดยไม่ทำอะไร ขัดขวางการเก็บกวาด (
- ห้ามรันโดยที่ยังไม่เข้าใจทั้งหมด และควรใช้ เพื่อการทดสอบเท่านั้น
- สัญญาอนุญาต BSD-3-Clause
ยังไม่มีความคิดเห็น