ในระหว่างการดำเนินการเว็บไซต์ในรายการกระบวนการ mysql ฉันเห็นสองกระบวนการด้วยคอลัมน์ "คำสั่ง" ที่ทำเครื่องหมายเป็น "SLEEP"
ฉันควรกังวลไหม จะหยุดสิ่งนี้ได้อย่างไร
ในระหว่างการดำเนินการเว็บไซต์ในรายการกระบวนการ mysql ฉันเห็นสองกระบวนการด้วยคอลัมน์ "คำสั่ง" ที่ทำเครื่องหมายเป็น "SLEEP"
ฉันควรกังวลไหม จะหยุดสิ่งนี้ได้อย่างไร
คำตอบ:
แม้แต่คนที่มีอำนาจมากที่สุดของเราก็ต้องนอนบ้าง หากไม่มีการนอนหลับเราจะรู้สึกกังวลและนอนไม่หลับสามารถนำไปสู่อาการร้ายแรงทุกชนิด
จริงจังมากขึ้น: สถานะ sleep หมายถึงกระบวนการ MySQL ได้ดำเนินการกับแบบสอบถาม แต่ฝั่งไคลเอ็นต์ยังไม่ออก เว็บแอปพลิเคชันจำนวนมากไม่ได้ทำความสะอาดการเชื่อมต่อในภายหลังซึ่งนำไปสู่กระบวนการ MySQL ที่หลับ ไม่ต้องกังวลหากมีเพียงไม่กี่คนเท่านั้น MySQL จะล้างข้อมูลเหล่านั้นหลังจากหมดเวลาที่กำหนด (Wait_timeout)
หรือถ้าเว็บแอปพลิเคชันของคุณใช้การเชื่อมต่อแบบต่อเนื่องและการรวมการเชื่อมต่อเป็นเรื่องปกติที่จะมีกระบวนการสลีปจำนวนมาก: ในกรณีนี้แอปพลิเคชันของคุณจะเปิดขึ้นเช่นการเชื่อมต่อ SQL 100 ครั้ง ที่ช่วยลดค่าใช้จ่ายในการเปิด / ปิดการเชื่อมต่อ เว้นแต่ว่าแอปพลิเคชันของคุณเป็นงานที่ยุ่งมากมันเป็นเรื่องปกติที่แทบทุกกระบวนการของ SQL จะมีบางอย่างที่ต้องทำ
ไม่ไม่ต้องกังวลเกี่ยวกับพวกเขาจนกว่าคุณจะมีหลายพันคน พวกเขามักจะระบุการเชื่อมต่อฐานข้อมูลที่ไม่ได้ทำอะไรในขณะนี้
เว็บไซต์หลายแห่งสร้างขึ้นเพื่อเริ่มต้นการประมวลผลหน้าการเชื่อมต่อฐานข้อมูลจะเปิดขึ้นจากนั้นจะใช้ตลอดการสร้างหน้าและทิ้งไปในที่สุด หากการทิ้งอย่างถูกต้องการเชื่อมต่อฐานข้อมูลจะปิดและเซิร์ฟเวอร์จะฆ่าเธรดที่เกี่ยวข้องซึ่งหมายความว่าการเชื่อมต่อนี้จะหายไปจากรายการกระบวนการ
หากการเชื่อมต่อไม่ได้ปิดการเชื่อมต่ออาจยังคงอยู่ในสถานะ "SLEEP" จนกว่าจะหมดเวลา ในกรณีนี้คุณอาจพบกับกระบวนการนอนหลับมากมาย แต่ถ้าคุณพบปัญหาหน่วยความจำบนเซิร์ฟเวอร์ db นี่ไม่ใช่ปัญหาใหญ่เช่นกัน
ก่อนที่จะเพิ่มตัวแปร max_connections คุณต้องตรวจสอบว่าคุณมีการเชื่อมต่อแบบไม่โต้ตอบโดยใช้คำสั่ง show processlist
หากคุณมีการเชื่อมต่อสลีปจำนวนมากคุณต้องลดค่าของตัวแปร "wait_timeout" เพื่อปิดการเชื่อมต่อที่ไม่ต้องมีการโต้ตอบหลังจากรอสักครู่
ช่วงการแสดงต่างๆเช่น 'wait_timeout'; + + --------------- ------- + | Variable_name | ค่า | + + --------------- ------- + | wait_timeout | 28800 | + + --------------- ------- +
ค่าเป็นวินาทีหมายความว่าการเชื่อมต่อแบบไม่โต้ตอบยังคงนานถึง 8 ชั่วโมง
SET session wait_timeout = 600; การค้นหาตกลง 0 แถวที่ได้รับผลกระทบ (0.00 วินาที)
หลังจาก 10 นาทีหากการเชื่อมต่อการนอนหลับยังคงหลับอยู่ mysql หรือ MariaDB จะยกเลิกการเชื่อมต่อนั้น