结论:正确分析CentOS7系统可用内存的方式
- CentOS 7.0: 通过
free
和/proc/meminfo中MemAvailable
综合确定,以后者为主 - CentOS 7.2:
free
中Mem: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
,这与free
中15G
相差甚大?!
/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:
free
中Mem: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到底用在了哪里?
- 内存相关参数调优