จำนวนที่เหมาะสมที่สุดของอินสแตนซ์ MySQL InnoDB Buffer Pool


13

ลักษณะเซิร์ฟเวอร์

  • ระบบ RAM ทั้งหมด: 8GB (ใช้งาน MySQL + สิ่งอื่นนอกเหนือจาก MySQL ในนั้นคือไม่ได้ทุ่มเทให้กับ MySQL)
  • จำนวนคอร์ CPU: 6
  • ฉันมีข้อมูลในฐานข้อมูลประมาณ 2GB
  • ฉันมี InnoDB Buffer Pool Size ตั้งไว้ที่ 4GB

ไหนดีกว่า:

  • Innodb Buffer Pool Instances ตั้งค่าเป็น 1
  • Innodb Buffer Pool Instances ตั้งค่าเป็น 2 (2GB ในแต่ละ)?
  • Innodb Buffer Pool Instances ตั้งค่าเป็น 4 (แต่ละ 1GB ในแต่ละ)?
  • Innodb Buffer Pool Instances ตั้งค่าเป็น 8 (การตั้งค่าเริ่มต้น)

ฉันไม่แน่ใจว่าจะให้เหตุผลอย่างไรเมื่อพูดถึง Buffer Pool Instances และ "ใช้อินสแตนซ์หรือประสบปัญหา Swap OS เมื่อมีขนาดใหญ่เช่น InnoDB Buffer Pool Size"


คุณได้รับ "ใช้อินสแตนซ์หรือได้รับ OS Swap เมื่อใดที่มีขนาดใหญ่เช่น InnoDB Buffer Pool Size"
Rick James

70% ของ RAM สำหรับ buffer_pool ทั้งหมดหลังจากลบพื้นที่สำหรับ "สิ่งอื่นนอกเหนือจาก MySQL" น่าจะใช้ได้โดยไม่คำนึงถึงจำนวนอินสแตนซ์
Rick James

ฉันไม่สามารถตั้งคำตอบให้เป็นที่ยอมรับได้ตราบใดที่ฉันคิดว่าพวกเขาทั้งหมดเป็น "ยิงจากสะโพก" ถ้าใครสงสัยฉันไปด้วยขนาดบัฟเฟอร์บัฟเฟอร์ 4G และ 2 อินสแตนซ์และมันทำงานได้ดีมากกับ Debian 8.1 ที่มีหน่วยความจำทั้งหมด 8G ที่ใช้ php-fpm + nginx ในเครื่องเดียวกันโดยมี mysql ประมาณ 60 ครั้งต่อวินาที
Adergaard

คำตอบ:


7

เมื่อฉันกลับไปที่ MySQL 5.5 ฉันจะคิดถึงสิ่งเดียวกันนี้

สิ่งที่ฉันเรียนรู้ในช่วงหลายปีที่ผ่านมาคือ: ถ้าบัฟเฟอร์พูลใหญ่กว่าครึ่ง RAM ที่ติดตั้งและinnodb_buffer_pool_instancesเป็น 1 (ค่าเริ่มต้นสำหรับ 5.5) ภัยคุกคามจากการแลกเปลี่ยนนั้นใกล้เข้ามาเสมอ

ฉันพูดถึงเรื่องนี้มาก่อน: มีกฎง่ายๆเกี่ยวกับขนาดและจำนวนของอินสแตนซ์บัฟเฟอร์พูลหรือไม่? . ในโพสต์นั้นฉันพูดถึงตัวอย่างของลูกค้าที่มี RAM 192GB บนเซิร์ฟเวอร์ที่มีบัฟเฟอร์บัฟเฟอร์ 162GB เมื่อinnodb_buffer_pool_instancesเป็น 1 การแลกเปลี่ยนเกิดขึ้น เมื่อฉันตั้งinnodb_buffer_pool_instanceเป็น 2 สิ่งต่าง ๆ ก็ดีขึ้น

ในกรณีของคุณเนื่องจาก Buffer Pool มีค่าครึ่งหนึ่งค่า 1 จึงอาจใช้ได้ ฉันจะไม่เสี่ยงมัน ฉันจะตั้งเป็น 2

เนื่องจาก MySQL 5.6 มีค่าเริ่มต้นที่ 8 คุณไม่ควรคิดอีกต่อไป

ผมจะพูดแบบนี้: คำตอบ akuzminsky มีหลักการสูงสุด คำตอบของฉันคือถ่ายจากสะโพกโดยอิงจากประสบการณ์ในอดีต (ดีและไม่ดี)


ไม่มีทาง! การสลับขึ้นอยู่กับจำนวนหน่วยความจำที่จัดสรรไม่ใช่อินสแตนซ์พูล
Rick James

เป็นการดีที่จะทราบว่าค่าเริ่มต้นคือ 8 ... แต่สิ่งที่แตกต่างกันถ้ามันถูกตัดเป็น 4 หรือเพิ่มขึ้นเป็น 16? มีหน่วยความจำ / โทษเก็บหรือผลประโยชน์ใด ๆ ? เหตุผลเดียวที่ฉันมาที่นี่ mysqltuner แนะนำ innodb_buffer_pool_instances (= 1) แต่ฉันไม่ไว้วางใจคำแนะนำของมันเสมอ จริงอยู่ที่ฉันไม่มีปัญหาอยากรู้อยากเห็น
PJ Brunet

