ทำไมคำสั่ง“ ฟรี” และ“ dmidecode” จึงแสดงค่าต่าง ๆ สำหรับ RAM


9

ฉันมีเซิร์ฟเวอร์CentOS 5.10 ( 32 บิต ) ที่ทำงานบน VMWare มันจัดสรรแรม 4 GB

ถ้าฉันวิ่งdmidecode -t 17 | grep Size | grep MBฉันเห็น:

Size: 4096 MB

แต่เมื่อฉันวิ่งfreeฉันเห็น:

             total       used       free     shared    buffers     cached
Mem:       3107140    1239244    1867896          0        332     400464
-/+ buffers/cache:     838448    2268692
Swap:      2096472          0    2096472

เหตุใดจึงมีความคลาดเคลื่อนระหว่างจำนวนfreeรายงานหน่วยความจำทั้งหมดกับdmidecodeเอาต์พุต

เคอร์เนลที่ฉันใช้คือ:

2.6.18-371.4.1.el5 #1 SMP Thu Jan 30 06:09:24 EST 2014 i686 i686 i386 GNU/Linux

เป็นที่ยอมรับว่าเคอร์เนลไม่ทำงานPAEแต่ฉันคิดว่าจำเป็นสำหรับหน่วยความจำเกิน 4 GB เท่านั้น

ฉันรู้ว่าฉันพลาดอะไรบางอย่างไปง่ายๆ

หมายเหตุเพิ่มเติม / การสังเกต

ดูเหมือนว่าเคอร์เนลของฉันกำลังสำรองหน่วยความจำมากมายสำหรับสิ่งอื่น ๆ นี่คือสิ่งที่ฉันเห็นใน/var/log/dmesg:

Linux version 2.6.18-371.4.1.el5 (mockbuild@builder17.centos.org) (gcc version 4.1.2 20080704 (Red Hat 4.1.2-54)) #1 SMP Thu Jan 30 06:09:24 EST 2014
BIOS-provided physical RAM map:
 BIOS-e820: 0000000000010000 - 000000000009f800 (usable)
 BIOS-e820: 000000000009f800 - 00000000000a0000 (reserved)
 BIOS-e820: 00000000000ca000 - 00000000000cc000 (reserved)
 BIOS-e820: 00000000000dc000 - 0000000000100000 (reserved)
 BIOS-e820: 0000000000100000 - 00000000bfef0000 (usable)
 BIOS-e820: 00000000bfef0000 - 00000000bfeff000 (ACPI data)
 BIOS-e820: 00000000bfeff000 - 00000000bff00000 (ACPI NVS)
 BIOS-e820: 00000000bff00000 - 00000000c0000000 (usable)
 BIOS-e820: 00000000e0000000 - 00000000f0000000 (reserved)
 BIOS-e820: 00000000fec00000 - 00000000fec10000 (reserved)
 BIOS-e820: 00000000fee00000 - 00000000fee01000 (reserved)
 BIOS-e820: 00000000fffe0000 - 0000000100000000 (reserved)
 BIOS-e820: 0000000100000000 - 0000000140000000 (usable)
Warning only 4GB will be used.
Use a PAE enabled kernel.
3200MB HIGHMEM available.
896MB LOWMEM available.
found SMP MP-table at 000f6bf0
Memory for crash kernel (0x0 to 0x0) notwithin permissible range

คำตอบ:


18

ด้วยเคอร์เนล 32 บิตคุณมีเพียง 4GB ของที่มีอยู่ในพื้นที่ที่อยู่ พื้นที่ที่อยู่นี้บางส่วนจะต้องใช้งานโดยฮาร์ดแวร์ (เสมือนหรือจริง) ในระบบเช่นการ์ดวิดีโอ NIC ฯลฯ เพื่อจุดประสงค์ของตัวเอง การใช้งานนี้มักจะอยู่ระหว่าง 256MB-1GB ขึ้นอยู่กับพื้นที่ที่อยู่ที่ฮาร์ดแวร์ต้องการ

เนื่องจากฮาร์ดแวร์ใช้พื้นที่ที่อยู่นั้น RAM ที่เกี่ยวข้องจึงไม่สามารถเข้าถึงระบบ 32 บิตได้

