สิ่งที่ต้องตั้ง innodb_buffer_pool และทำไม ..


20

ฉันมีInnoDBดัชนีและข้อมูล170GB

ฉันต้องปรับขนาด innodb_buffer_pool เพื่อประสิทธิภาพที่ดีขึ้นขนาดตารางสูงสุดของตาราง InnoDB (ดัชนี + ข้อมูล) คือ 28GB

ดังนั้นสิ่งที่ควรมีขนาดที่เหมาะสมของ innodb_buffer_pool

UPDATE

เรากำลังจะย้ายฐานข้อมูลท้องถิ่นของเราไปยัง ec2 ดังนั้นจะตั้งค่า RAM ตามสถิติปัจจุบันของ innodb นั่นคือเหตุผลที่ฉันต้องการขนาดของบัฟเฟอร์พูลเพื่อให้เรามี RAM ที่มีอยู่

เปิดใช้งานไฟล์ต่อตารางแล้ว

ฉันใช้เครื่องลีนุกซ์


RAM ที่มีอยู่บนเครื่องที่ไม่ได้ใช้โดยกระบวนการอื่นคืออะไร? คุณใช้ Windows, Linux หรืออะไรอย่างอื่นอยู่ใช่ไหม คุณใช้ MySQL รุ่นใด ทำไมขนาดของตารางถึง จำกัด ที่ 28GB
Craig Efrein

ขนาดของตารางไม่ จำกัด .. ฉันได้กำหนดขนาดของตารางจนถึงจุดหนึ่งมันจะเพิ่มขึ้นตามที่จะมีการแทรกในอนาคต ..
Abdul Manaf

คำตอบ:


25

ตารางที่ใหญ่ที่สุดที่คุณทำขึ้น 16.47% (28/170) จากข้อมูลทั้งหมด แม้ว่าตารางจะถูกเขียนอย่างมากและถูกอ่านอย่างมากจะไม่มีโหลด 28G ทั้งหมดของตารางในพูลบัฟเฟอร์ในช่วงเวลาหนึ่ง สิ่งที่คุณต้องคำนวณเป็นเท่าใดของ InnoDB บัฟเฟอร์สระว่ายน้ำมีการโหลดในขณะใดก็ตามในปัจจุบัน DB เซิร์ฟเวอร์

นี่เป็นวิธีที่ละเอียดยิ่งขึ้นในการพิจารณา innodb_buffer_pool_size สำหรับ DB Server ใหม่เนื่องจากชุดข้อมูลที่โหลดในปัจจุบันใน InnoDB Buffer Pool ของ DB Server ปัจจุบัน

รันสิ่งต่อไปนี้บนอินสแตนซ์ MySQL ปัจจุบันของคุณ (เซิร์ฟเวอร์ที่คุณกำลังย้ายจาก)

SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages_data';  -- IBPDataPages 
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages_total'; -- IBPTotalPages
SHOW GLOBAL STATUS LIKE 'Innodb_page_size'; -- IPS

IBPPctFull = IBPDataPages * 100.0 / IBPTotalPagesเรียกใช้สูตร

SET @IBPDataPages = (SELECT VARIABLE_VALUE FROM information_schema.global_status WHERE VARIABLE_NAME = 'Innodb_buffer_pool_pages_data'); -- SELECT @IBPDataPages;
SET @IBPTotalPages = (SELECT VARIABLE_VALUE FROM information_schema.global_status WHERE VARIABLE_NAME = 'Innodb_buffer_pool_pages_total'); -- SELECT @IBPTotalPages;
SET @IBPPctFull = CAST(@IBPDataPages * 100.0 / @IBPTotalPages AS DECIMAL(5,2));
SELECT @IBPPctFull;

หาก IBPPctFull เป็น 95% หรือมากกว่าคุณควรตั้ง innodb_buffer_pool_size เป็น 75% ของ RAM ของ DB Server

หาก IBPPctFull น้อยกว่า 95% IBPSize = IPS X IBPDataPages / (1024*1024*1024) X 1.05เรียกสูตรนี้

