MySQL: ฉันจะทำให้“ การใช้หน่วยความจำสูงสุดของฉันเป็นไปได้” ได้อย่างไร?


16

ฉันเพิ่งมีปัญหากับ thrashing เนื่องจากหน่วยความจำไม่เพียงพอ (VPS ของฉันมีทั้งหมด 256M)

ฉันพยายามปรับแต่ง MySQL โดยใช้ mysqltuner.pl และรับผลลัพธ์ต่อไปนี้:

-------- สถิติทั่วไป ---------------------------------------- ----------
[-] ข้ามการตรวจสอบเวอร์ชั่นสำหรับสคริปต์ MySQLTuner
[ตกลง] ปัจจุบันรองรับ MySQL เวอร์ชั่น 5.0.51a-3ubuntu5.4-log
[ตกลง] ปฏิบัติการบนสถาปัตยกรรม 64 บิต

-------- สถิติของเครื่องมือการจัดเก็บ --------------------------------------- ----
[-] สถานะ: + เก็บถาวร -BDB -Federated -InnoDB -ISAM -NDBCluster 
[-] ข้อมูลในตาราง MyISAM: 114M (ตาราง: 454)
[!!] ตารางแยกส่วนทั้งหมด: 34

-------- การวัดประสิทธิภาพ ---------------------------------------- ---------
[-] สูงสุดสำหรับ: 40 วินาที (570 q [14.250 qps], 23 conn, TX: 154K, RX: 23K)
[-] อ่าน / เขียน: 100% / 0%
[-] บัฟเฟอร์ทั้งหมด: 338.0M ทั่วโลก + 2.7M ต่อเธรด (20 เธรดสูงสุด)
[!!] การใช้หน่วยความจำที่เป็นไปได้สูงสุด: 392.9M (153% ของ RAM ที่ติดตั้ง)
[ตกลง] ข้อความค้นหาช้า: 0% (5/570)
[ตกลง] การใช้งานการเชื่อมต่อที่ใช้ได้สูงสุด: 15% (3/20)
[!!] ขนาดบัฟเฟอร์หลัก / ดัชนี MyISAM ทั้งหมด: 8.0M / 9.4M
[!!] อัตราการโจมตีของบัฟเฟอร์คีย์: 57.1% (7 แคช / 3 ครั้งอ่าน)
[ตกลง] ประสิทธิภาพการค้นหาแคช: 21.9% (เลือก 7 แคช / 32 ตัว)
[OK] Query cache Query ต่อวัน: 0
[ตกลง] การเรียงลำดับที่ต้องการตารางชั่วคราว: 0% (0 การเรียงลำดับชั่วคราว / 1 การเรียงลำดับ)
[ตกลง] ตารางชั่วคราวที่สร้างบนดิสก์: 0% (0 บนดิสก์ / 32 ทั้งหมด)
[ตกลง] อัตราการเข้าถึงแคชของเธรด: 86% (สร้าง 3 ครั้ง / 23 ครั้ง)
[ตกลง] อัตราการเข้าชมแคชตาราง: 26% (เปิด 128 ครั้ง / เปิด 484)
[ตกลง] เปิดขีด ​​จำกัด ไฟล์ที่ใช้: 25% (259 / 1K)
[ตกลง] ล็อคตารางที่ได้รับทันที: 100% (492 ทันที / 492 ล็อค)

-------- ข้อเสนอแนะ ----------------------------------------- ------------
คำแนะนำทั่วไป:
    เรียกใช้ OPTIMIZE TABLE เพื่อจัดเรียงตารางเพื่อประสิทธิภาพที่ดีขึ้น
    MySQL เริ่มต้นภายใน 24 ชั่วโมงที่ผ่านมา - คำแนะนำอาจไม่ถูกต้อง
    ลดขนาดหน่วยความจำ MySQL โดยรวมของคุณเพื่อความเสถียรของระบบ
ตัวแปรที่จะปรับ:
  *** การใช้งานหน่วยความจำสูงสุดของ MySQL สูงอย่างเป็นอันตราย ***
  *** เพิ่ม RAM ก่อนเพิ่มตัวแปรบัฟเฟอร์ MySQL
    key_buffer_size (> 9.4M)

แต่ฉันสับสนเล็กน้อยเกี่ยวกับวิธีลดการใช้หน่วยความจำสูงสุด ดูเหมือนว่าจะขึ้นอยู่กับ key_buffer และ max_connections แต่ต้องมีสิ่งอื่นที่เกี่ยวข้องด้วยหรือไม่

my.cnf:

key_buffer = 8M
max_allowed_packet = 12M
thread_stack = 128K
thread_cache_size = 8
max_connections = 20
table_cache = 128
tmp_table_size = 256M
max_heap_table_size = 256M
join_buffer_size = 256K
query_cache_limit = 8M
query_cache_size = 64M

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


1
ฉันทำตามผู้ให้ความเห็นแนะนำและนำมันลงไปในระดับที่เหมาะสม - แต่ฉันยังคงอยากรู้อยากเห็นเกี่ยวกับ ballparks สติอะไรที่อาจเป็นค่าเหล่านั้น? บางบทความใช้ออนไลน์ 64K และอื่น ๆ แนะนำ 512M สำหรับค่าเดียวกัน!
Nick

คำตอบ:


10