คุณมีตัวเลือกสองทาง:

  1. ตัวเลือกที่ต้องการคือการเรียกใช้ระบบปฏิบัติการ 64 บิต สิ่งนี้จะขยายพื้นที่ที่อยู่อย่างมากดังนั้นจึงมีพื้นที่เหลือเฟือสำหรับ RAM และฮาร์ดแวร์ทั้งหมด นอกจากนี้ยังแบ่งขีด จำกัด 2GB / 3GB 32- บิตบนแอปพลิเคชันในขณะที่ยังคงความสามารถในการเรียกใช้โปรแกรม 32- บิต โดยทั่วไประบบใด ๆ ที่มี RAM 2GB ขึ้นไปควรใช้ระบบปฏิบัติการ 64 บิตเพื่อหลีกเลี่ยงปัญหาเหล่านี้
  2. ตัวเลือกอื่นคือเรียกใช้เคอร์เนลแบบ 32 บิตโดยเปิดใช้งาน PAE สิ่งนี้จะยกเลิกการซ่อน RAM แต่แต่ละกระบวนการจะยังคง จำกัด พื้นที่ที่อยู่ 2GB / 3GB ขึ้นอยู่กับรายการของเคอร์เนลบิลด์ เนื่องจากระบบปฏิบัติการ 64 บิตจะใช้งานแอพพลิเคชั่นแบบ 32 บิตได้อย่างสมบูรณ์แบบดังนั้นจึงไม่มีข้อได้เปรียบและมีข้อเสียมากมาย (เช่นขาดเส้นทางการอัพเกรด)

ขอบคุณ มันสมเหตุสมผล แต่ฉันจะตรวจสอบโดยเฉพาะเจาะจงว่า "ซ่อนไว้" / ใช้ฮาร์ดแวร์เพื่อวัตถุประสงค์อื่นได้อย่างไร จะอยู่ภายใต้/proc/meminfo?
Mike B

@MikeB โดยเฉพาะฉันไม่แน่ใจทันทีเลยว่าแม้ว่ามันจะหายไปประมาณ 800 MB
Michael Hampton

สำหรับจุดประสงค์ของคำถามเริ่มต้นของฉันฉันคิดว่ามันตอบแล้ว แต่คำถามต่อไปคือ "ทำไมล่ะ" ดูเหมือนว่าจะมีเธรดอื่นที่ครอบคลุมสิ่งนี้ ( unix.stackexchange.com/questions/97261/… ) ดังนั้นฉันจะลองขุดอีกและอาจมีคำถามในภายหลัง ขอบคุณ!
Mike B

ในฐานะผู้ดูแลระบบมืออาชีพเราให้ความสำคัญกับเรื่องนี้ แต่มีเพียงไม่ถึงจุด - สถานที่และวิธีที่มันมีผลต่อการดำเนินงาน ฉันคิดว่าฉันพูดถึงเรื่องนั้นแล้ว
Michael Hampton

2
@MikeB /proc/iomemจะแสดงหน่วยความจำที่ใช้โดยอุปกรณ์ที่ Linux มีไดรเวอร์สำหรับ แผนที่หน่วยความจำ e820 (ที่จุดเริ่มต้นของdmesgเคอร์เนลที่บูตใหม่) จะแสดงให้คุณเห็นว่า BIOS / EFI ของคุณคิดว่าพื้นที่ใดถูกสงวนไว้ การจับคู่กันระหว่างกันคือ AFAIK ซึ่งเป็นงานที่ทำด้วยมือโดยไม่มีการสนับสนุนเครื่องมือ
mihi

5

เอาต์พุตของfreeคำสั่งไม่นับหน่วยความจำเคอร์เนลที่สงวนไว้และบิตขนาดเล็กอื่น ๆ คุณจะเห็นความแตกต่างนี้แม้ในเคอร์เนล 64 บิตและแม้กระทั่งกับ <2GB RAM


2
ที่ไม่เพียงไม่กี่บิตขนาดเล็กอื่น ๆ ...
ไมเคิลแฮมป์ตัน

ดีไม่ใช่ไม่ใช่บิตเหมือนใน 8-bits-make-a-byte ... แต่มันก็เป็นเพียงไม่กี่สิบ MB เปอร์เซ็นต์ที่ชาญฉลาดมันเล็กมาก
จอห์น

ตัวอย่างเช่นในสองระบบ 64 บิตที่ใช้ RHEL 5.10 ภายใน VMware เครื่อง RAM 2GB "แบบกายภาพ" จะแสดงผลรวม 2010 MB ในfreeเครื่อง 4GB มีขนาด 3948 MB
จอห์น

1
ขอบคุณ ... แปลกที่ฉันเห็นความแตกต่างขนาดใหญ่ในตัวฉัน แต่ดูเหมือนว่าจะเป็น "ปกติ"
Mike B

2
ไม่นี่ไม่ใช่ "ปกติ" - มันคือ 800+ MB!
Michael Hampton

3

เส้นสำคัญจากแผนที่ RAM จริงของคุณคือ:

 BIOS-e820: 0000000100000000 - 0000000140000000 (usable)

บรรทัดนี้แสดงให้เห็นว่า 1 GB (0x40000000 bytes, เลขฐานสิบหก) ของ RAM จริงของระบบของคุณถูกแมปโดย BIOS เหนือขีด จำกัด 4GB ทำให้ไม่สามารถเข้าถึงได้โดยระบบ 32 บิตโดยไม่มี PAE

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