• หลังจากมีการนำแนวทางสร้าง JIT คอมไพเลอร์แบบใหม่ (copy-patch) มาใช้ใน Python 3.13 ก็ได้ตัดสินใจลองนำแนวทางนี้มาปรับใช้กับ PostgreSQL
  • มีการแนะนำแนวทางใหม่ชื่อ pg-copyjit ซึ่งเป็นวิธีเพิ่มความเร็วให้กับเซิร์ฟเวอร์ PostgreSQL
  • โค้ดทั้งหมดอยู่ในระดับทดลอง และควรผ่านการตรวจสอบจากผู้เชี่ยวชาญก่อนนำไปใช้ในสภาพแวดล้อมจริง

ในตอนแรกยังไม่มี JIT และต่อมาก็มี LLVM JIT คอมไพเลอร์ปรากฏขึ้น

  • PostgreSQL ได้เพิ่ม JIT compilation ที่ใช้ LLVM เข้ามา แต่ LLVM ก็มีบางส่วนที่ไม่เหมาะกับการทำ JIT compilation
  • การ optimize ของ LLVM มีต้นทุนสูง และถ้าไม่ใช้ การคอมไพล์เองก็อาจแทบไม่มีความหมาย
  • การประเมินต้นทุนคิวรีของ PostgreSQL ไม่ได้สัมพันธ์โดยตรงกับเวลารันจริง ทำให้ผู้ใช้จำนวนมากปิดการใช้งาน JIT คอมไพเลอร์

ปี 2021 มีการอธิบาย copy-and-patch ไว้

  • มีความจำเป็นต้องสร้างโค้ดที่เร็วและดีพอให้ได้โดยเร็วที่สุด
  • วิธี copy-patch ใช้ stencil (ฟังก์ชันเทมเพลต) ที่เขียนด้วย C เพื่อสร้างโค้ดได้อย่างรวดเร็ว
  • สามารถคัดลอก stencil ไปยังพื้นที่หน่วยความจำใหม่ แล้วเติมช่องว่างที่ต้องใส่ค่า เพื่อกระโดดเข้าสู่ฟังก์ชันที่ "คอมไพล์แล้ว" ได้ทันที

การนำ copy-and-patch มาใช้กับ PostgreSQL

  • การสร้าง JIT engine ใหม่ให้ PostgreSQL ไม่ได้ยากนัก และมีข้อเสนอให้ทำ LLVM เป็นปลั๊กอินเพื่อให้สามารถนำ JIT คอมไพเลอร์ตัวอื่นเข้ามาใช้ได้
  • เพียงจัดเตรียมฟังก์ชัน _PG_jit_provider_init ตัวเดียว และตั้งค่า callback 3 ตัวคือ compile_expr, release_context, reset_after_error ก็เพียงพอ
  • อัลกอริทึม copy-patch ค่อนข้างเรียบง่าย โดยค้นหา stencil สำหรับแต่ละ opcode แล้วเพิ่มเข้าไป พร้อมเติมค่าที่จำเป็นลงในช่องว่าง

สถานะปัจจุบัน

  • ทำงานได้บน PostgreSQL 16 และตอนนี้รองรับเฉพาะ AMD64
  • การสร้างโค้ดเสร็จสิ้นได้ภายในไม่กี่ร้อยไมโครวินาที จึงสามารถใช้กับคิวรีสั้น ๆ ได้
  • แม้ยังไม่ถึงขั้นตอนการ optimize แต่ก็เห็นได้แล้วว่าประสิทธิภาพดีขึ้นเมื่อเทียบกับ interpreter
  • opcode ที่รองรับยังมีไม่มาก แต่สำหรับคิวรีที่ยังไม่รองรับ PostgreSQL interpreter จะทำงานแทน

สิ่งที่ต้องทำต่อ...

  • ตอนนี้ยังเป็นเพียงขั้นพิสูจน์แนวคิด และยังไม่ได้มุ่งทำให้ build หรือ package ได้ง่าย
  • กำลังมุ่งเน้นที่การเพิ่ม opcode ให้มากขึ้นและค้นหาการ optimize เพิ่มเติม
  • กำลังพิจารณาการพอร์ตไปยังสถาปัตยกรรมอื่นอย่างจริงจังเช่นกัน

คำขอบคุณ

  • ขอขอบคุณ Entr’ouvert ที่ทำงานปัจจุบัน ซึ่งสนับสนุนให้เพื่อนร่วมงานสามารถสละเวลาให้กับโปรเจ็กต์นี้ได้
  • ขอบคุณเพื่อน ๆ สาย DBA ด้วย และขอแนะนำให้ลองใช้ PoWA

ความเห็นของ GN⁺

  • บทความนี้นำเสนอแนวทางใหม่ในการเพิ่มประสิทธิภาพของเซิร์ฟเวอร์ฐานข้อมูล PostgreSQL ซึ่งอาจเป็นเรื่องน่าสนใจสำหรับผู้ดูแลฐานข้อมูลและนักพัฒนา
  • ก่อนนำโค้ดระดับทดลองไปใช้ในสภาพแวดล้อมจริง จำเป็นต้องมีการทดสอบและตรวจสอบอย่างรอบคอบ เพื่อป้องกันความเสี่ยงอย่างข้อมูลสูญหายหรือระบบหยุดทำงาน
  • เมื่อเทียบกับ JIT คอมไพเลอร์แบบเดิมอย่าง LLVM วิธี copy-patch อาจทำให้สร้างโค้ดได้เร็วกว่า จึงอาจมีประโยชน์กับคิวรีสั้น ๆ ได้
  • หากเทคโนโลยีนี้ได้รับการยอมรับอย่างกว้างขวางในชุมชน PostgreSQL ก็อาจเปิดทางใหม่ให้กับการปรับแต่งประสิทธิภาพฐานข้อมูล พร้อมการขยายการรองรับไปยังสถาปัตยกรรมที่หลากหลาย
  • ในมุมมองเชิงวิพากษ์ เทคโนโลยีนี้ยังอยู่ในระยะเริ่มต้น และยังต้องมีการวิจัยและพัฒนาเพิ่มเติมเพื่อดูว่าการเพิ่มประสิทธิภาพจะปรากฏอย่างไรในสภาพแวดล้อมใช้งานจริง

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

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