@PJBrunet ถ้าพูลบัฟเฟอร์ InnoDB น้อยกว่าครึ่งหนึ่งของ RAM ดังนั้นอินสแตนซ์พูลบัฟเฟอร์ InnoDB สามารถถูกปล่อยไว้ที่ 1 ได้
RolandoMySQLDBA

6

จำนวนของอินสแตนซ์บัฟเฟอร์พูลควรเพิ่มขึ้นเพื่อหลีกเลี่ยงการโต้แย้งของพูลพูล mutex

ด้วยขนาดบัฟเฟอร์พูล 8GB ฉันสงสัยว่าคุณจะเคยเห็นการโต้แย้งของพูลพูล mutex

อัพเดท 0 :

ฉันพูดถึงบัฟเฟอร์พูล 8Gb ในคำตอบในคำถามเดิมหน่วยความจำทั้งหมดคือ 8GB แน่นอนว่าบัฟเฟอร์พูลต้องน้อยกว่า 8GB เสียง 4GB เริ่มต้นที่ดี แต่ต้องแน่ใจว่าไม่มีการสลับสับเปลี่ยน

อัปเดต 1 :

// จากสไลด์ของ Yasufumi (ใน MySQL รุ่นล่าสุดผลลัพธ์อาจแตกต่างกันเล็กน้อย)

เพื่อตรวจสอบว่ามีการช่วงชิงบน mutex ของพูลบัฟเฟอร์รวบรวมโหลSHOW ENGINE INNODB STATUSตัวอย่างในช่วงเวลาสูงสุดหรือไม่

จากนั้นรวมเข้าด้วยกันโดยใช้ข้อมูลโค้ดของเชลล์:

#!/bin/sh
cat $1.innodb | grep "Mutex at " | cut -d"," -f1 | sort | uniq -c > /tmp/tmp1.txt 
cat $1.innodb | grep "lock on " | cut -d"-"
-f2- | sort | uniq -c > /tmp/tmp2.txt
cat /tmp/tmp1.txt /tmp/tmp2.txt | sort -n > $1.contention rm /tmp/tmp1.txt /tmp/tmp2.txt

ซึ่งให้ผลลัพธ์เช่นนี้

.....
4 lock on RW-latch at 0x7fb86b2c9138 created in file dict/dict0dict.c line 1356
6 lock on RW-latch at 0x7fb86b2c4138 created in file dict/dict0dict.c line 1356
12 lock on RW-latch at 0x7fb86b2d9538 created in file dict/dict0dict.c line 1356
20 lock on RW-latch at 0x7fb86b2db138 created in file dict/dict0dict.c line 1356
22 Mutex at 0x7fb86b28f0e0 created file btr/btr0sea.c line 139
30 lock on RW-latch at 0x7fb86b2ba938 created in file dict/dict0dict.c line 1356
36 lock on RW-latch at 0x7fb86b2bad38 created in file dict/dict0dict.c line 1356
71 Mutex at 0x7fb86b28ecb8 created file buf/buf0buf.c line 597
164 lock on RW-latch at 0x7fb86b28f0b8 created in file btr/btr0sea.c line 139

หากคุณเห็นจำนวน mutex ของบัฟเฟอร์พูลสูงรอถึงเวลาที่จะพิจารณาอินสแตนซ์พูลบัฟเฟอร์หลายอินสแตนซ์ การโต้แย้งไม่น่าจะเกิดขึ้นในบัฟเฟอร์พูลขนาดเล็กกว่า ~ 48G


1
แต่ไม่มี buffer_pool 8G ใน RAM 8GB เท่านั้น!
Rick James

คุณจะเริ่มคิดถึงอินสแตนซ์ขนาดของบัฟเฟอร์ dbsize เช่น innodb buffer อย่างไร ฉันตีความคำตอบของคุณว่าในระดับที่ค่อนข้างเล็กเหล่านี้ไม่มีเหตุผลที่จะมีมากกว่าหนึ่งข้อ แก้ไข? คุณมีแหล่งที่มาเกี่ยวกับสิ่งนี้ไหม เอกสาร MySQL บอกว่า "multi กิกะไบต์" ซึ่งสำหรับฉัน - เป็นวิธีที่คลุมเครือมากในการแสดงสิ่งต่าง ๆ ในความเป็นจริง 2 GB เป็น multi แต่ผมคิดว่าพวกเขาหมายถึงชุดข้อมูลที่มีขนาดใหญ่กว่าที่ ...
Adergaard

2

ตั้งค่า "swappiness" เป็น 1 หากระบบปฏิบัติการของคุณมีเช่น ปัญหาอาจเป็น OOM เชิงรุกมากเกินไป


0

ฉันขอแนะนำให้ตั้งค่านี้ให้ตรงกับจำนวน MySQL thread สูงสุดที่คุณต้องการเรียกใช้พร้อมกัน ฉันใช้จำนวนแกน

ฉันยังตั้งinnodb_read_io_threadsและinnodb_write_io_threadsให้ตรงกับหมายเลขนี้

หากinnodb_buffer_pool_instancesต่ำเกินไปเธรดของคุณอาจติดค้างในเซมาฟอร์รอ สิ่งนี้ทำให้ทั้ง CPU และ I / O ดูเหมือนจะไม่มีการใช้งานแม้ว่าระบบจะไม่ว่าง - และเวลาแฝงของแอปพลิเคชันของคุณจะผ่านหลังคา

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.