쉘 스크립트로 구문 분석하기에 적합한 Linux 박스의 총 물리적 메모리 (RAM)를 어떻게 찾을 수 있습니까?


123

일부 RHEL Linux 상자에서 총 실제 메모리를 찾기 위해 쉘 스크립트를 입력하고 있습니다.

우선 사용 가능한 메모리 뿐만 아니라 커널이 인식 하는 총 물리적 메모리에 관심이 있음을 강조하고 싶습니다 . 따라서 / proc / meminfo 를 읽 거나 free , top 또는 sar 명령 을 사용 하라는 답변은 피하십시오 .이 모든 경우에 " total memory "값은 " available memory " 값을 의미 합니다.

첫 번째 생각은 부트 커널 메시지를 읽는 것이 었습니다.

Memory: 61861540k/63438844k available (2577k kernel code, 1042516k reserved, 1305k data, 212k init)

그러나 일부 Linux 제품에서는 EMC2의 PowerPath 소프트웨어를 사용 하고 커널 시작시 플러딩 부팅 메시지를 사용하기 때문에 유용한 부팅 커널 메시지를 사용할 수 없으며 / var / log / dmesg 파일 에서도 사용할 수 없습니다 .

두 번째 옵션은 dmidecode 명령 이었습니다 (일부 오래된 커널 및 아키텍처의 제한으로 인해 커널 인식 RAM과 실제 RAM의 불일치 가능성에 대해 경고합니다). --memory 옵션 은 스크립트를 단순화하지만 해당 명령의 이전 릴리스에는 --memory 옵션 이 없다는 것을 깨달았습니다 .

마지막 기회는 getconf 명령이었습니다. 메모리 페이지 크기를보고하지만 실제 페이지의 총 수는보고하지 않습니다. _PHYS_PAGES 시스템 변수는 총 실제 페이지가 아니라 사용 가능한 실제 페이지 인 것 같습니다.

# getconf -a | grep 페이지
페이지 크기 4096
_AVPHYS_PAGES 1049978
_PHYS_PAGES 15466409

내 질문 : 셸 스크립트로 구문 분석하기에 적합한 실제 메모리의 총량을 얻는 다른 방법이 있습니까?


3
이것은 리눅스 및 유닉스로 마이그레이션해야
계산법 캐년

답변:


56

실제 RAM에 관심이 있다면 명령을 사용하십시오 dmidecode. 그것은 당신에게주는 많은 단지보다 더 많은 정보를하지만, 사용 사례에 따라, 당신은 또한 시스템의 8 세대가 2x4GB 스틱 또는 4x2GB 스틱에서 온 알고 할 수 있습니다.


19
최근에 이것이 필요했고, 시스템에있는 모든 메모리 모듈의 총 메모리 크기를 가져 오는 간단한 명령이 있습니다. dmidecode -t 17 | grep "크기. * MB"| awk '{s + = $ 2} END {print s / 1024}'
Jonesinator


1
# dmidecode 3.0 / sys / firmware / dmi / tables / smbios_entry_point : Permission denied Scanning / dev / mem for entry point. / dev / mem : 권한이 거부 됨
VVB

128

시도해 보셨습니까 cat /proc/meminfo? 그런 다음 원하는 것을 awk 또는 grep 할 수 있습니다. 예를 들어 MemTotal

awk '/MemTotal/ {print $2}' /proc/meminfo

또는

cat /proc/meminfo | grep MemTotal

8
그러나 MemTotal은 총 물리적 메모리가 아닙니다. proc (5)에 대한 man 페이지를 참조하십시오
Chris Stratton

2
@ChrisStratton : 좀 더 명시적일 수 있나요? 대부분의 실제적인 의도와 목적을 위해이 답변으로 충분할 수 있습니다.
Dan Dascalescu 2014

13
awk '/MemTotal/ {print $2}' /proc/meminfo 파이프가 적을수록 좋습니다.
masta 2015.06.26

3
매우 독단적 인 대안 : 가능하면 어색함을 피하십시오. Regex / PCRE는 훨씬 더 보편적 인 패턴 일치 언어입니다 (즉, Python 또는 Perl에서도 사용할 수 있습니다). awk를 배우면 이미 awk뿐입니다. 반면에 grep + PCRE를 기울이면 ... grep -oP '^MemTotal:\s+\K.*' /proc/meminfo
Gabriel

