สุดยอดการตั้งค่าแคชของ MySQL สำหรับเซิร์ฟเวอร์ MySQL เฉพาะ 8gb RAM โดยใช้เพียง InnoDB (ฐานข้อมูล 5gb)


20

ฉันเป็น noob ที่ค่อนข้างใหญ่เมื่อพูดถึงการตั้งค่า MySQL เพื่อประสิทธิภาพ และจริงๆแล้วฉันไม่ได้กังวลเกี่ยวกับการปรับจูนเพื่อบีบประสิทธิภาพออกมาเล็กน้อยจาก MySQL แต่ฉันรู้ว่าสิ่งที่สำคัญที่สุดที่ต้องทำคือให้ผลลัพธ์ที่ดีที่สุดคือการตั้งค่าแคช / บัฟเฟอร์อย่างถูกต้อง

ฉันพยายามทำให้สิ่งต่าง ๆ เรียบง่ายโดยใช้เพียง InnoDB เป็นเครื่องมือเก็บข้อมูล และฉันมีเซิร์ฟเวอร์เฉพาะสำหรับ MySQL มันมีแรม 8gb ฉันจะจัดสรรมันให้มีประสิทธิภาพได้อย่างไร ฉันต้องการให้พอดีกับฐานข้อมูลทั้งหมดของฉันลงในหน่วยความจำเพื่อประสิทธิภาพที่ดีที่สุด ฐานข้อมูลประมาณ 5gb เป็นไปได้ไหม

ฉันควรจัดสรรหน่วยความจำให้กับคิวรีแคชเท่าใด พูลบัฟเฟอร์ InnoDB มีราคาเท่าใด ส่วนที่เหลือของคอมพิวเตอร์ (เช่นกระบวนการที่ไม่เกี่ยวข้องกับ MySQL) มีมากแค่ไหน? เป็นต้น

เนื่องจากฉันไม่ได้ใช้ MyISAM ฉันไม่จำเป็นต้องใส่หน่วยความจำจำนวนมากในคีย์แคชให้ถูกต้องหรือไม่

คำตอบ:


25

นี่เป็นเรื่องยากโดยไม่ทราบเกี่ยวกับฐานข้อมูลมากนัก มีเครื่องมือสองสามอย่างที่คุณควรระวัง

เกี่ยวกับการจัดเก็บฐานข้อมูลทั้งหมดในหน่วยความจำ แบบสอบถามใด ๆ ที่กำลังทำการเปลี่ยนแปลงในฐานข้อมูลจะยังคงเปิดอยู่จนกว่าการเขียนจะดำเนินการบนดิสก์ สิ่งเดียวที่สามารถหลีกเลี่ยงดิสก์ให้เป็นคอขวดคือดิสก์คอนโทรลเลอร์ที่มีแคชการเขียน

ฉันจะเริ่มต้นด้วยการเปลี่ยนแปลงต่อไปนี้จากค่าเริ่มต้น:

key_buffer_size = 128M
thread_stack = 128K
thread_cache_size = 8
table_cache = 8192
max_heap_table_size = 256M
query_cache_limit = 4M
query_cache_size = 512M

innodb_buffer_pool_size = 4G 

# This is crucial to avoid checkpointing all the time:
innodb_log_file_size = 512M

# If you have control on who consumes the DB, and you don't use hostnames when you've set up permissions - this can help as well.
skip_name_resolve

จากนั้นฉันจะเห็นว่ามันเป็นยังไงและลองทำสิ่งต่าง ๆ ตามผลลัพธ์ที่ได้จากเครื่องมือที่กล่าวมาข้างต้น ฉันจะตรวจสอบกราฟแนวโน้มด้วยเครื่องมือตรวจสอบเช่นMuninหรือCactiเพื่อดูปริมาณงานที่ฉันต้องรับมือด้วย ส่วนตัวแล้วฉันมีประสบการณ์ที่ยอดเยี่ยมกับปลั๊กอิน MySQL ที่มาพร้อมกับ Munin


ขอบคุณฉันจะให้ shot นี้และดูว่าฉันสามารถเรียนรู้สิ่งใหม่
billmalarky

@billmalarky ยินดีต้อนรับสู่ serverfault! :) อย่าลืมโหวตหรือทำเครื่องหมายคำถามว่าถูกต้องหากคุณพอใจกับคำตอบที่คุณได้รับ
Kvisle

+1 สำหรับการแนะนำ mysqltuner.pl !!!
RolandoMySQLDBA

@ Kvisle ขอบคุณสำหรับการต้อนรับ! ฉันอยู่ที่ stackoverflow มาพักหนึ่ง (ดี ... สองสามเดือนนั่นคือ ... ) แต่ฉันยังใหม่กับ serverfault จริง ๆ แล้วฉันโฮสต์กับ voxel.net และโฮสติ้ง promanaged ของพวกเขา (การสนับสนุนระบบ IE) เป็นสิ่งที่ดีมาก แต่ฉันคิดว่ามันจะเหมาะสมที่จะแสวงหามุมมองจากภายนอกเช่นกันดังนั้นฉันไม่ได้เสียงเหมือนเครื่องมือที่สมบูรณ์เมื่อพูดคุยกับพวกเขา
billmalarky

1
@ Kvisle นอกจากนี้ฉันจะทำเครื่องหมายคำตอบที่ถูกต้อง แต่ฉันต้องการให้สตูว์นี้ซักนิดเพื่อระดมสมองที่ดี
billmalarky

9

IMHO คุณควรจะไปด้วย

innodb_buffer_pool_size=5G

นั่นจะเป็น 62.5% ของ RAM ที่มี RAM เพียงพอสำหรับเซิร์ฟเวอร์ OS และหน่วยความจำสำหรับการเชื่อมต่อฐานข้อมูล

