อาการแปลกๆของ MySQL บน Xeon quad-core

เรื่องมีอยู่ว่า ผมทำ benchmark MySQL เพื่อให้แน่ใจว่ามันสามารถรับ load ได้จริง แต่เนื่องจากยุคนี้เป็นยุคของ Multi-cores การขยาย CPU จะไม่แข่งกันด้วย clock speed แต่จะแข่งกันที่จำนวน core ของ CPU โปรแกรมก็ต้องปรับเปลี่ยนเพื่อให้สามารถทำงานได้ดีบนจำนวน core ที่มากขึ้นเหล่านี้

MySQL เป็น database server ตัวหนึ่งที่ทำงานในลักษณะของ multi-threads ซึ่ง OS กระจาย thread ไปทำงานในแต่ละ core ของ CPU เคยได้ยินมาว่า MySQL ทำงานได้ไม่ดีนักกับจำนวน thread มากๆ มีหลายคนที่พยายามจะแก้ข้อจำกัดนี้ หนึ่งในนั้นคือ google ซึ่งมี code อยู่บน google code โดยจะมี patch เพื่อแก้ปัญหานี้

เดิมผมมี MySQL ทำงานอยู่บนเครื่อง PC Quad-core (Q6600) เครื่องหนึ่ง ลง Gentoo Linux ไว้ เมื่อได้ source code MySQL มาก็จัดแจง patch compile และ run โปรแกรม sysbench เพื่อทำ benchmark ผลออกมาน่าพอใจ throughput ออกมาได้พัน transaction ต่อวินาที (กราฟสีแดง)

ต่อมาได้ server ที่มี CPU Xeon quad-core มาทดสอบ ก็จัดแจงทำเหมือนเดิม แม้กระทั่ง mysql configuration file ก็ใช้ของเดิม พอ run sysbench อีกครั้ง ผลที่ออกมาน่าตกใจมาก (กราฟสีเขียว) throughput หล่นลงไปเหลือร้อยนิดๆ ลองเจ้าไปดูระระบบ CPU ก็ idle เกือบ 90% มันเกิดอะไรขึ้นหว่า พยายามหาคำตอบอยู่สองวันสองคืน ค้นใน Google ไม่มีใครพูดถึงเรื่องนี้เลย

sysbench-1

พี่ที่ทำงานช่วยดูเรื่องนี้ด้วยโดยลองลง FreeBSD 7.1 ให้ผลที่ไม่ต่างกัน ลองทำแบบเดิมในเครื่อง server ที่ใช้ Xeon quad-core อีกเครื่องก็ได้ผลไม่ต่างกัน นั่นแสดงว่าไม่ใช่ความบังเอิญ ผมยังไม่มีคำตอบในเรื่องนี้ เพราะไม่มีปัญญาจะแก้ไขอะไรได้

วิธีแก้ปัญหาของผมคือ เปลี่ยน OS ผมเริ่มด้วยการลง CentOS 5.2 ไว้ที่ server เครื่องหนึ่ง และตามด้วย Open Solaris ไว้ที่ server อีกเครื่องโดยที่ยังไม่ได้ทำ benchmark ใน CentOS เพราะคิดว่า Linux เหมือนกันคงเจอปัญหาเดียวกัน เลยมุ่งเป้าไปที่ Open Solaris มากกว่า พอลงเร็จพยายาม set network ให้ Open Solaris อยู่นานแต่ไม่สำเร็จ เริ่มเบื่อเลยกลับมาทำ benchmark ใน CentoOS ที่ลงไว้ก่อนหน้านี้ ผลออกมาอยากจะกรี๊ดดังๆ เพราะอดนอนมาสองคืน แต่แก้ได้ด้วย CentOS สาเหตุเกิดจากอะไรไว้จะกลับมาหาคำตอบ

sysbench-2