私はいくつかの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
私の質問:シェルスクリプトで解析するのに適した、物理メモリの総量を取得する別の方法はありますか。
物理RAMに興味があるなら、コマンドdmidecode
を使ってください。それはあなたにlotより多くの情報を与えますが、あなたのユースケースに応じて、あなたはシステムの8Gが2x4GBスティックか4x2GBスティックから来ているかどうかも知りたいかもしれません。
cat /proc/meminfo
を試しましたか?その後、あなたが欲しいものを手に入れることができますMemTotal例えば.
更新された例(ところでありがとう、Masta):
awk '/MemTotal/ {print $2}' /proc/meminfo
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"}'
/proc/meminfo
の最後の2つのエントリを追加すると、ホスト上に存在する正確なメモリがわかります。
例:
DirectMap4k: 10240 kB
DirectMap2M: 4184064 kB
10240 + 4184064 = 4194304 kB = 4096 MB。
もう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/
free -h | awk '/Mem\:/ { print $2 }'
これにより、システム内の全メモリが判読可能な形式で表示され、適切な単位(バイト、KB、MB、GBなど)に自動的に調整されます。
dmidecode -t 17 | grep Size:
"Size:"の後に表示されている上記の値をすべて足し合わせると、サーバー内のすべてのRAMスティックの正確な合計物理サイズがわかります。
Mb
内の合計メモリ:
x=$(awk '/MemTotal/ {print $2}' /proc/meminfo)
echo $((x/1024))
または
x=$(awk '/MemTotal/ {print $2}' /proc/meminfo) ; echo $((x/1024))
これらは方法です:
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*/
.
.
};
総オンラインメモリ
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 "]] &&
他のメモリ状態を好む場合は、これを変更または削除できます。