“free”명령과“dmidecode”가 RAM에 대해 다른 값을 표시하는 이유는 무엇입니까?


9

VMWare 에서 CentOS 5.10 ( 32 비트 ) 서버를 실행하고 있습니다. 4GB의 RAM이 할당됩니다.

내가 실행하면 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않지만 4GB를 초과하는 메모리에만 필요하다고 생각했습니다 .

간단한 것을 놓치고 있다는 것을 알고 있습니다. 누군가가 자세히 설명해 주시겠습니까?

추가 사항 / 관찰

내 커널이 다른 것들을 위해 많은 메모리를 예약하고있는 것처럼 보입니다. 다음은 내가 보는 것입니다 /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 및 하드웨어를위한 충분한 공간이 있습니다. 또한 32 비트 프로그램을 실행하는 기능을 유지하면서 응용 프로그램의 2GB / 3GB 32 비트 제한을 해제합니다. 일반적으로 2GB 이상의 RAM이있는 시스템은 이러한 문제를 피하기 위해 64 비트 OS를 실행해야합니다.
  2. 다른 옵션은 PAE가 활성화 된 32 비트 커널을 실행하는 것입니다. 이렇게하면 RAM이 숨겨 지지만 커널 빌드의 특성에 따라 각 프로세스는 여전히 2GB / 3GB의 주소 공간으로 제한됩니다. 64 비트 OS는 32 비트 응용 프로그램을 완벽하게 실행하므로 업그레이드 경로 부족과 같은 장점과 단점이 없습니다.

감사. 그것은 의미가 있지만 하드웨어를 통해 다른 목적으로 "숨겨진"/ 소비량을 구체적으로 어떻게 확인할 수 있습니까? 그 밑에 /proc/meminfo있을까요?
Mike B

@MikeB 특히, 약 800MB가 손실되는 것은 분명하지만 확실하지 않습니다.
Michael Hampton

내 첫 질문의 목적 상, 나는 대답을했다고 생각하지만 다음 질문은 "WHY?"입니다. 이것 ( 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
그것은 몇 가지 다른 작은 비트가 아닙니다 ...
Michael Hampton

글쎄, 아니, 문자 그대로 8 비트 바이트와 같은 비트는 아니지만 최대 수십 MB에 불과합니다. 백분율 측면에서는 매우 작습니다.
John

예를 들어 VMware 내에서 RHEL 5.10을 실행하는 2 개의 64 비트 시스템에서 2GB "물리적"RAM 시스템의 총 크기 free는 2010MB이고 4GB 시스템의 경우 3948MB입니다.
John

1
고마워 ... 내 이상한 큰 불일치를보고 있지만 이상한 것은 "정상"일 수 있습니다.
Mike B

2
아니요, 이것은 "정상적인"것이 아닙니다-800MB 이상입니다!
Michael Hampton

3

실제 RAM 맵의 중요한 라인은 다음과 같습니다.

 BIOS-e820: 0000000100000000 - 0000000140000000 (usable)

이 줄은 시스템의 실제 RAM 중 1GB (0x40000000 바이트, 16 진수)가 4GB 제한을 초과하는 BIOS에 의해 매핑되어 PAE가없는 32 비트 시스템에서 액세스 할 수 없음을 나타냅니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.