结论:正确分析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到底用在了哪里?
- 内存相关参数调优
参考