下面是一個(gè) free 的輸出示例:
# 注意不同版本的 free 輸出可能會(huì)有所不同
$ free
total used free shared buff/cache available
Mem: 8169348 263524 6875352 668 1030472 7611064
Swap: 0 0 0
你可以看到,free 輸出的是一個(gè)表格,其中的數(shù)值都默認(rèn)以字節(jié)為單位。表格總共有兩行六列,這兩行分別是物理內(nèi)存 Mem 和交換分區(qū) Swap 的使用情況,而六列中,每列數(shù)據(jù)的含義分別為:
- 第一列,total 是總內(nèi)存大小;
- 第二列,used 是已使用內(nèi)存的大小,包含了共享內(nèi)存;
- 第三列,free 是未使用內(nèi)存的大小;
- 第四列,shared 是共享內(nèi)存的大??;
- 第五列,buff/cache 是緩存和緩沖區(qū)的大??;
- 最后一列,available 是新進(jìn)程可用內(nèi)存的大小。
這里尤其注意一下,最后一列的可用內(nèi)存 available 。available 不僅包含未使用內(nèi)存,還包括了可回收的緩存,所以一般會(huì)比未使用內(nèi)存更大。不過(guò),并不是所有緩存都可以回收,因?yàn)橛行┚彺婵赡苷谑褂弥小?/p>
不過(guò),我們知道,free 顯示的是整個(gè)系統(tǒng)的內(nèi)存使用情況。如果你想查看進(jìn)程的內(nèi)存使用情況,可以用 top 或者 ps 等工具。比如,下面是 top 的輸出示例:
# 按下 M 切換到內(nèi)存排序
$ top
...
KiB Mem : 8169348 total, 6871440 free, 267096 used, 1030812 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 7607492 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
430 root 19 -1 122360 35588 23748 S 0.0 0.4 0:32.17 systemd-journal
1075 root 20 0 771860 22744 11368 S 0.0 0.3 0:38.89 snapd
1048 root 20 0 170904 17292 9488 S 0.0 0.2 0:00.24 networkd-dispat
1 root 20 0 78020 9156 6644 S 0.0 0.1 0:22.92 systemd
12376 azure 20 0 76632 7456 6420 S 0.0 0.1 0:00.01 systemd
12374 root 20 0 107984 7312 6304 S 0.0 0.1 0:00.00 sshd
top 輸出界面的頂端,也顯示了系統(tǒng)整體的內(nèi)存使用情況,這些數(shù)據(jù)跟 free 類(lèi)似,我就不再重復(fù)解釋。我們接著看下面的內(nèi)容,跟內(nèi)存相關(guān)的幾列數(shù)據(jù),比如 VIRT、RES、SHR 以及 %MEM 等。
這些數(shù)據(jù),包含了進(jìn)程最重要的幾個(gè)內(nèi)存使用情況,我們挨個(gè)來(lái)看。
- VIRT 是進(jìn)程虛擬內(nèi)存的大小,只要是進(jìn)程申請(qǐng)過(guò)的內(nèi)存,即便還沒(méi)有真正分配物理內(nèi)存,也會(huì)計(jì)算在內(nèi)。
- RES 是常駐內(nèi)存的大小,也就是進(jìn)程實(shí)際使用的物理內(nèi)存大小,但不包括 Swap 和共享內(nèi)存。
- SHR 是共享內(nèi)存的大小,比如與其他進(jìn)程共同使用的共享內(nèi)存、加載的動(dòng)態(tài)鏈接庫(kù)以及程序的代碼段等。
- %MEM 是進(jìn)程使用物理內(nèi)存占系統(tǒng)總內(nèi)存的百分比。
除了要認(rèn)識(shí)這些基本信息,在查看 top 輸出時(shí),你還要注意兩點(diǎn)。
第一,虛擬內(nèi)存通常并不會(huì)全部分配物理內(nèi)存。從上面的輸出,你可以發(fā)現(xiàn)每個(gè)進(jìn)程的虛擬內(nèi)存都比常駐內(nèi)存大得多。
第二,共享內(nèi)存 SHR 并不一定是共享的,比方說(shuō),程序的代碼段、非共享的動(dòng)態(tài)鏈接庫(kù),也都算在 SHR 里。當(dāng)然,SHR 也包括了進(jìn)程間真正共享的內(nèi)存。所以在計(jì)算多個(gè)進(jìn)程的內(nèi)存使用時(shí),不要把所有進(jìn)程的 SHR 直接相加得出結(jié)果。