Linux內(nèi)存使用分析-概念篇

如何查看系統(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ù)的緩存,它們既會用在讀請求中,也會用在寫請求中。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容