Tại sao lệnh miễn phí và các dmidecode trực tiếp trên các kênh khác nhau hiển thị các giá trị khác nhau cho RAM?


9

Tôi đã có một máy chủ CentOS 5.10 ( 32 bit ) đang chạy trên VMWare. Nó được phân bổ 4 GB RAM.

Nếu tôi chạy dmidecode -t 17 | grep Size | grep MBtôi thấy:

Size: 4096 MB

Khi tôi chạy free, tôi thấy:

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

Tại sao có sự khác biệt giữa tổng số lượng freebáo cáo bộ nhớ và dmidecodeđầu ra?

Hạt nhân tôi đang chạy là:

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

Phải thừa nhận rằng kernel không chạy PAEnhưng tôi nghĩ rằng nó chỉ cần thiết cho bộ nhớ vượt quá 4 GB.

Tôi biết tôi đang thiếu một cái gì đó đơn giản - ai đó có thể vui lòng giải thích không?

Ghi chú / Quan sát bổ sung

Có vẻ như kernel của tôi đang dành một loạt bộ nhớ cho những thứ khác. Đây là những gì tôi thấy trong /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

Câu trả lời:


18

Với kernel 32 bit, bạn chỉ có 4GB không gian địa chỉ khả dụng . Một số không gian địa chỉ này phải được sử dụng bởi phần cứng (ảo hoặc vật lý) trong hệ thống, chẳng hạn như thẻ video, NIC, v.v., cho mục đích riêng của chúng. Việc sử dụng này thường nằm trong khoảng 256MB-1GB tùy thuộc vào dung lượng địa chỉ cụ thể cần bao nhiêu.

Do không gian địa chỉ đó được sử dụng bởi phần cứng, RAM tương ứng thường không thể truy cập được vào hệ thống 32 bit.

Bạn có một cặp đôi tùy chọn:

  1. Tùy chọn ưa thích là chạy hệ điều hành 64 bit. Điều này mở rộng đáng kể không gian địa chỉ, vì vậy có rất nhiều chỗ cho tất cả RAM và phần cứng. Nó cũng phá vỡ giới hạn 32 bit 2GB / 3GB trên các ứng dụng trong khi vẫn duy trì khả năng chạy các chương trình 32 bit. Nói chung, bất kỳ hệ thống nào có thêm 2GB RAM nên chạy HĐH 64 bit để tránh những vấn đề này.
  2. Một tùy chọn khác là chạy kernel 32 bit có bật PAE. Điều này sẽ bỏ ẩn RAM, nhưng mỗi quá trình vẫn sẽ bị giới hạn ở 2GB / 3GB không gian địa chỉ, tùy thuộc vào chi tiết của việc xây dựng kernel. Do HĐH 64 bit sẽ chạy các ứng dụng 32 bit hoàn toàn tốt, điều này không có ưu điểm và nhiều nhược điểm (chẳng hạn như thiếu đường dẫn nâng cấp).

Cảm ơn. Điều đó có ý nghĩa nhưng làm thế nào tôi có thể kiểm tra cụ thể bao nhiêu phần "bị ẩn" / tiêu thụ bởi phần cứng cho các mục đích khác? Điều đó sẽ được dưới /proc/meminfo?
Mike B

@MikeB Cụ thể, tôi không chắc chắn, mặc dù rõ ràng là mất khoảng 800 MB.
Michael Hampton

Với mục đích của câu hỏi ban đầu của tôi, tôi nghĩ rằng nó đã được trả lời nhưng câu hỏi tiếp theo là "TẠI SAO?". Có vẻ như có một chủ đề khác bao gồm điều này ( unix.stackexchange.com/questions/97261/ mẹo ) vì vậy tôi sẽ thử đào thêm một số và có thể có câu hỏi sau. Cảm ơn!
Mike B

Là quản trị viên hệ thống chuyên nghiệp, chúng tôi quan tâm đến vấn đề này, nhưng chỉ đến một điểm - nơi và ảnh hưởng của nó đến hoạt động. Tôi nghĩ rằng tôi đã giải quyết khía cạnh đó.
Michael Hampton

2
@MikeB /proc/iomemsẽ hiển thị cho bạn bộ nhớ được sử dụng bởi các thiết bị nơi Linux có trình điều khiển. Bản đồ bộ nhớ e820 (ở phần đầu của một dmesghạt nhân mới được khởi động) sẽ cho bạn thấy BIOS / EFI của bạn nghĩ khu vực nào được bảo lưu. Kết hợp chúng với nhau là AFAIK một tác vụ thủ công không có công cụ hỗ trợ.
mihi

5

Đầu ra của freelệnh không tính bộ nhớ kernel dành riêng và một vài bit nhỏ khác. Bạn sẽ thấy sự khác biệt này ngay cả trong nhân 64 bit và ngay cả với <2GB RAM.


2
Đó không chỉ là một vài bit nhỏ khác ...
Michael Hampton

Chà, không, không phải là bit theo nghĩa đen như trong 8 bit-make-a-byte ... nhưng nó chỉ có vài chục MB. Tỷ lệ phần trăm khôn ngoan, nó rất nhỏ.
Giăng

Ví dụ, trong hai hệ thống 64 bit chạy RHEL 5.10 bên trong VMware, máy RAM "vật lý" 2GB hiển thị tổng cộng 2010 MB free, một máy 4GB hiển thị 3948 MB.
Giăng

1
Cảm ơn ... thật lạ khi tôi thấy sự khác biệt lớn như vậy trong tôi nhưng nghe có vẻ như đó là "bình thường".
Mike B

2
Không, đây không phải là "bình thường" - nó hơn 800 MB!
Michael Hampton

3

Dòng quan trọng từ bản đồ RAM vật lý của bạn là dòng này:

 BIOS-e820: 0000000100000000 - 0000000140000000 (usable)

Dòng này cho thấy rằng 1 GB (0x40000000 byte, thập lục phân) của RAM vật lý của hệ thống của bạn đang được BIOS ánh xạ trên giới hạn 4GB, khiến hệ thống 32 bit không thể truy cập được mà không có PAE.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.