探究CentOS 7可用内存

结论:正确分析CentOS7系统可用内存的方式

  • CentOS 7.0: 通过free/proc/meminfo中MemAvailable综合确定,以后者为主
  • CentOS 7.2: freeMem:available~=/proc/meminfo中MemAvailable,二者等价

准确的说,应该是CentOS7在初始版本中free未合理获取系统可用内存数据
在CentOS 7.2版本中已增加Mem:available显示正确的系统空闲内存。

一般的,通过free查看系统可用内存,但升级CentOS7后内存占用率持续升高,且非高峰流量期并未回落,如下:
内存占用趋势图
以下针对排查系统内存资源占用情况和正确评估可用内存展开讨论。

内存资源去哪儿了

free命令查看

通过free-/+ buffers/cache:free中查看到可用内存资源已经较少:

1
2
3
4
5
6
// free中可用内存只有3.8G(总内存为16G)
# free -h
total used free shared buffers cached
Mem: 15G 15G 250M 211M 162M 3.4G
-/+ buffers/cache: 11G 3.8G
Swap: 0B 0B 0B

ps 各进程占用内存统计

当前负载不高,流量低谷,不应该有这么大的资源消耗,如下统计所有进程的内存占用情况:

1
2
# ps aux | awk '{mem += $6} END {print mem/1024}'
1432.89

这里统计的所有进程内存占用合计1.4G,这与free15G相差甚大?!

/proc/meminfo 内存数据

/proc/meminfo各字段详解如下,RedHat-6-meminfo各字段说明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# cat /proc/meminfo 
MemTotal: 15993324 kB // 所有物理可用RAM内存
MemFree: 257172 kB // 当前空闲内存
MemAvailable: 14670528 kB // 预计可用内存
Buffers: 166456 kB // 用来给文件做缓冲的内存
Cached: 3740936 kB // 高速缓冲存储器(cache memory)所用内存
SwapCached: 0 kB // 交换空间
Active: 3360008 kB // 活跃使用的Buffer或Cache的大小
Inactive: 1165560 kB // 不经常使用的缓冲、缓存的大小
Active(anon): 717592 kB
Inactive(anon): 117316 kB
Active(file): 2642416 kB
Inactive(file): 1048244 kB
Unevictable: 0 kB
Mlocked: 0 kB
SwapTotal: 0 kB
SwapFree: 0 kB
Dirty: 136 kB
Writeback: 0 kB
AnonPages: 618664 kB
Mapped: 84592 kB
Shmem: 216732 kB
Slab: 11051316 kB // 此次重点关注的Slab
SReclaimable: 10976100 kB // 重点关注SReclaimable Slab
SUnreclaim: 75216 kB
KernelStack: 6760 kB
PageTables: 24288 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 7996660 kB
Committed_AS: 3226992 kB
VmallocTotal: 34359738367 kB
VmallocUsed: 30740 kB
VmallocChunk: 34359707083 kB
HardwareCorrupted: 0 kB
AnonHugePages: 272384 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
DirectMap4k: 126976 kB
DirectMap2M: 16650240 kB

free命令输出和/proc/meminfo字段映射关系

free -k /proc/meminfo
Mem: total MemTotal
Mem: used MemTotal - MemFree
Mem: free MemFree
Mem: shared (can be ignored nowadays. It has no meaning.) N/A
Mem: buffers Buffers
Mem: cached Cached
-/+ buffers/cache: used MemTotal - (MemFree + Buffers + Cached)
-/+ buffers/cache: free MemFree + Buffers + Cached
Swap: total SwapTotal
Swap: used SwapTotal - SwapFree
Swap: free SwapFree

如何正确理解Centos 7的内存模型

正确分析系统可用内存的姿势

  • CentOS7.0: 通过free/proc/meminfo中MemAvailable综合确定,以后者为主
  • CentOS7.2: freeMem:avaialbe~=/proc/meminfo中MemAvailable,二者等价
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    // CentOS Linux release 7.2.1511 (Core) 
    # free -h
    total used free shared buff/cache available
    Mem: 3.5G 689M 318M 109M 2.5G 2.4G
    Swap: 0B 0B 0B
    // 可以看到free中Mem:available和/proc/meminfo中的MemAvailable数据相近
    # cat /proc/meminfo
    MemTotal: 3619012 kB
    MemFree: 331276 kB
    MemAvailable: 2556600 kB
    Buffers: 147240 kB
    Cached: 2301536 kB
    SwapCached: 0 kB
    Active: 1992004 kB
    Inactive: 1093544 kB


    // CentOS Linux release 7.0.1406 (Core)
    // 这里通过free看到的内存占用情况并不全面
    # free -h
    total used free shared buffers cached
    Mem: 7.4G 6.3G 1.1G 303M 104M 1.7G
    -/+ buffers/cache: 4.4G 3.0G
    Swap: 0B 0B 0B
    // 可通过/proc/meminfo中MemAvailable看可用内存的预估值
    # cat /proc/meminfo
    MemTotal: 7748928 kB
    MemFree: 1122188 kB
    MemAvailable: 4989680 kB
    Buffers: 110088 kB
    Cached: 2142408 kB
    SwapCached: 0 kB
    Active: 3410840 kB
    Inactive: 870248 kB

TODO: 下篇文章分享

  • CentOS内存优化参数说明
  • slab到底用在了哪里?
  • 内存相关参数调优

参考