เหตุใด Linux จึงล้างแคชหน่วยความจำเมื่อเกือบเต็มแล้ว


14

นี่คือรูปกราฟหน่วยความจำบน VPS ที่รัน CentOS พร้อม RAM ขนาด 512MB และ nginx / php-fpm / mysqld ที่แสดงเนื้อหา (ส่วนใหญ่เป็นแบบคงที่) ต่อผู้เข้าชมสองพันคนต่อวัน

กราฟหน่วยความจำรายสัปดาห์

(นั่นคือวันบนแกน x)

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

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

นี่เป็นพฤติกรรมปกติหรือฉันขาดอะไรไป?

UPDATE: การอัพเกรดหน่วยความจำดูเหมือนว่าจะทำให้กราฟเสถียร ยังคงเห็นหยดเล็ก ๆ แต่ไม่มีอะไรสำคัญเท่าก่อนการอัพเกรด

หลังจากอัพเกรดหน่วยความจำ


นี่เป็นคอนเทนเนอร์ OpenVZ / Virtuozzo หรือ VM จริงเช่น XEN หรือ KVM หรือไม่
jordanm

1
ไม่สามารถอธิบายสิ่งที่พวกเขา แต่ฉันมี VPS ซึ่งแสดงพฤติกรรมเดียวกัน dl.dropbox.com/u/1578899/memory-week.png
EightBitTony

@jordanm เป็นเครื่องเสมือนที่ใช้ Xen
redburn

@EightBitTony ขอบคุณสำหรับการแบ่งปัน คุณดู 'เป็นธรรมชาติ' มากขึ้นเล็กน้อย แต่ฉันเห็นชัดเจนว่ารูปแบบการหยดในแคชหน่วยความจำ (แต่อาจจะคาดเดาได้มากกว่า)
redburn

ฉันสงสัยว่า Munin 2 กำลังทำกราฟ / รวบรวมข้อมูลแตกต่างกันมากพอที่จะทำให้เกิดความแตกต่าง (กราฟที่นุ่มนวลกว่าของคุณ) แต่ถึงกระนั้นฉันก็ยังแสดงให้เห็นถึงการลดลงกลางรอบมากกว่าทุกวัน มันแปลกแน่นอน
EightBitTony

คำตอบ:


3

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


ใช่ฉันเดาว่าเราสามารถตั้งทฤษฎีได้ว่าการใช้หน่วยความจำสั้น ๆ อย่างฉับพลันซึ่งเกิดขึ้นในหนึ่งนาทีหรือมากกว่านั้นและไม่ได้ถูกพบโดย Munin สามารถทิ้งแคชซึ่งแน่นอนว่าเป็นเพราะมันยังคงมีอยู่
EightBitTony

ส่วนหัวนั้นค่อนข้างสับสนซึ่งจริง ๆ แล้วมันแสดงข้อมูลหนึ่งสัปดาห์ดังนั้นวันเหล่านั้นจึงเป็นวัน x-as ไม่ใช่สัปดาห์ สำหรับความถี่ในการสำรวจ: มูนินดึงข้อมูลทุก 5 นาทีและฉันไม่คิดว่าความถี่นั้นสามารถเปลี่ยนแปลงได้ ฉันใช้งาน nginx, mysql, php-fpm และ munin-node เท่านั้น มันสามารถทำอะไรกับแคช mysql ได้ไหม?
redburn

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

เธรดนี้ค่อนข้างเก่า แต่การสังเกตอย่างรวดเร็วเกี่ยวกับวิธีการ: กระบวนการที่มีส่วนช่วยให้แคชหน่วยความจำของระบบจะไม่สะท้อน ( ด้านบน ) ได้อย่างง่ายดายเนื่องจากกระบวนการที่ใช้งานอยู่มากอาจกองสิ่งต่าง ๆ ลงในแคชได้อย่างรวดเร็ว หน่วยความจำที่จัดสรรเพิ่มขึ้นมาก ตัวอย่างเช่นการอ่านไฟล์ที่มีขนาดใหญ่มากในชิ้นเล็ก ๆ สำหรับการส่ง - ในขณะที่กระบวนการอาจไม่เคยใช้เกินกว่าสองสาม MB ที่จัดสรรแต่ไม่กี่ MB เหล่านั้นจะเปลี่ยนแปลงและสะสมการอ้างอิงในแคชอย่างต่อเนื่อง ดังนั้นสิ่งที่ต้องดูในเอาต์พุตอันดับต้นจะเป็นการสะสมเวลา CPU อย่างกะทันหัน
goldilocks

คุณอาจสนใจในสิ่งนี้: cognitivedissonance.ca/cogware/plog
goldilocks

2

เหตุผลหนึ่งที่เป็นไปได้คือไฟล์ที่กำลังเติบโตเช่นไฟล์บันทึกการพูดถูกลบบีบอัดหรือส่งที่อื่นเมื่อถึงขนาดที่กำหนด

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


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