Linux系統內存使用狀況主要存儲在/proc/meminfo中,”free”、”vmstat”等命令就是通過它獲取數據的。

1、通過 cat /proc/meminfo查看

[root@localhost ~]# cat /proc/meminfo 
MemTotal:       32656556 kB        // 可供系統支配的內存 (即物理內存減去一些預留位和內核的二進制代碼大小)
MemFree:        13060828 kB        // LowFree與HighFree的總和,系統中未使用的內存
MemAvailable:   27306600 kB        // 應用程序可用內存,MemAvailable≈MemFree+Buffers+Cached,它與MemFree的關鍵區別點在於,MemFree是說的系統層面,MemAvailable是說的應用程序層面
Buffers:            2080 kB        // 緩沖區內存數,對原始磁盤塊的臨時存儲,也就是用來緩存磁盤的數據,通常不會特別大 (20MB 左右)
Cached:         15397548 kB        // 緩存區內存數
SwapCached:            0 kB        // 交換文件中的已經被交換出來的內存。與 I/O 相關
Active:          9556388 kB        // 經常(最近)被使用的內存
Inactive:        8106580 kB        // 最近不常使用的內存。這很容易被系統移做他用
Active(anon):    3351300 kB        // 活躍的匿名內存(進程中堆上分配的內存,是用malloc分配的內存)
Inactive(anon):   823400 kB        // 不活躍的匿名內存
Active(file):    6205088 kB        // 活躍的與文件關聯的內存(比如程序文件、數據文件所對應的內存頁)
Inactive(file):  7283180 kB        // 不活躍的與文件關聯的內存
Unevictable:           0 kB        // 不能被釋放的內存頁
Mlocked:               0 kB        // mlock()系統調用鎖定的內存大小
SwapTotal:      16450556 kB        // 交換空間總大小
SwapFree:       16450556 kB        // 空閑的交換空間大小
Dirty:                12 kB        // 等待被寫回到磁盤的大小
Writeback:             0 kB        // 正在被寫回的大小
AnonPages:       2263468 kB        // 未映射頁的大小
Mapped:           343264 kB        // 設備和文件映射大小
Shmem:           1911344 kB        // 已經被分配的共享內存大小
Slab:            1472540 kB        // 內核數據結構緩存大小
SReclaimable:    1189988 kB        // 可收回Slab的大小
SUnreclaim:       282552 kB        // 不可收回的Slab的大小
KernelStack:       17312 kB        // kernel消耗的內存
PageTables:        34020 kB        // 管理內存分頁的索引表的大小
NFS_Unstable:          0 kB        // 不穩定頁表的大小
Bounce:                0 kB        // 在低端內存中分配一個臨時buffer作為跳轉,把位於高端內存的緩存數據復制到此處消耗的內存
WritebackTmp:          0 kB        // 用於臨時寫回緩沖區的內存
CommitLimit:    32778832 kB        // 系統實際可分配內存總量
Committed_AS:    9836288 kB        // 當前已分配的內存總量
VmallocTotal:   34359738367 kB     // 虛擬內存大小
VmallocUsed:      392428 kB        // 已經被使用的虛擬內存大小
VmallocChunk:   34342156284 kB     // 在 vmalloc 區域中可用的最大的連續內存塊的大小
HardwareCorrupted:     0 kB        // 刪除掉的內存頁的總大小(當系統檢測到內存的硬件故障時)
AnonHugePages:   1552384 kB        // 匿名 HugePages 數量
CmaTotal:              0 kB        // 連續可用內存總數
CmaFree:               0 kB        // 空閑的連續可用內存
HugePages_Total:       0           // 預留HugePages的總個數
HugePages_Free:        0           // 尚未分配的 HugePages 數量
HugePages_Rsvd:        0           // 已經被應用程序分配但尚未使用的 HugePages 數量
HugePages_Surp:        0           // 這個值得意思是當開始配置了20個大頁,現在修改配置為16,那么這個參數就會顯示為4,一般不修改配置,這個值都是0
Hugepagesize:       2048 kB        // 每個大頁的大小
DirectMap4k:      320240 kB        // 映射TLB為4kB的內存數量
DirectMap2M:     7972864 kB        // 映射TLB為2M的內存數量
DirectMap1G:    27262976 kB        // 映射TLB為1G的內存數量

buffers和cached解析

  • 緩存(cached):緩存區,高速緩存,是位於CPU與主內存間的一種容量較小但速度很高的存儲器。是把讀取過的數據保存起來,重新讀取時若緩存中存在就不會重新去讀硬盤了。其中的數據會根據讀取頻率進行排序,把最頻繁讀取的內容放在最容易找到的位置,把不再讀的內容不斷往后排。
  • 緩沖(buffers):緩沖區,一個用於存儲速度不同步的設備或優先級不同的設備之間傳輸數據的區域。是根據磁盤的讀寫設計的,把分散的寫操作集中進行,減少磁盤碎片和硬盤的反復尋道,從而提高系統性能。linux有一個守護進程定期清空緩沖內容(即寫入磁盤),也可以通過sync命令手動清空緩沖。

