ฉันควรกังวลเกี่ยวกับกระบวนการสถานะ mysql sleep ในรายการกระบวนการ


11

ในระหว่างการดำเนินการเว็บไซต์ในรายการกระบวนการ mysql ฉันเห็นสองกระบวนการด้วยคอลัมน์ "คำสั่ง" ที่ทำเครื่องหมายเป็น "SLEEP"

ฉันควรกังวลไหม จะหยุดสิ่งนี้ได้อย่างไร


คำตอบ:


17

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

จริงจังมากขึ้น: สถานะ sleep หมายถึงกระบวนการ MySQL ได้ดำเนินการกับแบบสอบถาม แต่ฝั่งไคลเอ็นต์ยังไม่ออก เว็บแอปพลิเคชันจำนวนมากไม่ได้ทำความสะอาดการเชื่อมต่อในภายหลังซึ่งนำไปสู่กระบวนการ MySQL ที่หลับ ไม่ต้องกังวลหากมีเพียงไม่กี่คนเท่านั้น MySQL จะล้างข้อมูลเหล่านั้นหลังจากหมดเวลาที่กำหนด (Wait_timeout)

หรือถ้าเว็บแอปพลิเคชันของคุณใช้การเชื่อมต่อแบบต่อเนื่องและการรวมการเชื่อมต่อเป็นเรื่องปกติที่จะมีกระบวนการสลีปจำนวนมาก: ในกรณีนี้แอปพลิเคชันของคุณจะเปิดขึ้นเช่นการเชื่อมต่อ SQL 100 ครั้ง ที่ช่วยลดค่าใช้จ่ายในการเปิด / ปิดการเชื่อมต่อ เว้นแต่ว่าแอปพลิเคชันของคุณเป็นงานที่ยุ่งมากมันเป็นเรื่องปกติที่แทบทุกกระบวนการของ SQL จะมีบางอย่างที่ต้องทำ


5

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

เว็บไซต์หลายแห่งสร้างขึ้นเพื่อเริ่มต้นการประมวลผลหน้าการเชื่อมต่อฐานข้อมูลจะเปิดขึ้นจากนั้นจะใช้ตลอดการสร้างหน้าและทิ้งไปในที่สุด หากการทิ้งอย่างถูกต้องการเชื่อมต่อฐานข้อมูลจะปิดและเซิร์ฟเวอร์จะฆ่าเธรดที่เกี่ยวข้องซึ่งหมายความว่าการเชื่อมต่อนี้จะหายไปจากรายการกระบวนการ

หากการเชื่อมต่อไม่ได้ปิดการเชื่อมต่ออาจยังคงอยู่ในสถานะ "SLEEP" จนกว่าจะหมดเวลา ในกรณีนี้คุณอาจพบกับกระบวนการนอนหลับมากมาย แต่ถ้าคุณพบปัญหาหน่วยความจำบนเซิร์ฟเวอร์ db นี่ไม่ใช่ปัญหาใหญ่เช่นกัน


3

ก่อนที่จะเพิ่มตัวแปร max_connections คุณต้องตรวจสอบว่าคุณมีการเชื่อมต่อแบบไม่โต้ตอบโดยใช้คำสั่ง show processlist

หากคุณมีการเชื่อมต่อสลีปจำนวนมากคุณต้องลดค่าของตัวแปร "wait_timeout" เพื่อปิดการเชื่อมต่อที่ไม่ต้องมีการโต้ตอบหลังจากรอสักครู่

  • หากต้องการแสดงค่า wait_timeout:
ช่วงการแสดงต่างๆเช่น 'wait_timeout';

+ + --------------- ------- +
| Variable_name | ค่า |
+ + --------------- ------- +
| wait_timeout | 28800 |
+ + --------------- ------- +

ค่าเป็นวินาทีหมายความว่าการเชื่อมต่อแบบไม่โต้ตอบยังคงนานถึง 8 ชั่วโมง

  • วิธีเปลี่ยนค่าของตัวแปร "wait_timeout":
SET session wait_timeout = 600;
การค้นหาตกลง 0 แถวที่ได้รับผลกระทบ (0.00 วินาที)

หลังจาก 10 นาทีหากการเชื่อมต่อการนอนหลับยังคงหลับอยู่ mysql หรือ MariaDB จะยกเลิกการเชื่อมต่อนั้น

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