ฉันควรใช้ thread_cache_size มูลค่าเท่าใด


25

ฉันใช้ Asp.Net ร่วมกับ MySQL ในสตริงการเชื่อมต่อ. Net ฉันได้ตั้งค่า Max Pool Size เป็น 150

หากฉันเรียกใช้สิ่งต่อไปนี้ฉันจะได้รับค่าเหล่านี้:

SHOW GLOBAL STATUS LIKE 'max_used_connections'; gives 66
SHOW GLOBAL STATUS LIKE 'Threads_created'; gives 66
SHOW GLOBAL STATUS LIKE 'connections'; gives 474

ซึ่งให้ Threads_created / การเชื่อมต่อ = 0,1392

thread_cache_sizeดังนั้นจากที่ดูเหมือนว่าฉันจะต้องเพิ่มขึ้น

แต่ถ้าฉันวิ่งSHOW PROCESSLISTฉันมักจะเห็นว่าฉันมีการเชื่อมต่อเปิดมากมาย (ส่วนใหญ่นอนหลับ) เพราะสระที่สร้างโดย. Net ฉันยังต้องตั้งค่าthread_cache_sizeตามที่ฉันจะยังคงใช้การเชื่อมต่อจากกลุ่มการเชื่อมต่อหรือไม่ หากขนาดสระว่ายน้ำเท่ากับ 150 คุณคิดว่าคุ้มค่าหรือไม่ที่จะตั้งไว้thread_cache_sizeที่ 150+ สิ่งนี้จะมีผลกับ CPU และหน่วยความจำมากหรือไม่?

คำตอบ:


43

บนพื้นฐานของข้อมูลในเอกสาร MySQL ที่คุณควรจะทำอย่างไรต่อไปนี้: ค้นหาสิ่งที่จำนวนสูงสุดของการเชื่อมต่อพร้อมกัน mysqld มีการใช้การเชื่อมต่อ , Threads_createdและMax_used_connections ,

  • SHOW GLOBAL STATUS LIKE 'Connections';
  • SHOW GLOBAL STATUS LIKE 'Threads_created';
  • SHOW GLOBAL STATUS LIKE 'Max_used_connections';

ลองคำนวณสิ่งต่อไปนี้

Threads_created / Connections: ถ้าเป็นกว่า 0.01 thread_cache_sizeจากนั้นเพิ่มขึ้น ที่อย่างน้อยที่สุดควรมากกว่าthread_cache_sizeMax_used_connections


ขอบคุณสำหรับความคิดเห็นที่ดี! ฉันปรับปรุงคำถามของฉันเล็กน้อย
Martin

ฉันคิดว่าคุณตั้งใจที่จะ mysql> SHOW GLOBAL STATUS LIKE 'connections'; (คุณเขียน max_used_connections สองครั้ง)
Alekc

1
ฉันแค่ต้องการเพิ่มมันโดยอ้างถึงdev.mysql.com/doc/refman/5.7/en/นี้คุณควรเพิ่ม 8 to Max_used_connections สำหรับค่า thread_cache_size (ไม่เกิน 100)
CME64

1
จริงๆแล้วคู่มือแนะนำค่าเริ่มต้นของ (1% ของ mac_used_connections) + 8 .... หรือ 100 ... แล้วแต่จำนวนใดจะน้อยกว่า
Christopher McGowan

สำหรับฉัน # คือ 264/103134 ซึ่งทำงานได้ 0.0026 ซึ่งน้อยกว่า 0.01 แต่ MaxUsedConnections ของฉันคือ 72 ดังนั้นประโยคสุดท้ายจึงขัดแย้งกันอย่างมาก
boatcoder

11

ตามเอกสาร MySQL คุณควรตั้งค่าthread_cache_sizeเพื่อให้การเชื่อมต่อใหม่ส่วนใหญ่ใช้เธรดจากแคชแทนที่จะสร้างเธรดที่สร้างขึ้นใหม่ สิ่งนี้จะบันทึกโอเวอร์เฮดการสร้างเธรดบางอย่าง แต่โดยปกติจะไม่สร้างการปรับปรุงประสิทธิภาพที่สำคัญ:

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

นี่หมายความว่าคุณควรตั้งค่าของคุณthread_cache_sizeเพื่อให้Threads_created / Connections(% ของการเชื่อมต่อที่นำไปสู่การสร้างเธรดใหม่) ค่อนข้างต่ำ หากคุณใช้ MySQL เอกสารอย่างแท้จริง ("มากที่สุด") ค่าควรเป็น <50% คำตอบของ RolandoMySQLDBA บอกว่า <1% ฉันไม่รู้ว่าใครใกล้ความจริง

คุณควรจะไม่ตั้งสูงกว่าthread_cache_size Max_used_connectionsประโยคสุดท้ายในคำตอบของ RolandoMySQLDBA ("อย่างน้อยที่สุด thread_cache_size ควรมากกว่า Max_used_connections") ดูเหมือนจะไม่สมเหตุสมผลเพราะมันบอกว่าคุณควรเก็บเธรดไว้ในแคชมากกว่าที่เซิร์ฟเวอร์ของคุณเคยใช้ MySQL จะไม่ใส่เธรดจำนวนมากลงในแคชอย่างไรก็ตามไม่ได้กำหนดเธรดไว้ในแคชล่วงหน้า แต่จะวางไว้ที่นั่นหลังจากไคลเอ็นต์สร้างเธรดและยกเลิกการเชื่อมต่อ หากคุณไม่เคยเชื่อมต่อไคลเอนต์ X ในเวลาเดียวกันคุณจะไม่มี X thread ในแคช:

เมื่อไคลเอ็นต์ยกเลิกการเชื่อมต่อเธรดของไคลเอ็นต์จะถูกวางในแคชหากมีเธรดน้อยกว่า thread_cache_size ที่นั่น (ที่มา)

ดูคำตอบนี้โดย Michael:

การตั้งค่า thread_cache_size ให้เป็นค่าที่มากกว่า max_connections ดูเหมือนจะเป็นคำแนะนำที่ไม่ช่วยเหลืออย่างมาก ... แคชอาจไม่สามารถขยายใหญ่กว่า max_connections ได้และแม้แต่แคชที่ใกล้เคียงกับขนาดนั้นก็สามารถทำได้ก็ต่อเมื่อคุณมีจำนวนมากบนเธรดของคุณ ... ซึ่งในแอปพลิเคชันที่ทำงานได้ดีจะไม่เป็นเช่นนั้น

https://dba.stackexchange.com/a/28701


ฉันคิดอย่างนั้น! หลังจากที่ฉันทดสอบการกำหนดค่านี้ "thread_cache_size ควรมากกว่า Max_used_connections" ซึ่งไม่เป็นประโยชน์
CK.Nguyen

-2

ในวันทำงานปกติ 'การจ้างงานใหม่' อาจต้องมีการเชื่อมต่อหรือไม่ นักมายากลส่วนใหญ่จะไม่ทราบว่าจะมีผู้จ้างกี่คนในอีกไม่กี่วันข้างหน้า V 8 ของ MySQL แนะนำ CAP thread_cache_size ที่ 100 เพื่อป้องกันการโอเวอร์โหลดโดยไม่คำนึงถึง max_used_connections สำหรับฉัน 100 เป็น CAP ที่ดี

เห็นลิงค์นี้โปรด

https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_thread_cache_size
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.