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


123

シェルスクリプトを入力して、一部のRHEL linuxボックスの合計物理メモリを調べています。

まず最初に、利用可能なメモリだけでなく、カーネルによって認識される物理メモリ全体に関心があることを強調しておきます。したがって、/ proc / meminfoを読んだり、freetop、またはsarコマンドを使用したりすることを示唆する回答は避けてください。これらのすべてのケースで、「合計メモリ」の値は「使用可能なメモリ」の値を意味します。

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

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

しかし、一部のLinuxボックスでは、カーネルの起動時にEMC2のPowerPathソフトウェアとそのフラッディングブートメッセージが使用されているため、/ var / log / dmesgファイルにさえも、その有用なブートカーネルメッセージは利用できません。

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

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

#getconf -a | grep PAGES
PAGESIZE 4096
_AVPHYS_PAGES 1049978
_PHYS_PAGES 15466409

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


3
これはLinuxとUNIXに移行する必要があります
Kolob Canyon

回答:


56

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


19
最近これが必要になり、システム上のすべてのメモリモジュールの合計メモリサイズを取得する簡単なコマンドがあります。dmidecode -t 17 | grep "サイズ。* MB" | awk '{s + = $ 2} END {print s / 1024}'
Jonesinator

6
他の回答とは異なりdmidecodeにはroot権限が必要です。
chus

1
それは私にこのエラーを与えます#dmidecode 3.0 / sys / firmware / dmi / tables / smbios_entry_point:許可はエントリポイントの/ dev / memのスキャンを拒否しました。/ dev / mem:アクセスが拒否されました
VVB '13

128

試しましたcat /proc/meminfoか?その後、することができますawkのgrep検索したいものを、MemTotal例えば

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

または

cat /proc/meminfo | grep MemTotal

8
ただし、MemTotalは物理メモリの合計ではありません。proc(5)のマニュアルページを参照してください
Chris Stratton、

2
@ChrisStratton:もっと明確にできますか?ほとんどの実用的な意図と目的のために、この答えで十分かもしれません。
Dan Dascalescu 2014

13
awk '/MemTotal/ {print $2}' /proc/meminfo パイプは少ないほど良いです。
masta 2015年

3
非常に説得力のある代替案:可能な場合はawkを避けてください。Regex / PCREは、より普遍的なパターンマッチング言語です(つまり、PythonまたはPerlでも使用できます)。awkを学ぶなら、あなたはすでにawkしかありません。一方、grep + PCREを傾けた場合 grep -oP '^MemTotal:\s+\K.*' /proc/meminfo
Gabriel Totusek

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レポートを備えた私の物理的な箱ではMemTotal: 3957032 kB、それは4GBにはかなり足りません。OP(および私)は、4 GBを報告するものを探しています。
TvE

1
これを行うためのより直接的な方法は、次のgrep MemTotal /proc/meminfo
とおり

3
@TvE 3957032 kBは誤ってラベル付けされています。この投稿で示されているように、kiBというラベルを付ける必要があります。つまり、実際に報告しているのは4,052,000,768バイトで、4 GBをわずかに上回っています。これは、/ proc / meminfo実装がkiB表記よりも古くなっているためです。
ジェフG

4
@JeffG ToolmakerSteveが言っていたポイントを逃したと思います。期待値は4GBではなく4GiBであり、TvEは単に値を誤って引用しています。ToolmakerSteveは、TvEのコメントで "4 GB"のRAMを "4 GiB"として解釈する必要があることは正しいので、これが比較対象の値です。値が4 GBより大きく、2 GBと2 GiBより大きく、6 GBと6 GiBより小さいのと同じですが、ここで重要なのは、4 GBとどのように比較するかです。だから、はい、あなたの発言は正しいですが、それも無関係です。
ティム

1
@Tim質問に答えた、裏付けとなるドキュメントとともに、事実上正確な情報のみを提供しました。/proc/meminfo@TvEが別の質問をするつもりであったかどうかに関係なく、簡単な検索以上の検索が行われたことを考えると、kiBで数値を報告するという事実は、この議論の非常に重要な部分だと思います。
ジェフG

19

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

例:

DirectMap4k:       10240 kB
DirectMap2M:     4184064 kB

10240 + 4184064 = 4194304 kB = 4096 MB。


3
rootを必要とするdmidecodeを使用する以外は、ここでのベストアンサー ただし、DirectMapは常に正確であるとは限りません。私は4ギガバイトでサーバを持っており、それは言う: `DirectMap4k:110200キロバイトDirectMap2M:それは4007メガバイト、4096メガバイトではない...だ` 3993600キロバイト
TVE

注:TvEのOSが1024バイト単位でレポートしている場合でも、TvEの合計4103800 x 1024は4 GiB(4194304 x 1024)に達しません。
ToolmakerSteve

また、Linuxのすべてのバージョンで使用できるわけではありません。私のCentos5ボックス(はい、知っています)はこれを報告しません。
トムクアレンドン2017年

参考までに、これらはx86にのみ存在します。これが機能する理由は、これらのエントリがTLBの4k、2M、1Gページで表されるメモリの量をカウントするためです。これは、カーネルがアクセスできるすべてのメモリをカバーする必要があります
kevmitch 2017

1
更新:同じマシンで異なるカーネルバージョン(linux-3.18.28、linux-4.13-rc6)間を移動すると、この合計はわずかに異なります。
kevmitch 2017

17

もう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/


1
メガバイト単位の出力で見やすくしたい場合、これは素晴らしいシンプルなソリューションですvmstat -s -S M | grep ' memory'
Oliver Dungey

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

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"]] &&

別のメモリ状態が必要な場合は、これを変更または削除できます。


できるだけ早く解決策を確認します。
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*/

   .

   . 

  }; 

cat / proc / meminfoは組み込みシステムで動作します
webbertiger

-7

htop便利なツールを見つけました。

sudo apt-get install htop

その後

無料-m

必要な情報を提供します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.