SET @IBPSize = (SELECT VARIABLE_VALUE FROM information_schema.global_status WHERE VARIABLE_NAME = 'Innodb_page_size'); -- SELECT @IBPSize;
SET @IBPDataPages = (SELECT VARIABLE_VALUE FROM information_schema.global_status WHERE VARIABLE_NAME = 'Innodb_buffer_pool_pages_data'); -- SELECT @IBPDataPages;
SET @IBPSize = concat(ROUND(@IBPSize * @IBPDataPages / (1024*1024*1024) * 1.05, 2), ' GB' );
SELECT @IBPSize;

หมายเลขสำหรับ IBPSize (เป็น GB) คือจำนวนที่เหมาะกับชุดข้อมูลการทำงานจริงของคุณมากขึ้น

ตอนนี้ถ้า IBPSize ยังใหญ่เกินไปสำหรับ Amazon EC2 RAM Config ที่ใหญ่ที่สุดให้ใช้ 75% ของ RAM สำหรับเซิร์ฟเวอร์ Amazon EC2 DB


นั่นเป็นข้อมูลที่ยอดเยี่ยมจริงๆ .. อีกสิ่งหนึ่งที่ฉันต้องรู้ว่า MySQL Server โหลดข้อมูลและดัชนีในบัฟเฟอร์พูลฉันได้อ่านเอกสารแล้วและได้ว่ามันใช้ LRU แต่มันโหลดในหน่วยความจำเช่นถ้าฉันมี 2GB สำหรับ บัฟเฟอร์พูล แต่ขนาดตารางที่ร้องขอในเคียวรีนั้นมากกว่านั้น .. ??
อับดุลมานาฟ

เฉพาะเพจข้อมูลและดัชนีที่จำเป็นเพื่อตอบสนองการสืบค้นเท่านั้นที่จะถูกโหลดลงในบัฟเฟอร์พูลไม่ใช่ทั้งตาราง ข้อมูลเก่าและหน้าดัชนีจะหมุนตามอัลกอริทึม LRU ที่ระบุไว้ในdev.mysql.com/doc/refman/5.5/en/innodb-buffer-pool.html
RolandoMySQLDBA

อับดุลคุณควรไปกับคำตอบของ Rolando ซึ่งตอบคำถามของคุณดีกว่าของฉัน ฉันจะเขียนคำตอบของตัวเองใหม่อีกครั้งเพราะฉันต้องชัดเจนกว่า
Craig Efrein

13

ฉันกำลังให้คำตอบนี้เป็นข้อมูลเสริมให้กับคำตอบของ Rolando ด้านล่าง

ก่อนที่เซิร์ฟเวอร์จะอยู่ในการผลิต

คำนวณ innodb_buffer_pool_size ตามตารางที่ใหญ่ที่สุดที่ MySQL ใช้บ่อยที่สุด ในการระบุตารางที่ใหญ่ที่สุดตามขนาดในฐานข้อมูลคุณสามารถใช้สคริปต์นี้:

select table_schema, table_name, round(data_length/1024/1024,2) as size_mb 
from information_schema.tables where table_schema like 'my_database' 
order by size_mb desc;


+--------------+-------------------------+---------+
| table_schema | table_name              | size_mb |
+--------------+-------------------------+---------+
| heavybidder     | user                 |   522.55|
| heavybidder     | bid                  |   121.52|
| heavybidder     | item_for_sale        |    10.52|
| heavybidder     | account_user         |    5.02 |
| heavybidder     | txn_log              |    4.02 |
| heavybidder     | category             |    0.02 |
+--------------+-------------------------+---------+

ตอนนี้เรารู้แล้วว่าตารางใดมีขนาดใหญ่ที่สุดในฐานข้อมูลของเราเราต้องพิจารณาว่าตารางใดมีการใช้งานบ่อยที่สุด ในการทำเช่นนั้นฉันจะใช้โปรแกรมทำโปรไฟล์เช่น Jet Profiler (JP) เพื่อดูว่าตารางใดที่เข้าถึงได้มากที่สุด JP จะแสดงให้คุณเห็นว่ามีการเข้าถึงตารางใดบ่อยที่สุด นี่คือภาพหน้าจอจากส่วนนั้นใน JP

