ดิ้นรนเพื่อดีบักการใช้งาน CPU สูงในอินสแตนซ์ Amazon RDS MySQL


21

เรากำลังเรียกใช้เซิร์ฟเวอร์ MySQL RDS m1.x ใหญ่และมีปัญหาบางอย่างกับการใช้งาน CPU สูง เรามีปัญหาบางอย่างเมื่อไม่กี่สัปดาห์ที่ผ่านมาเนื่องจากการใช้งาน CPU สูงถึง 100% ในกรณีที่มีขนาดใหญ่ เมื่อเราอัพเกรดขนาดเป็น xlarge ซึ่งทำให้สิ่งต่าง ๆ มีเสถียรภาพชั่วขณะหนึ่ง แต่การใช้งาน CPU จะค่อยๆขยายตัวขึ้นอีกครั้ง

ในช่วงสัปดาห์ที่ผ่านมาการใช้งานซีพียูในช่วง 90 ปีที่ผ่านมาสูงถึง 100% หรือประมาณนั้นอย่างต่อเนื่องเมื่อวานนี้ซึ่งทำให้พื้นที่การผลิตของเราหยุดชะงัก หลังจากรีบูตเซิร์ฟเวอร์ db การใช้งาน CPU ภายในไม่กี่ชั่วโมงจะเพิ่มขึ้นเป็นระดับเดียวกัน

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

