web-dev-qa-db-ja.com

シェルスクリプトで解析するのに適したLinuxボックスの総物理メモリ(RAM)を確認するにはどうすればよいですか。

私はいくつかのRHEL Linuxボックスで総物理メモリを見つけるためにシェルスクリプトをタイプしています。

まず最初に、 利用可能なメモリ だけでなく、カーネルによって認識される 合計物理メモリ に興味があることを強調したいと思います。したがって、 /proc/meminfo を読むこと、または free top または sar を使用することを提案する回答は避けてください。これらすべての場合、それらの " 総メモリ "の値は " 利用可能なメモリ "の値を意味します。

最初の考えはブートカーネルメッセージを読むことでした:

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

しかし、Linuxの箱の中には、EMC2のPowerPathソフトウェアとそのカーネル起動時の flooding bootメッセージのために、 /var/logの中でさえも、役に立つ起動カーネルメッセージが利用できないものがあります。/dmesg file.

2番目のオプションは、 dmidecode コマンドです(古いカーネルの制限のために、カーネル認識RAMと実際のRAMが一致しない可能性があることに警告します。アーキテクチャ)。 --memory オプションはスクリプトを単純化しますが、そのコマンドの古いリリースには --memory オプションがないことに気付きました。

私の最後のチャンスは getconf コマンドでした。メモリページサイズは報告されますが、物理ページの総数は報告されません - _PHYS_PAGES システム変数は、合計物理ページではなく、使用可能な物理ページのようです。

#getconf -a | grep PAGES 
 PAGESIZE 4096 
 _ AVPHYS_PAGES 1049978 
 _ PHYS_PAGES 15466409 

私の質問:シェルスクリプトで解析するのに適した、物理メモリの総量を取得する別の方法はありますか。

108
Jdamian

物理RAMに興味があるなら、コマンドdmidecodeを使ってください。それはあなたにlotより多くの情報を与えますが、あなたのユースケースに応じて、あなたはシステムの8Gが2x4GBスティックか4x2GBスティックから来ているかどうかも知りたいかもしれません。

48
user3070163

cat /proc/meminfoを試しましたか?その後、あなたが欲しいものを手に入れることができますMemTotal例えば.

更新された例(ところでありがとう、Masta):

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

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"}'
48
Cyril

/proc/meminfoの最後の2つのエントリを追加すると、ホスト上に存在する正確なメモリがわかります。

例:

DirectMap4k:       10240 kB
DirectMap2M:     4184064 kB

10240 + 4184064 = 4194304 kB = 4096 MB。

15
Sandip

もう1つ便利なコマンド:
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

メモリ情報を取得するためのもう1つの便利なコマンドは次のとおりです。
free
出力例は次のとおりです。

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

ここでの1つの観察は、コマンドfreeがスワップ空間に関する情報も提供するということです。
次のリンクが役に立つ場合があります。
http://www.linuxnix.com/find-ram-details-in-linuxunix/

15
Yogesh Jilhawar
free -h | awk '/Mem\:/ { print $2 }' 

これにより、システム内の全メモリが判読可能な形式で表示され、適切な単位(バイト、KB、MB、GBなど)に自動的に調整されます。

11
JayEek
dmidecode -t 17 | grep  Size:

"Size:"の後に表示されている上記の値をすべて足し合わせると、サーバー内のすべてのRAMスティックの正確な合計物理サイズがわかります。

6
Raghu Ni

Mb内の合計メモリ:

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

または

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

これらは方法です:

1./proc/meminfo

MemTotal: 8152200 kB

MemFree: 760808 kB

それを解析するためのコードやスクリプトを書くことができます。

2.下のマクロを使ってsysconfを使う

sysconf(_SC_PHYS_PAGES)* sysconf(_SC_PAGESIZE);

。sysinfoシステムコールを使用して

int sysinfo(sysinfo * info);

struct sysinfo {。

   .

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

   unsigned long freeram;   /* Available memory size*/

   .

   . 

  }; 
1
Sandeep_black

総オンラインメモリ

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

4 GBシステムの出力例

4294967296 bytes
4 GB

説明

/ sys/devices/system/memory/block_size_bytes

メモリブロックのバイト数(16進値)。値の前に0xを使用すると、計算中に確実に正しく処理されます。

/ sys/devices/system/memory/memory *

利用可能なすべてのメモリブロックを繰り返してオンラインになっていることを確認し、計算されたブロックサイズをtotalmemに追加します。

[["" $(cat $ {mem}/online) "==" 1 "]] &&

他のメモリ状態を好む場合は、これを変更または削除できます。

0
André