如何在Linux系統(tǒng)中判斷安裝、使用了多少內(nèi)存
在 Linux 系統(tǒng)中有很多種方法獲取有關(guān)安裝了多少內(nèi)存的信息及查看多少內(nèi)存正在被使用。有些命令提供了大量的細(xì)節(jié),而其他命令提供了簡(jiǎn)潔但不一定易于理解的答案。在這篇文章中,我們將介紹一些查看內(nèi)存及其使用狀態(tài)的有用的工具。
在我們開(kāi)始之前,讓我們先來(lái)回顧一些基礎(chǔ)知識(shí)。物理內(nèi)存和虛擬內(nèi)存并不是一回事。后者包括配置為交換空間的磁盤空間。交換空間可能包括為此目的特意留出來(lái)的分區(qū),以及在創(chuàng)建新的交換分區(qū)不可行時(shí)創(chuàng)建的用來(lái)增加可用交換空間的文件。有些 Linux 命令會(huì)提供關(guān)于兩者的信息。
當(dāng)物理內(nèi)存占滿時(shí),交換空間通過(guò)提供可以用來(lái)存放內(nèi)存中非活動(dòng)頁(yè)的磁盤空間來(lái)擴(kuò)展內(nèi)存。
/proc/kcore
是在內(nèi)存管理中起作用的一個(gè)文件。這個(gè)文件看上去是個(gè)普通文件(雖然非常大),但它并不占用任何空間。它就像其他 /proc
下的文件一樣是個(gè)虛擬文件。
$ ls -l /proc/kcore
-r--------. 1 root root 140737477881856 Jan 28 12:59 /proc/kcore
有趣的是,下面查詢的兩個(gè)系統(tǒng)并沒(méi)有安裝相同大小的內(nèi)存,但 /proc/kcore
的大小卻是相同的。頭個(gè)系統(tǒng)安裝了 4 GB 的內(nèi)存,而第二個(gè)系統(tǒng)安裝了 6 GB。
system1$ ls -l /proc/kcore
-r--------. 1 root root 140737477881856 Jan 28 12:59 /proc/kcore
system2$ ls -l /proc/kcore
-r-------- 1 root root 140737477881856 Feb 5 13:00 /proc/kcore
一種不靠譜的解釋說(shuō)這個(gè)文件代表可用虛擬內(nèi)存的大?。](méi)準(zhǔn)要加 4 KB),如果這樣,這些系統(tǒng)的虛擬內(nèi)存可就是 128TB 了!這個(gè)數(shù)字似乎代表了 64 位系統(tǒng)可以尋址多少內(nèi)存,而不是當(dāng)前系統(tǒng)有多少可用內(nèi)存。在命令行中計(jì)算 128 TB 和這個(gè)文件大小加上 4 KB 很容易。
$ expr 1024 \* 1024 \* 1024 \* 1024 \* 128
140737488355328
$ expr 1024 \* 1024 \* 1024 \* 1024 \* 128 + 4096
140737488359424
另一個(gè)用來(lái)檢查內(nèi)存的更人性化的命令是 free
。它會(huì)給出一個(gè)易于理解的內(nèi)存報(bào)告。
$ free
total used free shared buff/cache available
Mem: 6102476 812244 4090752 13112 1199480 4984140
Swap: 2097148 0 2097148
使用 -g
選項(xiàng),free
會(huì)以 GB 為單位返回結(jié)果。
$ free -g
total used free shared buff/cache available
Mem: 5 0 3 0 1 4
Swap: 1 0 1
使用 -t
選項(xiàng),free
會(huì)顯示與無(wú)附加選項(xiàng)時(shí)相同的值(不要把 -t
選項(xiàng)理解成 TB),并額外在輸出的底部添加一行總計(jì)數(shù)據(jù)。
$ free -t
total used free shared buff/cache available
Mem: 6102476 812408 4090612 13112 1199456 4983984
Swap: 2097148 0 2097148
Total: 8199624 812408 6187760
當(dāng)然,你也可以選擇同時(shí)使用兩個(gè)選項(xiàng)。
$ free -tg
total used free shared buff/cache available
Mem: 5 0 3 0 1 4
Swap: 1 0 1
Total: 7 0 5
如果你嘗試用這個(gè)報(bào)告來(lái)解釋“這個(gè)系統(tǒng)安裝了多少內(nèi)存?”,你可能會(huì)感到失望。上面的報(bào)告就是在前文說(shuō)的裝有 6 GB 內(nèi)存的系統(tǒng)上運(yùn)行的結(jié)果。這并不是說(shuō)這個(gè)結(jié)果是錯(cuò)的,這就是系統(tǒng)對(duì)其可使用的內(nèi)存的看法。
free
命令也提供了每隔 X 秒刷新顯示的選項(xiàng)(下方示例中 X 為 10)。
$ free -s 10
total used free shared buff/cache available
Mem: 6102476 812280 4090704 13112 1199492 4984108
Swap: 2097148 0 2097148
total used free shared buff/cache available
Mem: 6102476 812260 4090712 13112 1199504 4984120
Swap: 2097148 0 2097148
使用 -l
選項(xiàng),free
命令會(huì)提供高低內(nèi)存使用信息。
$ free -l
total used free shared buff/cache available
Mem: 6102476 812376 4090588 13112 1199512 4984000
Low: 6102476 2011888 4090588
High: 0 0 0
Swap: 2097148 0 2097148
查看內(nèi)存的另一個(gè)選擇是 /proc/meminfo
文件。像 /proc/kcore
一樣,這也是一個(gè)虛擬文件,它可以提供關(guān)于安裝或使用了多少內(nèi)存以及可用內(nèi)存的報(bào)告。顯然,空閑內(nèi)存和可用內(nèi)存并不是同一回事。MemFree
看起來(lái)代表未使用的 RAM。MemAvailable
則是對(duì)于啟動(dòng)新程序時(shí)可使用的內(nèi)存的一個(gè)估計(jì)。
$ head -3 /proc/meminfo
MemTotal: 6102476 kB
MemFree: 4090596 kB
MemAvailable: 4984040 kB
如果只想查看內(nèi)存總計(jì),可以使用下面的命令之一:
$ awk '/MemTotal/ {print $2}' /proc/meminfo
6102476
$ grep MemTotal /proc/meminfo
MemTotal: 6102476 kB
DirectMap
將內(nèi)存信息分為幾類。
$ grep DirectMap /proc/meminfo
DirectMap4k: 213568 kB
DirectMap2M: 6076416 kB
DirectMap4k
代表被映射成標(biāo)準(zhǔn) 4 k 頁(yè)的內(nèi)存大小,DirectMap2M
則顯示了被映射為 2 MB 的頁(yè)的內(nèi)存大小。
getconf
命令將會(huì)提供比我們大多數(shù)人想要看到的更多的信息。
$ getconf -a | more
LINK_MAX 65000
_POSIX_LINK_MAX 65000
MAX_CANON 255
_POSIX_MAX_CANON 255
MAX_INPUT 255
_POSIX_MAX_INPUT 255
NAME_MAX 255
_POSIX_NAME_MAX 255
PATH_MAX 4096
_POSIX_PATH_MAX 4096
PIPE_BUF 4096
_POSIX_PIPE_BUF 4096
SOCK_MAXBUF
_POSIX_ASYNC_IO
_POSIX_CHOWN_RESTRICTED 1
_POSIX_NO_TRUNC 1
_POSIX_PRIO_IO
_POSIX_SYNC_IO
_POSIX_VDISABLE 0
ARG_MAX 2097152
ATEXIT_MAX 2147483647
CHAR_BIT 8
CHAR_MAX 127
--More--
使用類似下面的命令來(lái)將其輸出精簡(jiǎn)為指定的內(nèi)容,你會(huì)得到跟前文提到的其他命令相同的結(jié)果。
$ getconf -a | grep PAGES | awk 'BEGIN {total = 1} {if (NR == 1 || NR == 3) total *=$NF} END {print total / 1024" kB"}'
6102476 kB
上面的命令通過(guò)將下方輸出的頭行和結(jié)尾一行的值相乘來(lái)計(jì)算內(nèi)存。
PAGESIZE 4096 <==
_AVPHYS_PAGES 1022511
_PHYS_PAGES 1525619 <==
自己動(dòng)手計(jì)算一下,我們就知道這個(gè)值是怎么來(lái)的了。
$ expr 4096 \* 1525619 / 1024
6102476
顯然值得為以上的指令之一設(shè)置個(gè) alias
。
另一個(gè)具有非常易于理解的輸出的命令是 top
。在 top
輸出的前五行,你可以看到一些數(shù)字顯示多少內(nèi)存正被使用。
$ top
top - 15:36:38 up 8 days, 2:37, 2 users, load average: 0.00, 0.00, 0.00
Tasks: 266 total, 1 running, 265 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.2 us, 0.4 sy, 0.0 ni, 99.4 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 3244.8 total, 377.9 free, 1826.2 used, 1040.7 buff/cache
MiB Swap: 3536.0 total, 3535.7 free, 0.3 used. 1126.1 avail Mem
結(jié)尾一個(gè)命令將會(huì)以一個(gè)非常簡(jiǎn)潔的方式回答“系統(tǒng)安裝了多少內(nèi)存?”:
$ sudo dmidecode -t 17 | grep "Size.*MB" | awk '{s+=$2} END {print s / 1024 "GB"}'
6GB
取決于你想要獲取多少細(xì)節(jié),Linux 系統(tǒng)提供了許多用來(lái)查看系統(tǒng)安裝內(nèi)存以及使用/空閑內(nèi)存的選擇。