คุณมีเซิร์ฟเวอร์ที่มี 256M แต่คุณไม่สามารถใช้ทั้งหมดได้โปรดจำไว้ว่ามีค่าใช้จ่ายระบบปฏิบัติการบางส่วน เพิ่มไปที่ข้อเท็จจริงที่ว่าคุณยอมรับมากกว่าที่คนอื่น ๆ พูดถึงและคุณจะต้องมาที่นี่อย่างแน่นอน 256M เพียงพอสำหรับ DB ขนาดเล็กเท่านั้นการเชื่อมต่อ 20 ครั้งมีสิ่งที่คุณได้กำหนดค่าไว้มากมาย

1) ลดการเชื่อมต่อสูงสุดถึง 4 (คุณใช้ 3 จาก 20)

2) เพิ่มประสิทธิภาพแคชแบบสอบถามของคุณให้ดีขึ้น 8M มีขนาดใหญ่มากและ 64M รวมนั้นขึ้นอยู่กับเพลงฮิต / ลูกพรุนของคุณ ลองคำสั่งผสม 4/32 และดูว่ามันจะเป็นอย่างไร ฉันคิดว่าคำสั่งผสม 2/24 จะเหมาะกับคุณ

3) คุณไม่มีคำสั่งใด ๆ ที่ต้องใช้ตาราง temp ทำไม max_heap_table_size verb จึงอยู่ในนั้น? แสดงความคิดเห็นว่าให้ใช้ค่าเริ่มต้น

4) คุณมี 128 โต๊ะจริงหรือ ลองตัด table_cache นั้นครึ่งหนึ่งเป็น 64 หรือ 48

5) ลด thread_cache_size เป็น 4

6) ปรับตารางเหล่านั้นเพื่อลดการแตกแฟรกเมนต์

นี่คือบางสิ่งที่จะเริ่มต้นด้วย ดูเหมือนว่าคุณจะโยนตัวเลขจำนวนหนึ่งในการกำหนดค่าโดยไม่มีการทำโปรไฟล์จริง ๆ เพื่อรู้ว่าคุณต้องการอะไรและได้สร้างความยุ่งเหยิง หากทุกอย่างล้มเหลวกลับไปที่ค่าเริ่มต้นและกำจัดการตั้งค่าที่กำหนดเองของคุณและเริ่มต้นใหม่โดยใช้คำแนะนำการปรับแต่งประสิทธิภาพที่คุณสามารถหาได้บน Google รับเอาท์พุทของ SHOW VARIABLES และ SHOW STATUS ค้นหาคำแนะนำในการปรับจูนและเสียบตัวเลขจริงจำนวนจริงของคุณลงในสมการของพวกเขาแล้วบอกตัวเลขที่แน่นอนที่คุณต้องใส่ในไฟล์ปรับแต่งของคุณ


3
นี่เป็นคำตอบเก่าสำหรับคำถามเก่า แต่ฉันอยากจะชี้ให้เห็นว่าในผลลัพธ์ mysqltuner ที่โพสต์โดยผู้ถามเซิร์ฟเวอร์นั้นใช้เวลา 40 วินาทีเท่านั้นซึ่งไม่ได้มีเวลาเพียงพอในการตัดสินภาระที่เซิร์ฟเวอร์จะเห็นได้อย่างแม่นยำ . เป็นการดีที่คุณจะเรียกใช้ mysqltuner สองสามครั้งในช่วงวันหรือมากกว่านั้นและวิเคราะห์ผลลัพธ์ นอกเหนือจากคำแนะนำของคุณเป็นเสียง
instanceofTom

8

ฉันไม่ใช่กูรู MySQL และฉันไม่สามารถวิเคราะห์ปัญหากับข้อมูลนี้ได้ แต่ฉันพยายามค้นหาสูตรในซอร์สโค้ด นี่มันคือ:

server_buffers + total_per_thread_buffers * max_connections

ที่ไหน:

server_buffers = key_buffer_size + innodb_buffer_pool_size + innodb_additional_mem_pool_size + innodb_log_buffer_size + query_cache_size

และ:

total_per_thread_buffers = read_buffer_size + read_rnd_buffer_size + sort_buffer_size + thread_stack + max_allowed_packet + join_buffer_size

ตอนนี้คุณต้องตรวจสอบแต่ละค่าเหล่านี้และหาว่าอันไหนที่รับผิดชอบในจำนวนมหาศาลนี้ และไม่ไว้วางใจสคริปต์นี้อย่างไม่ได้ตั้งใจ - ฉันลองใช้มันบนเซิร์ฟเวอร์ฐานข้อมูลตัวใดตัวหนึ่งของฉันและคำนวณว่าหน่วยความจำสูงสุดคือ 140% ของจำนวนหน่วยความจำกายภาพทั้งหมด แต่ระบบใช้งานมานานหลายปีโดยไม่มีปัญหาด้านความมั่นคง

โชคดี!


0

ถ้าฉันจำได้ถูกต้อง MySQL Tuner จะใช้สูตรต่อไปนี้เพื่อประเมินการใช้งานสูงสุด:

read_buffer_size + read_rnd_buffer_size + sort_buffer_size + thread_stack + join_buffer_size

โปรดทราบว่านี่ไม่ถูกต้อง 100% และในความเป็นจริงเป็นเพียงการประมาณการเนื่องจากการตั้งค่าบางอย่างใน MySQL ไม่มีข้อ จำกัด ที่กำหนดไว้

คุณสามารถเริ่มต้นการตั้งค่าบางอย่างในไฟล์ปรับแต่งของคุณและเรียกใช้เครื่องรับสัญญาณอีกครั้ง แต่ฉันขอแนะนำให้ขอความช่วยเหลือจากผู้เชี่ยวชาญหากคุณไม่มีเวลาเสียการเปลี่ยน my.cnf รีสตาร์ทและเรียกใช้เครื่องรับ


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