常用
free 命令是 Linux 上很簡(jiǎn)單、很常用的一個(gè)命令。
free 命令的輸出會(huì)有 Swap 相關(guān)的內(nèi)容,本文忽略 Swap。
free
free -k # 以KB為單位
free -m # 以MB為單位
free -g # 以GB為單位
free -h # 人類(lèi)可讀
輸出(舊版)
使用 free 命令的時(shí)候,我們一般最關(guān)心的就是:現(xiàn)在還有多少內(nèi)存可以讓?xiě)?yīng)用程序使用?
但是,舊版的 free 命令并不能直觀地展示這一點(diǎn)。
| total | used | free | shared | buffers | cached | |
|---|---|---|---|---|---|---|
| Mem | 3856200 | 3321044 | 535156 | 251096 | 232084 | 1406376 |
| -/+ buffers/cache | 1682584 | 2173616 | ||||
| Swap | 3999740 | 482480 | 3517260 |
- Mem 這一行是從 Linux 內(nèi)核的角度看物理內(nèi)存的使用量。
- total - 計(jì)算機(jī)的物理內(nèi)存總量。
- used - 從 Linux 內(nèi)核的角度,已使用的內(nèi)存 = 應(yīng)用程序使用的內(nèi)存 + 內(nèi)核使用的內(nèi)存(可回收+不可回收)。
- free - 完全沒(méi)有使用到的內(nèi)存。
- shared - 共享內(nèi)存。
- buffers - 內(nèi)核的 buffers cache 系統(tǒng)占用。
- cached - 內(nèi)核的 page cache 系統(tǒng)占用。
- -/+buffer/cache 這一行是從應(yīng)用程序的角度看物理內(nèi)存的使用量。
- used - 應(yīng)用程序?qū)嶋H使用的內(nèi)存。其值為 Mem 一行中的 used - buffers - cached == total - free - buffer - cached。
- free - 從應(yīng)用程序的角度看還可以使用的內(nèi)存(不是非常準(zhǔn)確)。其值為 Mem 一行中的 free + buffers + cached。但是 buffers/cached 是包含了 shared 的,shared 不能被隨時(shí)回收。
- 粗略地看,應(yīng)用程序還可以繼續(xù)使用的內(nèi)存大小為:-/+buffer/cache 一行中的 free 減去 Mem 一行中的 shared。在這個(gè)例子中,為 2173616 - 251096 = 1922520。
輸出(新版)
最近把個(gè)人的 Linux 機(jī)器的系統(tǒng)給升級(jí)了,不知道具體從哪個(gè)版本開(kāi)始,free 命令的輸出做了改進(jìn)。刪除了 -/+ buffer/cache 一行,加了一列 available,同時(shí)修改了一些列的意義。相對(duì)上面舊版的輸出來(lái)說(shuō),直觀性好了不少。大部分情況下,只需要看 available 一列就可以了。(當(dāng)然,具體情況還是得具體分析…)
| total | used | free | shared | buff/cache | available | |
|---|---|---|---|---|---|---|
| Mem | 9.6G | 1.1G | 6.0G | 160M | 2.5G | 8.0G |
| Swap | 3.8G | 0B | 3.8G |
現(xiàn)在只有 Mem 一行數(shù)據(jù)來(lái)描述內(nèi)存的使用情況(Swap 一行暫時(shí)忽略),第一感覺(jué)就比舊版的輸出好看很多。
- total -
/proc/meminfo中的MemTotal,表示計(jì)算機(jī)的內(nèi)存總量。 - used - 被占用的內(nèi)存,不能隨時(shí)回收,其值為
total - free - buff/cache。 - free - 完全沒(méi)有被使用到的內(nèi)存,
/proc/meminfo中的Memfree。 - shared -
/proc/meminfo中的Shmem,共享內(nèi)存,一般是被 tmpfs 占用。 - buff/cache:buffer + cache
- buffer:
/proc/meminfo中的Buffers。 - cache:
/proc/meminfo中的Cached。
- buffer:
- available - 應(yīng)用程序真正可用的內(nèi)存(比較準(zhǔn)確的評(píng)估值),其值為
/proc/meminfo中的MemAvailable。從這個(gè)例子中,可以看出 (free + buff/cache - shared = 6.0G + 2.5G - 160M) > (available = 8.0G),所以 buff/cache 對(duì)應(yīng)的統(tǒng)計(jì)數(shù)據(jù)里面除了 shared 之外,還有一些其他不能被隨時(shí)回收的內(nèi)存,這部分被 Linux 內(nèi)核內(nèi)部占用。
小結(jié)
free 命令輸出的數(shù)據(jù)本質(zhì)上是由 /proc/meminfo 下的統(tǒng)計(jì)數(shù)據(jù)。新版的內(nèi)核優(yōu)化了 /proc/meminfo 下的一些統(tǒng)計(jì)數(shù)據(jù),使得 free 命令的輸出更加準(zhǔn)確、清晰。
這里要明確一點(diǎn),大部分情況下,大部分 buffer/cache 占用的內(nèi)存在需要時(shí)可以被回收并重新分配。但是要注意下面幾點(diǎn):
- shared 屬于 page cache,所以 cache 的統(tǒng)計(jì)里包括 shared,但是 shared 不能被內(nèi)核隨時(shí)回收。
- 除了 shared 以外,buffer 或 cache 對(duì)應(yīng)的統(tǒng)計(jì)信息里,還有一部分被內(nèi)核“真正”占用,這部分也不能被隨時(shí)回收。
- 大部分內(nèi)核的
free命令還是輸出舊的格式,此時(shí)我們只能根據(jù)輸出簡(jiǎn)單估算出 available 的內(nèi)存大?。ㄒ?jiàn)舊版輸出的說(shuō)明,實(shí)際 available 的內(nèi)存應(yīng)該比這里估算的值?。?。
(2018.07.29 更新,新版 free 命令的輸出說(shuō)明。)