หน่วยความจำที่ถูกปลดปล่อยอย่างฉับพลันทุกวันในเวลาเดียวกัน


10

ฉันมี VMs บางส่วนบน Windows Azure ที่ใช้งานเว็บไซต์อีคอมเมิร์ซของเราและเมื่อไม่นานมานี้เราเริ่มใช้ Telegraf, InfluxDb และ Grafana เพื่อจับตาดูเครื่องเหล่านี้ หลังจากสองสามสัปดาห์ของการรวบรวมข้อมูลฉันสังเกตเห็นรูปแบบแปลก ๆ ที่เกี่ยวข้องกับตัวชี้วัดหน่วยความจำที่มีอยู่ :

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

นี่คือแผนภูมิที่แสดงรูปแบบนี้:

รูปแบบที่แปลก

คำถามของฉันคืออะไรจะนำไปสู่อะไรเช่นนี้? ฉันรู้สึกอยากจะสงสัยว่า Memory Leak กำลังจะตำหนิ แต่ ... หน่วยความจำฟรีไม่เคยลดลงต่ำกว่า 70% และเกิดขึ้นกับ VMs สองตัวที่มีปริมาณการใช้งานมากที่สุด!

ฉันควรกังวลเมื่อเห็นสิ่งนี้หรือไม่

ป.ล. : ฉันได้รวบรวมการวัดสำหรับ Private e Virtual bytes สำหรับแต่ละบริการ windows ที่เราใช้และกระบวนการ w3wp ... แม้ว่าฉันได้อ่านแล้วว่า metrics นี้ไม่น่าเชื่อถือมากนักหากคุณมีหน่วยความจำรั่ว แต่อย่างน้อยฉันจะพยายามหาแนวโน้มบางอย่างและดูว่ามันมีความสัมพันธ์กับรูปแบบที่แสดงด้านบนหรือไม่


2
คุณเห็นตัวเก็บรวบรวมขยะหรือแคช IMHO ตามปกติ เว็บไซต์ของคุณใช้ภาษาใด? (ซึ่งอาจจะเป็นแอปของคุณ websever ของคุณและแม้กระทั่งระบบการทำการล้างบาง)
Tensibai

นั่นเป็นสิ่งที่ฉันสงสัยเช่นกัน ... มันทำใน ASP.NET MVC 4 ดังนั้นทฤษฎีการเก็บขยะจึงเหมาะสม นอกจากนี้จากการสังเกตด้านข้างตัวชี้วัดที่ฉันรวบรวมในกระบวนการ w3wp และบริการ windows ก็ดูปกติดี
AntónioSérgioSimões

ฉันไม่รู้อะไรเลยเกี่ยวกับ ASP แต่ฉันคิดว่ามันมีวิธีการกราฟปริมาณการใช้หน่วยความจำและการรวบรวมขยะเช่นเดียวกับใน java สิ่งนี้จะช่วยให้มั่นใจได้ว่านี่คือสาเหตุที่แท้จริง
Tensibai

คำตอบ:


7

ฉันเคยเห็นรูปแบบ "ฟันเลื่อย" แบบนี้ในระบบอื่น ๆ โดยเฉพาะเครื่องมือข้อมูลที่ใช้ Java จากคำอธิบายของคุณฉันคิดว่าคุณกำลังมองหา . NET garbage collection (สมมติว่านี่เป็นแอป. NET.) Java และ. NET เป็นทั้งภาษาที่มีการจัดการหน่วยความจำและเฟรมเวิร์กที่ใช้การรวบรวมขยะ

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

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


มันเป็นแอป. NET และจากการวิจัยของฉันในสองสามวันที่ผ่านมามันสมเหตุสมผลมากกับสิ่งที่คุณและ @Tensibai เขียน
AntónioSérgioSimões

7

ฉันคิดว่าได้พบว่าทำไมกราฟนี้จึงมีลักษณะเช่นนี้

ฉันกำลังรวบรวมตัวชี้วัดสำหรับตัวนับ ASP.NET ประสิทธิภาพ / ข้อผิดพลาดโดยรวมของแอปพลิเคชัน ASP.NET และฉันได้สังเกตเห็นว่าในเวลาเดียวกันกับที่หน่วยความจำที่มีอยู่เกิดขึ้นจริงตัวชี้วัดข้อผิดพลาดทั้งหมดจะรีเซ็ตเป็น 0

ตาม msdn ตัวนับนี้จะรีเซ็ตเป็น 0 ทุกครั้งที่มีการรีสตาร์ท / ปิดแอปพลิเคชัน

สิ่งนี้ทำให้ฉันเชื่อว่าสาเหตุของรูปแบบฟันเลื่อยของหน่วยความจำที่มีอยู่นี้เกิดจากการรีสตาร์ทแอปพลิเคชัน

นี่คือลักษณะแผนภูมิของฉัน:

ข้อผิดพลาดแอปพลิเคชัน ASP.NET ทั้งหมด Memory Surge

UPDATE

สิ่งนี้เกิดขึ้นเนื่องจาก Private Bytes ของกระบวนการ W3WP มีค่าถึงขีด จำกัด ของการรีไซเคิล (เรามีการ จำกัด ไบต์ส่วนตัวที่กำหนดค่าในแอพพูล) และเมื่อมองอย่างใกล้ชิดกับแผนภูมิ Private Bytes เราจะเห็นสิ่งผิดปกติเกิดขึ้นเนื่องจากการใช้หน่วยความจำกระโดดจาก 650MB เป็น 3.2GB และอีกไม่กี่ชั่วโมงก็กระโดดจาก 3.6GB ถึง 16.6GB! นี่คือเมื่อรีไซเคิลเกิดขึ้น


2
นี่คือคำอธิบายที่สมเหตุสมผลมากขึ้น การเพิ่มหน่วยความจำอย่างฉับพลันเกิดขึ้นเกือบจะเฉพาะเมื่อมีการรีสตาร์ทกระบวนการ กลไกในการเพิ่มหน่วยความจำของกระบวนการที่ทำงานอยู่นั้นไม่เคยมีความคมชัดและจริง ๆ แล้วไม่ได้เพิ่มหน่วยความจำมากกว่าการเพิ่มพื้นที่ว่างบนฮีปที่จัดสรรล่วงหน้าแล้ว
Jiri Klouda
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.