如何查看系統(tǒng)內(nèi)存使用情況
free命令輸出解析
free
total used free shared buff/cache available
Mem: 32609272 10868436 8900124 274592 12840712 20935420
Swap: 0 0 0
- 第一列,total 是總內(nèi)存大?。?/li>
- 第二列,used 是已使用內(nèi)存的大小,包含了共享內(nèi)存;
- 第三列,free 是未使用內(nèi)存的大小;
- 第四列,shared 是共享內(nèi)存的大小;
- 第五列,buff/cache 是緩存和緩沖區(qū)的大?。?/li>
- 最后一列,available 是新進(jìn)程可用內(nèi)存的大小。
Top命令輸出解析
...
MiB Mem : 31845.0 total, 8697.7 free, 10601.4 used, 12545.9 buff/cache
MiB Swap: 0.0 total, 0.0 free, 0.0 used. 20457.0 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
4163543 root 20 0 14.2g 3.5g 30524 S 8.6 11.1 3851:09 ld-linux-x86-64
532733 root 20 0 90620 70644 67088 S 5.6 0.2 103:51.65 sap1007
532606 root 20 0 44036 43316 1284 S 3.0 0.1 1287:36 sap1002
25653 root 20 0 10.8g 96160 34612 S 2.7 0.3 8094:30 etcd
25009 root 20 0 3486420 104616 30404 S 1.7 0.3 6842:32 containerd
532603 root 20 0 100272 11960 2844 S 1.7 0.0 299:02.96 sap1001
25674 root 20 0 895280 97788 17840 S 1.3 0.3 4237:12 kube-controller
...
- VIRT 是進(jìn)程虛擬內(nèi)存的大小,只要是進(jìn)程申請過的內(nèi)存,即便還沒有真正分配物理內(nèi)存,也會計(jì)算在內(nèi)。
- RES 是常駐內(nèi)存的大小,也就是進(jìn)程實(shí)際使用的物理內(nèi)存大小,但不包括 Swap 和共享內(nèi)存。
- SHR 是共享內(nèi)存的大小,比如與其他進(jìn)程共同使用的共享內(nèi)存、加載的動態(tài)鏈接庫以及程序的代碼段等。
- %MEM 是進(jìn)程使用物理內(nèi)存占系統(tǒng)總內(nèi)存的百分比。
內(nèi)存的分配與回收
常用的內(nèi)存回收機(jī)制
- 回收緩存,比如使用 LRU(Least Recently Used)算法,回收最近使用最少的內(nèi)存頁面;
- 回收不常訪問的內(nèi)存,把不常用的內(nèi)存通過交換分區(qū)直接寫到磁盤中;
- 殺死進(jìn)程,內(nèi)存緊張時(shí)系統(tǒng)還會通過 OOM(Out of Memory),直接殺掉占用大量內(nèi)存的進(jìn)程。
Tips
關(guān)于 oom,其實(shí)是內(nèi)核的一種保護(hù)機(jī)制。它監(jiān)控進(jìn)程的內(nèi)存使用情況,并且使用 oom_score 為每個(gè)進(jìn)程的內(nèi)存使用情況進(jìn)行評分。一個(gè)進(jìn)程消耗的內(nèi)存越大,oom_score 就越大;一個(gè)進(jìn)程運(yùn)行占用的 CPU 越多,oom_score 就越小。
實(shí)際工作中,可以通過 /proc 文件系統(tǒng),手動設(shè)置進(jìn)程的 oom_adj ,從而調(diào)整進(jìn)程的 oom_score。oom_adj 的范圍是 [-17, 15],數(shù)值越大,表示進(jìn)程越容易被 OOM 殺死;數(shù)值越小,表示進(jìn)程越不容易被 OOM 殺死,其中 -17 表示禁止 OOM。
比如用下面的命令,你就可以把 sshd 進(jìn)程的 oom_adj 調(diào)小為 -16,這樣, sshd 進(jìn)程就不容易被 OOM 殺死。
echo -16 > /proc/$(pidof sshd)/oom_adj
內(nèi)存中的 buffer/cache
free 命令中man 手冊的定義
- Buffer 是內(nèi)核緩沖區(qū)中用到的內(nèi)存,對應(yīng)的是
/proc/meminfo中的Buffers 值。 - Cache 是內(nèi)核頁緩存和 Slab 用到的內(nèi)存,對應(yīng)的是
/proc/meminfo中的 Cached 與 SReclaimable 之和。
proc文件系統(tǒng) man 手冊的定義
- Buffers 是對原始磁盤塊的臨時(shí)存儲,也就是用來緩存磁盤的數(shù)據(jù),通常不會特別大(20MB 左右)。這樣,內(nèi)核就可以把分散的寫集中起來,統(tǒng)一優(yōu)化磁盤的寫入,比如可以把多次小的寫合并成單次大的寫等等。
- Cached 是從磁盤讀取文件的頁緩存,也就是用來緩存從文件讀取的數(shù)據(jù)。這樣,下次訪問這些文件數(shù)據(jù)時(shí),就可以直接從內(nèi)存中快速獲取,而不需要再次訪問緩慢的磁盤。
- SReclaimable 是 Slab 的一部分。Slab 包括兩部分,其中的可回收部分,用 SReclaimable 記錄;而不可回收部分,用 SUnreclaim 記錄。
總結(jié):Buffer 是對磁盤數(shù)據(jù)的緩存,而 Cache 是文件數(shù)據(jù)的緩存,它們既會用在讀請求中,也會用在寫請求中。