5
또한 반대보기가 @GabrielBurkholder : awkPOSIX에 의해 표준화되어 있지만 grep'의 옵션 -o-P하지 않습니다! 귀하의 예제는 GNU에서 잘 작동 grep하지만 (GNU는 여전히 PCRE 구현이 실험적이라고 말합니다) 다른 구현에서는 작동하지 않을 것입니다.
pabouk

48

cat /proc/meminfo | grep MemTotal또는 free는 서버에있는 정확한 RAM 양을 제공합니다. 이것은 "사용 가능한 메모리"가 아닙니다.

VM이 있고 하이퍼 바이저가 호스팅하는 전체 메모리 양을 계산하고 싶지만이 경우 하이퍼 바이저에 로그인해야 할 때 문제가 발생한다고 생각합니다.

cat /proc/meminfo | grep MemTotal

다음과 같다

 getconf -a | grep PAGES | awk 'BEGIN {total = 1} {if (NR == 1 || NR == 3) total *=$NF} END {print total / 1024" kB"}'

5
4GB 메모리 cat /proc/meminfo | grep MemTotal보고서가있는 물리적 상자에서는 4GB에 MemTotal: 3957032 kB비해 상당히 부족합니다. OP (및 I)는 4GB를보고 할 무언가를 찾고 있습니다.
TvE 2015 년

1
이 일을 더 직접적인 방법은있다grep MemTotal /proc/meminfo
댄 Passaro

3
@TvE 3957032 kB는 레이블이 잘못 지정되었습니다. 이 게시물 에 표시된대로 kiB로 표시되어야합니다 . 이는 실제로 4,052,000,768 바이트를보고하고 있으며 이는 4GB보다 약간 큽니다. 이는 / proc / meminfo 구현이 kiB 표기법보다 이전 버전이기 때문입니다.
Jeff G

4
@JeffG ToolmakerSteve가 만든 요점을 놓친 것 같습니다. 예상 값은 4GB가 아닌 4GiB이며 TvE는 단순히 값을 잘못 인용 한 것입니다. ToolmakerSteve는 "4GB"의 RAM이 TvE의 의견에서 "4GiB"로 해석되어야한다고 옳았습니다. 따라서 이것이 우리가 비교하는 값입니다. 값이 2GB 및 2GiB보다 크고 6GB 및 6GiB보다 작은 것처럼 값이 4GB보다 크다는 것이 맞습니다. 그러나 여기서 중요한 것은 4GiB와 비교하는 방법이므로 다른 측정 값과 비교하는 방법은 누가 신경 쓰나요? 예, 귀하의 진술은 정확하지만 관련성이 없습니다.
Tim

1
@Tim 나는 질문에 답한 증빙 문서와 함께 사실적으로 정확한 정보만을 제공했습니다. 찾는 데 사소한 검색 이상이 필요하다는 점을 감안할 때 /proc/meminfo@TvE가 다른 질문을 의도했는지 여부에 관계없이 kiB로 숫자 를 보고하는 것이이 토론에서 매우 중요한 부분 이라고 생각합니다 .
Jeff G

19

의 마지막 2 개 항목을 추가하면 /proc/meminfo호스트에있는 정확한 메모리를 제공합니다.

예:

DirectMap4k:       10240 kB
DirectMap2M:     4184064 kB

10240 + 4184064 = 4194304kB = 4096MB.


3
루트가 필요한 dmidecode를 사용하는 것 외에 여기에서 가장 좋은 대답입니다. 그러나 DirectMap이 항상 정확한 것은 아닙니다. 4GB의 서버가 있는데 다음과 같이 표시됩니다.`DirectMap4k : 110200 kB DirectMap2M : 3993600 kB`그건 4096MB가 아닌
4007MB입니다

참고 : TvE의 OS가 1024 바이트 단위로보고하더라도 총 4103800 x 1024는 4GiB (4194304 x 1024)에 미치지 못합니다.
ToolmakerSteve

또한 모든 버전의 Linux에서 사용할 수있는 것은 아닙니다. 내 Centos5 상자 (예, 압니다)가 이것을보고하지 않습니다.
Tom Quarendon

기록을 위해 이들은 x86에만 존재합니다. 이것이 작동하는 이유는 이러한 항목 이 커널에서 액세스 할 수있는 모든 메모리를 포함 해야하는 TLB의 4k, 2M, 1G 페이지로 표시되는 메모리 양을 계산하기 때문 입니다.
kevmitch

1
업데이트 :이 합계는 동일한 시스템에서 다른 커널 버전 (linux-3.18.28, linux-4.13-rc6)간에 이동할 때 약간 씩 다릅니다.
kevmitch

17

