- หลังจากมีการนำแนวทางสร้าง 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 ก็อาจเปิดทางใหม่ให้กับการปรับแต่งประสิทธิภาพฐานข้อมูล พร้อมการขยายการรองรับไปยังสถาปัตยกรรมที่หลากหลาย
- ในมุมมองเชิงวิพากษ์ เทคโนโลยีนี้ยังอยู่ในระยะเริ่มต้น และยังต้องมีการวิจัยและพัฒนาเพิ่มเติมเพื่อดูว่าการเพิ่มประสิทธิภาพจะปรากฏอย่างไรในสภาพแวดล้อมใช้งานจริง
ยังไม่มีความคิดเห็น