buffers和cached區別

  • cache是高速緩存,用於CPU和內存之間的緩沖;
  • buffer是I/O緩存,用於內存和硬盤的緩沖;

2、查看顯示內存狀態:free [option] [-s <間隔秒數>]

  • -b  以Byte為單位顯示內存使用情況。
  • -k  以KB為單位顯示內存使用情況。
  • -m  以MB為單位顯示內存使用情況。
  • -h  以合適的單位顯示內存使用情況,最大為三位數,自動計算對應的單位值。單位有:(B = bytes、K = kilos、M = megas、G = gigas、T = teras)
  • -o  不顯示緩沖區調節列。
  • -s  持續觀察內存使用狀況。
  • -t  顯示內存總和列。
// centos7.4為例(centos7與centos6輸出結果有所不同)
[root@izwz91quxhnlkan8kjak5hz ~]# free -h
              total        used        free      shared  buff/cache   available
Mem:           1.8G        332M        113M         17M        1.4G        1.3G
Swap:          1.0G          0B        1.0G

// 字段解析:
// Mem行:表示物理內存統計
    // 1.  total 表示物理內存總量;
    // 2.  used表示總計分配給緩存(包含buffers 與cache )使用的數量,但其中可能部分緩存並未實際使用
    // 3.  free表示未被分配的內存
    // 4.  shared表示共享內存,一般系統不會用到
    // 5.  buff/cache表示系統分配但未被使用的緩存大小
    // 6.  available對應着/prco/meminfo 中的MemAvailable
// Swap行:表示硬盤上交換分區的使用情況
    // 1. total表示交換分區上的內存總量
    // 2. used表示已經使用的交換空間容量
    // 3. free表示可用的交換空間容量

3、查看虛擬內存使用狀態:vmstat [option]

命令:
vmstat [-a] [-n] [-S unit] [delay [ count]]
vmstat [-s] [-n] [-S unit]
vmstat [-m] [-n] [delay [ count]]
vmstat [-d] [-n] [delay [ count]]
vmstat [-p disk partition] [-n] [delay [ count]]
vmstat [-f]
vmstat [-V]
option:

  • -a:顯示活躍和非活躍內存
  • -f:顯示從系統啟動至今的fork數量 。
  • -m:顯示slabinfo
  • -n:只在開始時顯示一次各字段名稱。
  • -s:顯示內存相關統計信息及多種系統活動數量。
  • delay:刷新時間間隔。如果不指定,只顯示一條結果。
  • count:刷新次數。如果不指定刷新次數,但指定了刷新時間間隔,這時刷新次數為無窮。
  • -d:顯示磁盤相關統計信息。
  • -p:顯示指定磁盤分區統計信息
  • -S:使用指定單位顯示。參數有 k 、K 、m 、M ,分別代表1000、1024、1000000、1048576字節(byte)。默認單位為K(1024 bytes)
  • -V:顯示vmstat版本信息。

4、清理緩存

以下三種方法為臨時清理緩存,另外,可以使用sync命令來清理文件系統緩存,還會清理僵屍(zombie)對象和它們占用的內存。
要想永久釋放緩存,需要在/etc/sysctl.conf文件中配置:vm.drop_caches=1/2/3,然后執行sysctl -p生效即可

// 臨時釋放緩存
// 清理pagecache(頁面緩存)
[root@backup ~]# echo 1 > /proc/sys/vm/drop_caches     或者 # sysctl -w vm.drop_caches=1

// 清理dentries(目錄緩存)和inodes
[root@backup ~]# echo 2 > /proc/sys/vm/drop_caches     或者 # sysctl -w vm.drop_caches=2

// 清理pagecache、dentries和inodes
[root@backup ~]# echo 3 > /proc/sys/vm/drop_caches     或者 # sysctl -w vm.drop_caches=3

此時如果在執行這些操作時正在寫數據,那么這些數據在寫入磁盤之前就會從文件緩存中清除。
解決這個問題,可以通過編輯/proc/sys/vm/vfs_cache_pressure這個文件的默認值來實現。
/proc/sys/vm/vfs_cache_pressure文件,告訴內核,當清理inoe/dentry緩存時應該用什么樣的優先級。默認值100,用於控制回收cache頻率,值越小則越傾向於保留cache,0表示從不回收cache容易導致out-of-memory

注:cache用於緩存inode/dentry,而buffer用於緩存data

[root@izwz91quxhnlkan8kjak5hz ~]# cat /proc/sys/vm/vfs_cache_pressure
100