ทำไม Red Hat Linux รายงานหน่วยความจำว่างน้อยกว่าในระบบมากกว่าที่เป็นจริง


9

ฉันมีเซิร์ฟเวอร์ Red Hat Linux ในบ้านขนาดเล็ก (RAM ประมาณ 8 GB) ฉันไม่ได้ใช้มันมากไปกว่าการใช้แอพที่ปลูกในบ้านเพื่อติดตามสิ่งต่าง ๆ สิ่งเดียวที่ทำงานบนกล่องคือฐานข้อมูลและเว็บเซิร์ฟเวอร์

ฉันสังเกตเห็นว่าเมื่อตรวจสอบตัวนับระบบโดยใช้เครื่องมือเช่น NMON และ TOP ว่าหน่วยความจำที่ว่างของระบบทั้งหมดค่อนข้างต่ำ (ตามลำดับไม่กี่ร้อย MB) ในขณะที่หน่วยความจำที่ใช้งานอยู่สำหรับฐานข้อมูลและเว็บเซิร์ฟเวอร์ยังคงอยู่ในระดับต่ำ (เท่านั้น การบริโภครวม 3 GB) แม้ว่าเมื่อรวมถึงกระบวนการทำงานอื่น ๆ ทั้งหมดหน่วยความจำที่ใช้ทั้งหมดจะน้อยกว่า 4 GB

ทำไม Red Hat Linux รายงานหน่วยความจำว่างน้อยกว่าหน่วยความจำทั้งหมดลบด้วยหน่วยความจำทั้งหมดที่ใช้ในกระบวนการทำงาน?

คำตอบ:


19

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

% free -m
             total       used       free     shared    buffers     cached
Mem:           997        942         55          0         71        366
-/+ buffers/cache:        504        492
Swap:         2015        618       1397

Linux (และ Unix OS'es ทั้งหมด) พยายามที่จะมีหน่วยความจำว่างน้อยที่สุดเท่าที่จะเป็นไปได้ แต่พวกเขาใช้หน่วยความจำที่ไม่ได้ถูกแมปอย่างแข็งขันกับกระบวนการในระบบปฏิบัติการที่รันอยู่สำหรับสิ่งต่าง ๆ เช่นแคชไฟล์และบัฟเฟอร์สำหรับการดำเนินการถ่ายโอน IO ต่างๆ

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

  1. หน่วยความจำสามารถใช้ร่วมกันระหว่างกระบวนการต่างๆผ่านการคัดลอกเมื่อเขียนจัดสรรหน่วยความจำหน่วยความจำที่แมป IOและห้องสมุดแบบไดนามิกที่ใช้ร่วมกัน
  2. ระบบปฏิบัติการมีอิสระที่จะสัญญากับหน่วยความจำให้กับแอปพลิเคชันมากกว่าที่ให้มาจริง ทฤษฎีที่ว่าผู้เขียนโปรแกรมส่วนใหญ่ต้องการขอหน่วยความจำจำนวนมากในครั้งเดียวเพื่อหลีกเลี่ยงค่าใช้จ่ายและอาจไม่ได้ใช้หน่วยความจำทั้งหมดนั้น

มีบทความล่าสุดเกี่ยวกับlwn.net ถกปัญหานี้


1
มีคำอธิบายง่ายๆที่นี่: linuxatemyram.com
Steven T. Snyder

4

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

การใช้งานฟรี -m บนกล่องจะช่วยให้คุณมีความคิดที่ดีขึ้นเกี่ยวกับการใช้หน่วยความจำ

ด้านล่างเป็นผลลัพธ์ที่ดึงมาจากหนึ่งในกล่องของฉัน หน่วยความจำว่างคือ 147Meg ที่มีแคชเกือบ 4G สำหรับการร้องขอการเข้าถึงระบบไฟล์

free -m
             total       used       free     shared    buffers     cached
Mem:          6035       5888        147          0         77       4116
-/+ buffers/cache:       1693       4341
Swap:         4722          0       4722


1

ด้วย linux ให้ดูที่ Committed_AS ใน / proc / meminfo นี่คือจำนวนหน่วยความจำ (real + swap) ที่เคอร์เนลได้ให้สัญญากับกระบวนการทำงาน

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

ดูสิ่งที่เคอร์เนลมุ่งมั่นที่จะให้ .. และการใช้งานสกปรก (สลับ) ซึ่งจะช่วยให้คุณเห็นภาพรวมที่ดีขึ้น

หากคุณต้องการปรับพฤติกรรมนี้โปรดอัปเดตคำถามของคุณ :)

นี่คือ MO มาตรฐานสำหรับ Linux .. การจัดการหน่วยความจำ distros ปรับแต่งเพื่อให้เหมาะกับความต้องการของพวกเขาผ่าน sysctl อย่างไรก็ตามสิ่งที่คุณรายงานนั้นเป็นเรื่องปกติในหมู่ทุกคน


1

คุณใช้เคอร์เนลชนิดใดในระบบ? เคอร์เนลแบบ 32 บิตจะรายงานเฉพาะหน่วยความจำ 3.6GB เท่านั้นยกเว้นว่าคอมไพล์ด้วย PAE ที่เปิดใช้งาน

บอกว่าถ้านี่เป็น Redhat Enterprise Linux (หรือ CentOS) รุ่นใหม่ - v3 เป็นต้นไป - เคอร์เนล 32 บิตเริ่มต้นจะเปิดใช้งานสิ่งนี้

หากคุณสามารถโพสต์ผลลัพธ์ของคำสั่ง 'ฟรี' ที่มีรายละเอียดด้านบนเราจะสามารถดูว่านี่เป็นปัญหาหรือไม่

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