PlusMagi's Blog By Pitt Phunsanit Database การปรับแต่ง Memory Settings: การจูน innodb_buffer_pool_size (MariaDB) และ shared_buffers / work_mem (Postgres)

การปรับแต่ง Memory Settings: การจูน innodb_buffer_pool_size (MariaDB) และ shared_buffers / work_mem (Postgres)

ในโลกของการประมวลผลข้อมูลขนาดใหญ่ (Big Data) ประสิทธิภาพของระบบฐานข้อมูลคือตัวชี้วัดความสำเร็จที่สำคัญที่สุด การที่ระบบเกิดอาการหน่วงหรือตอบสนองช้า มักไม่ได้มาจากโค้ดเพียงอย่างเดียว แต่ส่วนใหญ่มักมีรากฐานมาจากการจัดการทรัพยากรหน่วยความจำ (Memory) ที่ไม่มีประสิทธิภาพ ซึ่งหากปล่อยปละละเลย จะทำให้แม้แต่ฮาร์ดแวร์ที่ทรงพลังก็ทำงานได้ไม่เต็มศักยภาพ


หลักการจูนหน่วยความจำใน PostgreSQL

การปรับแต่งหน่วยความจำใน PostgreSQL คือการกำหนดกลยุทธ์ให้ระบบทราบว่าควรเก็บข้อมูลใดไว้ใน RAM เพื่อลดภาระในการอ่าน/เขียนดิสก์ (I/O Operation) ซึ่งเป็นคอขวดที่ช้าที่สุด การทำความเข้าใจพารามิเตอร์หลักอย่าง shared_buffers และ work_mem จึงเป็นสิ่งจำเป็นสำหรับ Database Administrator (DBA) ระดับมืออาชีพ

Shared Buffers คือพื้นที่แคชขนาดใหญ่ที่ PostgreSQL ใช้เก็บข้อมูลและดัชนีที่ถูกเรียกใช้บ่อยครั้ง (Data Caching) การกำหนดค่านี้อย่างเหมาะสมจะช่วยให้การเข้าถึงข้อมูลส่วนใหญ่เป็นแบบ In-Memory แทนการอ่านจากดิสก์

ขณะที่ Work Mem คือหน่วยความจำที่ใช้สำหรับการประมวลผลธุรกรรมที่ซับซ้อน เช่น การจัดเรียงข้อมูล (Sorting) หรือการทำ Hash Join เมื่อ Query มีความซับซ้อนและต้องใช้หน่วยความจำในการคำนวณมาก การเพิ่มค่า work_mem จะช่วยให้การคำนวณเหล่านี้เสร็จสิ้นอย่างรวดเร็วโดยไม่เกิดการ Spill to Disk

แนวทางการปรับจูนและตัวอย่างคำสั่ง

การปรับจูนหน่วยความจำต้องอาศัยความเข้าใจในการบาลานซ์ทรัพยากรระหว่างส่วนแคช (Shared Buffers) และส่วนประมวลผล (Work Mem) หากกำหนดค่าใดค่าหนึ่งมากเกินไป อาจทำให้ระบบปฏิบัติการหรือส่วนอื่น ๆ ของแอปพลิเคชันขาดหน่วยความจำ ทำให้เกิดอาการ Swap Memory ซึ่งส่งผลให้ประสิทธิภาพโดยรวมดิ่งลงอย่างรุนแรง

1. การตั้งค่า Shared Buffers

ควรตั้งค่า shared_buffers ให้มีขนาดประมาณ 25% ของ RAM ทั้งหมดของเซิร์ฟเวอร์ (แต่ไม่ควรเกิน 25%)

SQL

-- ตัวอย่างการตั้งค่า shared_buffers เป็น 2GB (ปรับตามขนาด RAM จริง)

SQL

ALTER SYSTEM SET shared_buffers = '2GB';

2. การตั้งค่า Work Mem

work_mem ควรตั้งค่าให้เหมาะสมกับ Query ที่ซับซ้อนที่สุดในระบบ หากตั้งค่าต่ำเกินไป การ Sort/Hash Join จะล้มเหลวและใช้ดิสก์แทน

SQL

-- ตัวอย่างการตั้งค่า work_mem เป็น 16MB

SQL

ALTER SYSTEM SET work_mem = '16MB';

บทสรุปและข้อควรระวัง

การจูนหน่วยความจำไม่ใช่การเพิ่มค่าตัวเลขไปเรื่อย ๆ แต่คือการวิเคราะห์ Workload ของแอปพลิเคชันอย่างละเอียด เพื่อให้แน่ใจว่าทรัพยากรหน่วยความจำถูกจัดสรรอย่างสมดุลระหว่างการแคชข้อมูล (Shared Buffers) และการประมวลผล Query (Work Mem) ก่อนทำการปรับค่าใด ๆ ควรมีการทดสอบ Benchmark อย่างรอบด้าน เพื่อวัดผลลัพธ์ที่แท้จริงและป้องกันปัญหา Memory Exhaustion ที่อาจเกิดขึ้นได้