คุณกำลังประสบลินุกซ์กินรามฉันปัญหา
อย่าตกใจ
นี่ไม่ใช่ปัญหา.
ระบบของคุณทำงานตามที่ออกแบบไว้
ปัญหาไม่ใช่ระบบปฏิบัติการของคุณ - ปัญหาคือคุณเข้าใจว่าหน่วยความจำ "ฟรี" คืออะไร
ระบบ Unix ใช้หน่วยความจำมากกว่าแค่การรันโปรแกรม อาจใช้หน่วยความจำสำหรับ:
- โปรแกรมที่กำลังทำงาน (ใช้งาน / ใช้)
- ข้อมูลบัฟเฟอร์ระหว่างทาง (บัฟเฟอร์)
- ข้อมูลแคชเพิ่งอ่าน / เขียนไปยังดิสก์ (แคช)
- ไม่มีอะไรแน่นอน (ฟรี)
สิ่งที่ตามมาคือการทัวร์สั้น ๆ (และส่วนใหญ่ไม่สมบูรณ์) ว่าระบบ Unix ที่ทันสมัยรายงานการใช้ RAM อย่างไร
หน่วยความจำว่าง(นิยามของระบบปฏิบัติการ)คืออะไร
เมื่อระบบ Unix รายงาน RAM ว่าฟรีหมายถึง "ฉันไม่ได้ใช้ RAM นี้เพื่ออะไร"
Free RAM นั้นไร้ค่าอย่างมีประสิทธิภาพ - มันไม่ได้ทำให้ระบบของคุณเร็วขึ้นมันแค่นั่งอยู่ที่นั่นว่า "ฟรี" ในกรณีที่มีบางสิ่งที่จำเป็น สิ่งนั้นอาจเป็นหนึ่งในสามรายการอื่น ๆ ที่ฉันได้กล่าวไว้ข้างต้น
หน่วยความจำแคชและบัฟเฟอร์คืออะไร
หน่วยความจำแคชและบัฟเฟอร์เป็น RAM ที่ระบบปฏิบัติการใช้เพื่อทำให้ระบบของคุณเร็วขึ้น
หน่วยความจำนี้ไม่จำเป็นสำหรับการเรียกใช้โปรแกรมในขณะนี้ดังนั้นระบบปฏิบัติการของคุณใช้เพื่อเก็บข้อมูลที่ต้องการบ่อย - ตัวอย่างเช่นไลบรารี C (ต้องการโดยทุกโปรแกรมที่คุณเรียกใช้) จะถูกเก็บไว้ในcache
หน่วยความจำเกือบตลอดเวลาระบบไม่จำเป็นต้องไปที่ดิสก์เพื่อค้นหาคำแนะนำที่จำเป็นในการพิมพ์ "Hello World" บนหน้าจอ
จริงๆแล้วมันซับซ้อนกว่านั้นมาก - มีหน่วยความจำที่แชร์ , หน่วยความจำแบบมีสายฯลฯ - แต่สำหรับวัตถุประสงค์ของเราคำอธิบายง่ายๆนี้ก็เพียงพอแล้ว
หน่วยความจำที่ใช้งานคืออะไร?
หน่วยความจำที่ใช้งานอยู่เป็นส่วนหนึ่งที่เราเข้าใจว่าเป็นหน่วยความจำ "ใช้แล้ว" - RAM ที่แอปพลิเคชันใช้สำหรับสิ่งที่ทำ - จัดเรียงสเปรดชีตให้บริการหน้าเว็บแก้ไขกราฟิก ฯลฯ
หน่วยความจำ "ใช้งานล่าสุด" - โปรแกรมที่อ้างว่าใช้ประโยชน์จากเนื้อหา (การอ่านหรือการเขียน) และไม่ถือว่าเป็นตัวเลือกที่ดีสำหรับการแลกเปลี่ยน
หน่วยความจำที่ไม่ใช้งานคืออะไร?
เช่นเดียวกับหน่วยความจำที่ใช้งานหน่วยความจำไม่ได้ใช้งานคือ RAM ที่แอปพลิเคชันใช้สำหรับสิ่งที่มันทำ ความแตกต่างคือหน่วยความจำนี้ยังไม่ได้รับการเข้าถึงในขณะที่ดังนั้นถ้าดันมาผลักระบบปฏิบัติการคิดว่ามันสามารถสลับออกไปยังดิสก์และ (มีโชคเล็กน้อย) โปรแกรมที่อ้างว่ามันจะไม่ถามอีกครั้งดังนั้นมัน จะไม่สังเกต
หน่วยความจำ "ใช้แล้ว" คืออะไร(คำจำกัดความของมนุษย์)
สิ่งที่คุณและฉันคิดว่าเป็น "ใช้" หน่วยความจำคือหลักผลรวมของหน่วยความจำที่ใช้งานและไม่ใช้งาน RAM ทั้งหมดที่อ้างสิทธิ์ในขณะนี้โดยแอปพลิเคชันสำหรับการใช้งาน
ตราบใดที่คุณมี RAM ติดตั้งมากกว่าผลรวมของหน่วยความจำที่ใช้งานและไม่ใช้งาน (บวกกับขอบความปลอดภัยที่ดีที่ 512-1024MB อยู่ด้านบน) คุณอยู่ในตำแหน่งที่ถูกต้อง: ระบบปฏิบัติการของคุณอาจไม่ได้แลกเปลี่ยนประสิทธิภาพ .
"ฟรี" ความทรงจำคืออะไร(ความคมชัดของมนุษย์) ?
สิ่งที่คุณและฉันคิดว่าเป็น "ฟรี" หน่วยความจำคือหน่วยความจำที่มีให้เรียกใช้โปรแกรม
สิ่งนี้มีความซับซ้อนมากกว่าเพียงแค่ "ฟรี" เพียงร่างรายงานระบบปฏิบัติการของคุณ เมื่อโปรแกรมขอ RAM ระบบปฏิบัติการจะพยายามรับ RAM นั้นอย่างน้อยก็สามารถทำได้:
- หากมีหน่วยความจำว่าง (นั่งรอบทำอะไร) RAM ที่จะถูกจัดสรร
- หากไม่มีหน่วยความจำว่างระบบปฏิบัติการจะใช้พื้นที่แคชและบัฟเฟอร์: สิ่งที่เข้าถึงได้น้อยที่สุด / อย่างน้อยที่สุดในบัฟเฟอร์พูลจะถูกโยนออกและ RAM ที่มอบให้กับโปรแกรม
- หากไม่มี Buffer / Cache RAM ในการเปลี่ยน swapper จะดูหน่วยความจำที่ไม่ได้ใช้งานและเลือกพื้นที่ที่คิดว่าน่าจะเข้าถึงได้น้อยที่สุด ข้อมูลนั้นจะถูกเพจเอาต์เพื่อแลกเปลี่ยน (ดิสก์) และ RAM ที่เพิ่งได้รับใหม่ที่มอบให้กับโปรแกรม
- หาก Inactive RAM ทั้งหมดถูกสลับเป็น Swapper จะเริ่มวาง Active RAM บนดิสก์
(นี่คือเกี่ยวกับการที่ผลการดำเนินงานมักจะไปที่สุนัข: ทุกครั้งที่โปรแกรมที่ได้รับการเปิดบน CPU บิตสลับออกมันจะต้องถูกนำกลับเข้ามาใน RAM ซึ่งหมายความว่าหน่วยความจำที่ใช้งานโปรแกรมอื่น ๆ จะต้องมีสลับออก - The อัตราการแลกเปลี่ยนที่สูงในการสลับเรียกว่าthrashing )
- หากระบบเปลี่ยนทุกอย่างที่ทำได้ (และเติมพาร์ติชั่นสว็อป) หรือถ้าคุณใช้ระบบที่ไม่มีพาร์ติชั่นสว็อป, สิ่งต่าง ๆ จะเกิดขึ้น ณ จุดนี้หนึ่งในสองสิ่งจะเกิดขึ้น:
malloc()
จะล้มเหลว นี่เป็นพฤติกรรมที่สอดคล้องกับ POSIX - ระบบปฏิบัติการจะบอกโปรแกรมที่ขอ RAM ว่าไม่สามารถตอบสนองคำขอได้
โปรแกรมสามารถขอ RAM น้อยลงหรือถ้ามันไม่สามารถทำอะไรกับหน่วยความจำขนาดเล็กก็สามารถล้างและออก (หากโปรแกรมเขียนไม่ดีจะทำให้เกิดข้อผิดพลาด)
- หากคุณอยู่ในกล่อง Linux OOM-Killerอาจไปในรูปแบบไดรฟ์โดยการฆ่าความสนุกสนานยุติกระบวนการอื่น ๆ เพื่อพยายามเพิ่ม RAM ให้เพียงพอเพื่อตอบสนองคำขอ
ในกรณีที่คุณไม่สามารถบอกได้ด้วยคำอธิบายของฉันที่นี่และคำตอบของฉันสำหรับคำถามที่เชื่อมโยงฉันคิดว่านี่เป็นวิธีที่น่ากลัวในการจัดการกับปัญหา
ทำไม Free RAM ถึงสูงขึ้นเมื่อคุณลบไฟล์
ในตัวอย่างจากคำถามที่นี่คุณสังเกตเห็นว่าเป็นไปได้ที่จะ "ฟรี" แรมโดยการลบไฟล์สำรอง - คำอธิบายสำหรับที่ค่อนข้างง่าย: เนื่องจากไม่มีการใช้ไฟล์นั้น (ไม่มีการจัดการไฟล์ที่เปิด) และไม่สามารถเข้าถึงได้จาก ระบบไฟล์ (ยกเลิกการเชื่อมโยง) ระบบปฏิบัติการรู้ว่าไม่มีใครสามารถเข้าถึงข้อมูลนั้นได้อีกและจะทำการล้างข้อมูลจากแคชของระบบไฟล์
สิ่งนี้ทำให้ระบบปฏิบัติการรายงานหน่วยความจำว่างมากขึ้น แต่ไม่มีผลกระทบต่อประสิทธิภาพของระบบ