ฉันได้รับการนำเสนอด้วยเซิร์ฟเวอร์ MySQL เฉพาะที่ไม่เคยใช้มากกว่าหนึ่งคอร์ ฉันเป็นนักพัฒนามากกว่า DBA สำหรับ MySQL ดังนั้นต้องการความช่วยเหลือ
ติดตั้ง
เซิร์ฟเวอร์ค่อนข้างหนักด้วยการโหลดประเภท OLAP / DataWarehouse (DW):
- หลัก: 96GB RAM, 8 คอร์ + RAID 10 อาเรย์เดียว
- ทดสอบ: RAM 32GB พร้อม 4 คอร์
- ฐานข้อมูลที่ใหญ่ที่สุดคือ 540 GB, รวมอยู่ที่ประมาณ 1.1TB และส่วนใหญ่เป็นตาราง InnoDB
- Solaris 10 Intel-64
- MySQL 5.5.x
หมายเหตุ: ฐานข้อมูลที่ใหญ่ที่สุดคือหนึ่งที่จำลองแบบจากเซิร์ฟเวอร์ OLTP DR และ DW จะถูกโหลดจากสิ่งนี้ มันไม่ใช่ DW เต็มรูปแบบ: เมื่อ 6 เดือนถึง 6 สัปดาห์ดังนั้นมันจึงเล็กกว่า OLTP DB
การสังเกตบนเซิร์ฟเวอร์ทดสอบ
- 3 การเชื่อมต่อแยก
- แต่ละคนมีพร้อมกัน (และแตกต่างกัน)
ALTER TABLE...DROP KEY...ADD INDEX
- 3 ตารางมีแถว 2.5, 3.8 และ 4.5 ล้าน
- การใช้งาน CPU สูงถึง 25% (หนึ่งคอร์มีขนาดสูงสุด) และไม่สูงกว่า
- 3 ALTERs ใช้เวลา 12-25 นาที (Single ที่เล็กที่สุดใช้เวลา 4.5)
คำถาม
- จำเป็นต้องมีการตั้งค่าหรือแพทช์ใดเพื่ออนุญาตให้ใช้มากกว่าหนึ่งคอร์?
นั่นคือทำไม MySQL ไม่ใช้คอร์ทั้งหมดที่มีอยู่ (เช่น RDBMS อื่น ๆ ) - มันเป็นผลมาจากการจำลองแบบ?
บันทึกอื่น ๆ
- ฉันเข้าใจความแตกต่างระหว่าง RDBMS "thread" และ OS "thread"
- ฉันไม่ได้ถามเกี่ยวกับการขนานใด ๆ
- ตัวแปรระบบบางส่วนสำหรับ InnoDB และเธรดเป็นแบบย่อย
(มองหาการชนะอย่างรวดเร็ว) - ระยะสั้นฉันไม่สามารถเปลี่ยนเค้าโครงดิสก์
- ระบบปฏิบัติการสามารถปรับแต่งถ้าจำเป็น
- ALTER TABLE เดียวบนตารางที่เล็กที่สุดใช้เวลา 4.5 นาที (IMO ที่น่าตกใจ)
แก้ไข 1
- innodb_thread_concurrency ถูกตั้งค่าเป็น 8 บนทั้งคู่ ใช่มันผิด แต่จะไม่ทำให้ MySQL ใช้หลายคอร์
- innodb_buffer_pool_size คือ 80GB สำหรับไฟล์หลัก, 10GB สำหรับการทดสอบ (อินสแตนซ์อื่นปิดตัวลง) ไม่เป็นไรตอนนี้
- innodb_file_per_table = ON
แก้ไข 2
- innodb_flush_log_at_trx_commit = 2
- innodb_use_sys_malloc = ON
- innodb_flush_method ควรเป็น O_DIRECT (แต่ SHOW VARIABLES ไม่แสดงสิ่งนี้)
- innodb_doublewrite = OFF
- ระบบไฟล์ = ZFS (และระบบดูแลระบบของฉันพบสิ่งนี้: http://blogs.oracle.com/realneel/entry/mysql_innodb_zfs_best_practices )
ทดสอบ
- innodb_flush_method ไม่แสดงเป็น O_DIRECT เมื่อควรจะเป็น
- จะทำตามการตั้งค่าของ RolandoMySQLDBA
แจ้งให้เราทราบหากฉันพลาดอะไรสำคัญไป
ไชโย
ปรับปรุง
เปลี่ยน innodb_flush_method + 3 x การตั้งค่าเธรดในคำตอบของ RolandoMySQLDBA
ผล:> 1 แกนที่ใช้สำหรับการทดสอบ = ผลบวก
\G
ควรจะทำงานได้โดยไม่ต้อง นอกจากนี้ฉันคิดว่าSHOW INNODB STATUS
เลิกใช้ในSHOW ENGINE INNODB STATUS
5.5 (ฉันได้รับข้อผิดพลาดในการเรียกใช้อดีตในบรรทัดคำสั่ง