[英]How can I find out the total physical memory (RAM) of my linux box suitable to be parsed by a shell script?
我正在鍵入一個 shell 腳本來找出某些 RHEL linux 機器中的總物理內存。
首先我想強調的是,我對內核識別的總物理內存感興趣,而不僅僅是可用內存。 因此,請避免建議閱讀/proc/meminfo或使用free 、 top或sar命令的答案——在所有這些情況下,它們的“總內存”值意味着“可用內存”值。
第一個想法是閱讀引導內核消息:
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 PAGES PAGESIZE 4096 _AVPHYS_PAGES 1049978 _PHYS_PAGES 15466409
我的問題:有沒有另一種方法可以獲得物理內存總量,適合由shell腳本解析?
你試過cat /proc/meminfo
嗎? 然后,您可以使用awk或grep找出您想要的內容,例如MemTotal
awk '/MemTotal/ {print $2}' /proc/meminfo
或
cat /proc/meminfo | grep MemTotal
如果您對物理 RAM 感興趣,請使用命令dmidecode
。 它給你的不僅僅是一個更多的信息,但根據您的使用情況下,你可能也想知道,如果8G系統來自2x4GB棒或4x2GB棒。
cat /proc/meminfo | grep MemTotal
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。
另一個有用的命令:
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/
free -h | awk '/Mem\:/ { print $2 }'
這將以人類可讀的格式為您提供系統中的總內存,並自動縮放到適當的單位(例如字節、KB、MB 或 GB)。
dmidecode -t 17 | grep Size:
添加“大小:”之后顯示的所有上述值將給出服務器中所有 RAM 棒的確切總物理大小。
總在線內存
使用 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
內存塊中的字節數(十六進制值)。 在值前使用 0x 可確保在計算過程中正確處理。
/sys/devices/system/memory/memory*
迭代所有可用內存塊以驗證它們是否在線,如果它們在線,則將計算出的塊大小添加到 totalmem 中。
[["$(cat ${mem}/online)" == "1" ]] &&
如果您更喜歡另一種記憶狀態,您可以更改或刪除它。
以Mb
總內存:
x=$(awk '/MemTotal/ {print $2}' /proc/meminfo)
echo $((x/1024))
或:
x=$(awk '/MemTotal/ {print $2}' /proc/meminfo) ; echo $((x/1024))
在 Linux Kernel 中,當前頁是內核可以看到的 RAM 物理頁。 從字面上看,當前頁面是以 4KB 為單位的 RAM 總大小。
grep present /proc/zoneinfo | awk '{sum+=$2}END{print sum*4,"KB"}'
'MemTotal' 形式 /proc/meminfo 是伙伴系統管理的內存總大小。我們也可以這樣計算:
grep managed /proc/zoneinfo | awk '{sum+=$2}END{print sum*4,"KB"}'
這些是方法:
1. /proc/meminfo
MemTotal: 8152200 kB
MemFree: 760808 kB
您可以編寫代碼或腳本來解析它。
2. 使用以下宏來使用 sysconf
系統配置(_SC_PHYS_PAGES)* 系統配置(_SC_PAGESIZE);
3. 通過使用 sysinfo 系統調用
int sysinfo(struct sysinfo *info);
結構系統信息{。
.
unsigned long totalram; /*Total memory size to use */
unsigned long freeram; /* Available memory size*/
.
.
};
我知道很久以前就有人問過這個問題,但我想提供另一種方法來做到這一點,我發現它對我剛剛解決的問題很有用:
lshw -c memory
lshw 是一個提取機器硬件配置詳細信息的小工具。 它可以在支持 DMI 的 x86 或 IA-64 系統和某些 PowerPC 機器(已知 PowerMac G4 可以工作)上報告確切的內存配置、固件版本、主板配置、CPU 版本和速度、緩存配置、總線速度等。
我發現htop
是一個有用的工具。
sudo apt-get install htop
然后
自由 -m
將提供您需要的信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.