+------+----------+---------------------------------------------------+--------------+---------+-------+--------------+----------------------------------------------------------------------------------------+
| Id | User | Host | db | Command | Time | State | Info |
+------+----------+---------------------------------------------------+--------------+---------+-------+--------------+----------------------------------------------------------------------------------------+
| 13 | rdsadmin | localhost:43513 | mysql | Sleep | 14 | | NULL |
| 15 | proddbuser | app-server-1.eu-west-1.compute.internal:36460 | proddb | Sleep | 46 | | NULL |
| 451 | proddbuser | app-server-1.eu-west-1.compute.internal:55512 | proddb | Sleep | 29 | | NULL |
| 912 | proddbuser | app-server-1.eu-west-1.compute.internal:45171 | proddb | Sleep | 13 | | NULL |
| 941 | proddbuser | app-server-1.eu-west-1.compute.internal:47353 | proddb | Sleep | 53 | | NULL |
| 951 | proddbuser | app-server-1.eu-west-1.compute.internal:48014 | proddb | Sleep | 37 | | NULL |
| 1009 | proddbuser | app-server-1.eu-west-1.compute.internal:51787 | proddb | Sleep | 36 | | NULL |
| 1041 | proddbuser | app-server-1.eu-west-1.compute.internal:53777 | proddb | Sleep | 14 | | NULL |
| 1572 | proddbuser | app-server-1.eu-west-1.compute.internal:42989 | proddb | Sleep | 3 | | NULL |
| 1592 | proddbuser | app-server-1.eu-west-1.compute.internal:43279 | proddb | Sleep | 162 | | NULL |
| 2909 | proddbuser | app-server-1.eu-west-1.compute.internal:37768 | proddb | Sleep | 35 | | NULL |
| 3028 | proddbuser | app-server-1.eu-west-1.compute.internal:42568 | proddb | Sleep | 5 | | NULL |
| 3119 | proddbuser | app-server-1.eu-west-1.compute.internal:46913 | proddb | Sleep | 76 | | NULL |
| 3189 | proddbuser | app-server-1.eu-west-1.compute.internal:51466 | proddb | Sleep | 5 | | NULL |
| 3216 | proddbuser | app-server-2.eu-west-1.compute.internal:44097 | proddb | Sleep | 14552 | | NULL |
| 3218 | proddbuser | app-server-2.eu-west-1.compute.internal:44099 | proddb | Sleep | 14552 | | NULL |
| 3219 | proddbuser | app-server-2.eu-west-1.compute.internal:44107 | proddb | Sleep | 44 | | NULL |
| 3220 | proddbuser | app-server-2.eu-west-1.compute.internal:44113 | proddb | Sleep | 26 | | NULL |
| 3223 | proddbuser | app-server-2.eu-west-1.compute.internal:44184 | proddb | Sleep | 50 | | NULL |
| 3224 | proddbuser | app-server-2.eu-west-1.compute.internal:44187 | proddb | Sleep | 1 | | NULL |
| 3226 | proddbuser | app-server-2.eu-west-1.compute.internal:44208 | proddb | Sleep | 33 | | NULL |
| 3229 | proddbuser | app-server-2.eu-west-1.compute.internal:44250 | proddb | Sleep | 14 | | NULL |
| 3232 | proddbuser | app-server-2.eu-west-1.compute.internal:44279 | proddb | Sleep | 26 | | NULL |
| 3233 | proddbuser | app-server-2.eu-west-1.compute.internal:44297 | proddb | Sleep | 31 | | NULL |
| 3237 | proddbuser | app-server-2.eu-west-1.compute.internal:44334 | proddb | Sleep | 27 | | NULL |
| 3239 | proddbuser | app-server-2.eu-west-1.compute.internal:44338 | proddb | Sleep | 11 | | NULL |
| 3241 | proddbuser | app-server-2.eu-west-1.compute.internal:44356 | proddb | Sleep | 26 | | NULL |
| 3260 | proddbuser | app-server-2.eu-west-1.compute.internal:44619 | proddb | Sleep | 8 | | NULL |
| 3337 | proddbuser | utility-server-1.eu-west-1.compute.internal:45193 | proddb | Query | 0 | Sending data | SELECT `mytable`.* FROM `mytable` WHERE `mytable`.`foreign_key` = 309416 LIMIT 1 |
| 3419 | proddbuser | utility-server-1.eu-west-1.compute.internal:46136 | proddb | Query | 0 | Sending data | SELECT `mytable`.* FROM `mytable` WHERE `mytable`.`foreign_key` = 284530 LIMIT 1 |
| 3463 | proddbuser | app-server-1.eu-west-1.compute.internal:59619 | proddb | Sleep | 9406 | | NULL |
| 3504 | proddbuser | utility-server-1.eu-west-1.compute.internal:47063 | proddb | Query | 0 | Sending data | SELECT `mytable`.* FROM `mytable` WHERE `mytable`.`foreign_key` = 260571 LIMIT 1 |
| 3577 | proddbuser | app-server-1.eu-west-1.compute.internal:34394 | proddb | Sleep | 6734 | | NULL |
| 3585 | proddbuser | utility-server-1.eu-west-1.compute.internal:47990 | proddb | Query | 0 | Sending data | SELECT `mytable`.* FROM `mytable` WHERE `mytable`.`foreign_key` = 231273 LIMIT 1 |
| 3664 | proddbuser | utility-server-1.eu-west-1.compute.internal:48909 | proddb | Query | 0 | Sending data | SELECT `mytable`.* FROM `mytable` WHERE `mytable`.`foreign_key` = 201525 LIMIT 1 |
| 3716 | proddbuser | app-server-2.eu-west-1.compute.internal:56301 | proddb | Sleep | 27 | | NULL |
| 3748 | proddbuser | utility-server-1.eu-west-1.compute.internal:49850 | proddb | Query | 0 | Sending data | SELECT `mytable`.* FROM `mytable` WHERE `mytable`.`foreign_key` = 167839 LIMIT 1 |
| 3771 | proddbuser | my-pc:30101 | NULL | Query | 0 | NULL | show processlist |
| 3831 | proddbuser | utility-server-1.eu-west-1.compute.internal:50785 | proddb | Query | 0 | Sending data | SELECT `mytable`.* FROM `mytable` WHERE `mytable`.`foreign_key` = 123228 LIMIT 1 |
+------+----------+---------------------------------------------------+--------------+---------+-------+--------------+----------------------------------------------------------------------------------------+