ป้อนคำอธิบายรูปภาพที่นี่

ด้วยเหตุนี้ในใจตอนนี้ฉันรู้แล้วว่าผู้ใช้และโต๊ะประมูลใช้พื้นที่ดิสก์ประมาณ 640MB พวกเขาใช้งานบ่อยมากตาม JP และนั่นหมายความว่า MySQL จะเก็บดัชนีและข้อมูลของพวกเขาในบัฟเฟอร์พูลเป็น Rolando กล่าวถึงด้านล่างในความคิดเห็นของเขา

เพื่อให้แน่ใจว่า MySQL มีหน่วยความจำเพียงพอที่จะจัดเก็บข้อมูลสำหรับตารางที่ใหญ่ที่สุดและใช้บ่อยที่สุดของฉันฉันจะกำหนด innodb_buffer_pool_size ที่ 640MB

มีข้อควรพิจารณาเพิ่มเติมบางประการ แต่ไม่มีผลกับ innodb_buffer_pool_size

นี่เป็นระบบ 32 บิตหรือ 64 บิตใช่ไหม ในระบบ 32Bit คุณถูก จำกัด ไว้ที่ 4GB ยกเว้นว่าคุณเปิดใช้งาน PAE ใน Windows หมายถึงการเรียกใช้ Windows Enterprise หรือรุ่น Datacenter

กระบวนการอื่นที่ใช้หน่วยความจำของคุณต้องใช้หน่วยความจำเท่าใด บนเซิร์ฟเวอร์ MySQL โดยเฉพาะฉันจะเหลืออยู่ระหว่าง 5% และ 10% สำหรับระบบปฏิบัติการ ใน Windows คุณสามารถใช้ Process Explorer เพื่อวิเคราะห์การใช้หน่วยความจำ ใน Linux คุณมี sysstat, ฟรี, htop, top และ vmstat

ฐานข้อมูลประกอบด้วยตาราง Innodb หรือส่วนผสมของ Innodb และ MyISAM เท่านั้นหรือไม่ ถ้าเป็นส่วนผสมของทั้งสองฉันจะตั้งค่าหน่วยความจำสำหรับ key_cache, เข้าร่วมตัวแปร, แคชแบบสอบถาม ฯลฯ คุณสามารถคำนวณอัตราส่วนการเข้าชม MyISAM ของคุณได้ในภายหลังเมื่อเซิร์ฟเวอร์ทำงาน

หลังจากเซิร์ฟเวอร์อยู่ระหว่างการผลิต

อัตราส่วนการเข้าชมปัจจุบันของ Innodb คือเท่าใด

1 - (innodb_buffer_pool_reads / innodb_buffer_pool_read_requests)

อัตราการแคชของคีย์แคชคืออะไร

1 - (Key_reads / Key_read_requests)

ฉันมักจะพยายามที่จะได้รับอัตราส่วนใกล้เคียงกับ 100% ที่เป็นไปได้

ตารางของคุณเหมาะสมในบัฟเฟอร์พูลอย่างไร

คุณสามารถดูได้ว่าข้อมูลตารางของคุณเหมาะสมใน buffer_pool ของคุณมากเพียงใดโดยอ้างอิงไปยังลิงก์นี้ซึ่งให้วิธีการแสดง "จำนวนหน้าอยู่ในบัฟเฟอร์พูลสำหรับตารางที่กำหนด (cnt) จำนวนสกปรก (สกปรก) และเปอร์เซ็นต์ของดัชนีที่พอดีในหน่วยความจำ (fit_pct) คืออะไร " ใช้กับเซิร์ฟเวอร์ Percona เท่านั้น

http://www.mysqlperformanceblog.com/2010/12/09/how-well-does-your-table-fits-in-innodb-buffer-pool/

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