또 하나의 유용한 명령 :
vmstat -s | grep memory
내 컴퓨터의 샘플 출력은 다음과 같습니다.

  2050060 K total memory
  1092992 K used memory
   743072 K active memory
   177084 K inactive memory
   957068 K free memory
   385388 K buffer memory

메모리 정보를 얻는 또 다른 유용한 명령은 다음과 같습니다.
free
샘플 출력은 다음과 같습니다.

             total       used       free     shared    buffers     cached
Mem:       2050060    1093324     956736        108     385392     386812
-/+ buffers/cache:     321120    1728940
Swap:      2095100       2732    2092368

여기서 한 가지 관찰은 명령 free이 스왑 공간에 대한 정보도 제공 한다는 것 입니다.
다음 링크가 유용 할 수 있습니다.
http://www.linuxnix.com/find-ram-details-in-linuxunix/


1
당신이 메가 바이트에 출력이 눈에 쉽게하려는 경우, 멋진 간단 솔루션입니다vmstat -s -S M | grep ' memory'
올리버 던 제이

17
free -h | awk '/Mem\:/ { print $2 }' 

이렇게하면 사람이 읽을 수있는 형식으로 시스템의 총 메모리가 제공되고 적절한 단위 (예 : 바이트, KB, MB 또는 GB)로 자동 확장됩니다.


내가 찾던 바로 그것!
Tomas Gonzalez

10
dmidecode -t 17 | grep  Size:

"크기 :"뒤에 표시된 모든 값을 추가하면 서버에있는 모든 RAM 스틱의 정확한 총 물리적 크기가 제공됩니다.


2

총 온라인 메모리

sys-fs를 사용하여 총 온라인 메모리를 계산합니다.

totalmem=0;
for mem in /sys/devices/system/memory/memory*; do
  [[ "$(cat ${mem}/online)" == "1" ]] \
    && totalmem=$((totalmem+$((0x$(cat /sys/devices/system/memory/block_size_bytes)))));
done

#one-line code
totalmem=0; for mem in /sys/devices/system/memory/memory*; do [[ "$(cat ${mem}/online)" == "1" ]] && totalmem=$((totalmem+$((0x$(cat /sys/devices/system/memory/block_size_bytes))))); done

echo ${totalmem} bytes
echo $((totalmem/1024**3)) GB

4GB 시스템의 출력 예 :

4294967296 bytes
4 GB

설명

/ sys / devices / system / memory / block_size_bytes

메모리 블록의 바이트 수 (16 진수 값). 값 앞에 0x를 사용하면 계산 중에 제대로 처리되는지 확인할 수 있습니다.

/ sys / devices / system / memory / memory *

사용 가능한 모든 메모리 블록을 반복하여 온라인 상태인지 확인하고 계산 된 블록 크기를 totalmem에 추가합니다.

[[ "$ (고양이 $ {mem} / 온라인)"== "1"]] &&

다른 메모리 상태를 선호하는 경우이를 변경하거나 제거 할 수 있습니다.


최대한 빨리 해결책을 확인하겠습니다.
Jdamian 2018

bash 팁 : 코드 \에서 다음 줄에서 계속 하기 위해 슬래시 문자 ( ) 를 사용할 필요가 없습니다. 실제로 &&해당 목적을 위해 줄 끝에를 사용할 수 있습니다 .
Jdamian

1

총 메모리 Mb:

x=$(awk '/MemTotal/ {print $2}' /proc/meminfo)
echo $((x/1024))

또는:

x=$(awk '/MemTotal/ {print $2}' /proc/meminfo) ; echo $((x/1024))

0

방법은 다음과 같습니다.

1. / proc / meminfo

MemTotal: 8152200 kB

MemFree: 760808 kB

코드 나 스크립트를 작성하여 구문 분석 할 수 있습니다.

2. 아래 매크로를 사용하여 sysconf를 사용하십시오.

sysconf (_SC_PHYS_PAGES) * sysconf (_SC_PAGESIZE);

3. sysinfo 시스템 호출 사용

int sysinfo (struct sysinfo * info);

struct sysinfo {.

   .

   unsigned long totalram;  /*Total memory size to use */

   unsigned long freeram;   /* Available memory size*/

   .

   . 

  }; 

내 임베디드 시스템에 나를 위해 고양이 / proc 디렉토리 / meminfo 파일 작품
webbertiger

-7

htop유용한 도구를 찾았 습니다.

sudo apt-get 설치 htop

그리고

무료 -m

필요한 정보를 제공합니다.

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