ฉันควรจะบอกว่าปริมาณการใช้งานเว็บไซต์นั้นต่ำมากในช่วงเวลานี้เทียบกับชั่วโมงเร่งด่วนปกติประมาณ 10% ของการโหลดที่เราเห็นในช่วงเวลาเร่งด่วน

นอกจากนี้เรายังมีการตรวจสอบของที่ระลึกใหม่ซึ่งแสดงให้เราเห็นว่าการโทรฐานข้อมูลแอปใช้เวลานานที่สุดคืออะไร มันแสดงให้เราเห็นว่ามีการโทรหนึ่งครั้งที่คิดเป็น 99% ของเวลาที่แอพของเราใช้ในฐานข้อมูลนั้นเป็นการค้นหาแบบ id ง่ายๆโดยทำดังนี้

SELECT `mytable`.* FROM `mytable` WHERE `mytable`.`id` = 123 LIMIT 1

(ไม่เหมือนกับแบบสอบถามที่ใช้ในรายการกระบวนการข้างต้น)

การดำเนินการนี้ช้าลงกว่าสัปดาห์ที่แล้วโดยมีค่าเบี่ยงเบนมาตรฐานระหว่างการร้องขอเวลาเพิ่มขึ้นและจำนวนเวลาสูงสุดที่ใช้ในการวัดเป็นวินาที ฉันคิดว่านี่เป็นเพียงผลลัพธ์ของปัญหาการใช้งาน CPU มากกว่าสาเหตุ

ตารางนี้มีประมาณ 80,000 แถวจึงไม่ใหญ่มาก คาดว่าเวลาส่วนใหญ่ของแอพในฐานข้อมูลจะถูกใช้เพื่อค้นหาบันทึกในตารางนี้ฟังก์ชั่นหลักของแอพจะขึ้นอยู่กับสิ่งนี้ ฉันเรียกใช้แบบสอบถามที่คล้ายกันตัวเองจากเซิร์ฟเวอร์แอปของฉันไปยังฐานข้อมูลการผลิตสองสามครั้งในขณะที่การใช้งาน CPU ยังคงอยู่ที่ประมาณ 100% และตอบสนองภายใน 1 หรือ 2 มิลลิวินาที

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


เพิ่งรีสตาร์ท RDS เพื่อแก้ไขปัญหาของฉัน
shareef

คำตอบ:


14

จัดการเพื่อแก้ไขปัญหานี้เป็นขั้นตอนที่ฉันปฏิบัติตาม:

ประการแรกฉันติดต่อทีม Amazon RDS โดยโพสต์ในฟอรัมการสนทนาพวกเขายืนยันว่าเป็นกระบวนการ mysqld ที่ใช้ CPU ทั้งหมด - นี่เป็นการขจัดข้อผิดพลาดในการกำหนดค่าด้วยสิ่งอื่นที่ทำงานบนเซิร์ฟเวอร์จริง

ประการที่สองฉันติดตามแหล่งที่มาของข้อความค้นหาที่ทำงานอยู่:

SELECT `mytable`.* FROM `mytable` WHERE `mytable`.`foreign_key` = 231273 LIMIT 1 

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

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

ทำตามคำแนะนำนี้อย่างหลวม ๆ :

http://www.mysqlperformanceblog.com/2007/02/08/debugging-sleeping-connections-with-mysql/

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

บางสิ่งที่ทำให้เรื่องแย่ลงดูเหมือนว่ามี 6 อินสแตนซ์ของกระบวนการเดียวกันนี้ทำงานในครั้งเดียวเนื่องจากวิธีการกำหนดค่างาน cron และแต่ละครั้งใช้เวลานานเท่าใด! ฉันฆ่ากระบวนการเหล่านี้และการใช้งาน CPU ของเราลดลงอย่างมากจากประมาณ 100% เป็นประมาณ 5%!

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