@kvisleแนะนำให้ใช้ mysqltuner.pl สคริปต์นั้นยอดเยี่ยมสำหรับการตัดสินจำนวน RAM ที่จะอุทิศเพื่อเข้าร่วม _buffer_size, sort_buffer_size, read_buffer_size และ read_rnd_buffer_size บัฟเฟอร์ 4 ตัวที่รวมเข้าด้วยกันจะถูกคูณด้วย max_connections คำตอบนั้นถูกเพิ่มลงในบัฟเฟอร์คงที่ (innodb_buffer_pool_size + key_buffer_size) มีการรายงานจำนวนเงินรวม หากผลรวมรวมนั้นเกิน 80% ของ RAM นั่นคือเมื่อคุณต้องลดขนาดบัฟเฟอร์เหล่านั้นลง mysqltuner.pl จะมีประโยชน์มากในเรื่องนี้

เนื่องจากข้อมูลทั้งหมดของคุณคือ InnoDB คุณสามารถสร้าง key_buffer_size (บัฟเฟอร์แคชคีย์สำหรับดัชนี MyISAM) ต่ำมาก (ฉันแนะนำ 64M)

นี่คือการโพสต์ที่ฉันทำใน DBA StackExchange การคำนวณขนาดที่แนะนำของ innodb_buffer_pool_size

อัพเดท 2011-10-15 19:55 EDT

หากคุณรู้ว่าคุณจะมีข้อมูล 5GB คำแนะนำแรกของฉันก็คือตกลง อย่างไรก็ตามฉันลืมที่จะเพิ่มสิ่งหนึ่ง:

[mysqld]
innodb_buffer_pool_size=5G
innodb_log_file_size=1280M

ขนาดไฟล์บันทึกต้องเป็น 25% ของ InnoDB Buffer Pool

อัพเดท 2011-10-16 13:36 EDT

กฎ 25% ยึดตามการใช้ไฟล์บันทึกสองไฟล์อย่างเคร่งครัด แม้ว่าจะเป็นไปได้ที่จะใช้ไฟล์บันทึก Innodb หลายไฟล์ แต่โดยปกติแล้วสองไฟล์จะทำงานได้ดีที่สุด

คนอื่น ๆ ได้แสดงการใช้ 25%

อย่างไรก็ตามในความเป็นธรรมทุกคนบางคนจาก บริษัท InnoBase Oy เดิมแสดงว่าไม่ได้ใช้กฎ 25% เนื่องจากมี InnoDB Buffers Poolมากกว่า

โดยปกติแล้วกฎ 25% ไม่สามารถทำงานได้เมื่อมี RAM จำนวนมาก ในความเป็นจริง innodb_log_file_size ที่ใหญ่ที่สุดที่อนุญาตให้ใช้ไฟล์บันทึกได้เพียง 2 ไฟล์คือ 2047M เนื่องจากขนาดรวมของไฟล์บันทึกจะต้องน้อยกว่า 4G (4096M)

กรณีในจุด: หนึ่งในลูกค้าของนายจ้างของฉันมีเซิร์ฟเวอร์ฐานข้อมูลที่มี 192GB RAM ไม่มีทางที่จะมีไฟล์บันทึก 48G ฉัน simlpy ใช้ขนาดไฟล์สูงสุดสำหรับไฟล์บันทึก innodb, 2047M @ Kvisle แสดงความคิดเห็นในคำตอบของฉันเพียงแค่ให้ลิงค์ระบุว่าคุณไม่จำเป็นต้อง จำกัด ตัวเองเป็นสองไฟล์บันทึก หากคุณมีไฟล์บันทึก N ไฟล์จะไม่สามารถรวม 4G ได้ กฎ 25% ของฉันอยู่ในโลกที่สมบูรณ์แบบ (DB Server ที่มี 8GB หรือน้อยกว่า)


ขอบคุณฉันจะใช้ mysqltuner.pl แน่นอน อย่างไรก็ตามฉันต้องถามสคริปต์นั้นจะยังคงถูกต้องหรือไม่หากฐานข้อมูลของฉันว่างเปล่าตอนนี้ ฉันมีตารางและสคีมาทั้งหมดตั้งอย่างถูกต้อง แต่ไม่มีข้อมูลจริง ฉันใช้ขนาด 5gb เป็นขนาดตัวอย่างที่ฉันจะใช้กับเซิร์ฟเวอร์เฉพาะปัจจุบันของฉัน (นั่นคือเมื่อฐานข้อมูลมีขนาดใหญ่กว่านั้นฉันอาจเปลี่ยนไปใช้เซิร์ฟเวอร์เฉพาะที่ดีกว่า) ขณะนี้ฐานข้อมูลว่างเปล่า (เป็นเว็บไซต์ใหม่ที่ยังไม่เปิดตัว) แต่ฉันต้องการปรับแต่ง mysql เพื่อจัดการกับการปรับขนาดก่อนเปิดตัว
billmalarky

อัปเดตคำตอบของฉัน !!!
RolandoMySQLDBA

ฉันต้องการแสดงความคิดเห็นใน "ต้องเป็น 25% ของ InnoDB Buffer Pool" เพราะมันไม่จริง 100% อ่านdev.mysql.com/doc/refman/5.0/en/…เพื่อรับคำตอบที่ละเอียดยิ่งขึ้น ประสิทธิภาพการทำงานที่ชาญฉลาดช่วยได้มากในการเพิ่มขนาดเล็กน้อยจากค่าเริ่มต้น แต่คุณไม่จำเป็นต้องเพิ่มขนาดสูงสุด
Kvisle

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