debian之类的系统认为:
可用内存=free的内存+cached的内存+buffers的内存
SUSE之类的系统则认为:
可用内存=free的内存+cached的内存+buffers的内存+SReclaimable的内存
cat /proc/meminfo 信息如下:
需要使用的指标有:MemTotal,MemFree,Buffers,Cached,SReclaimable
MemTotal:总内存大小
MemFree: 空闲内存大小
Buffers和Cached:磁盘缓存的大小
SReclaimable:在linux内核中会有许多小对象,这些对象构造销毁十分频繁,比如i-node,dentry。这么这些对象如果每次构建的时候就向内存要一个页,而其实际大小可能只有几个字节,这样就非常浪费,为了解决这个问题就引入了一种新的机制来处理在同一页框中如何分配小存储器区,这个机制可以减少申请和释放内存带来的消耗,这些小存储器区的内存称为Slab。meminfo文件中标识了Slab的大小,而SReclaimable是指可收回Slab的大小。
Buffers和Cached的区别:
buffers 是指用来给块设备做的缓冲大小,他只记录文件系统的metadata以及 tracking in-flight pages.
cached 是用来给文件做缓冲。
buffers 是用来存储目录里面有什么内容,权限等等。
而cached直接用来记忆我们打开的文件,比如先后执行两次命令#man X ,你就可以明显的感觉到第二次的开打的速度快很多。
而buffers随时都在增加,比如先后两次使用ls /dev后,就会发现第二次执行的速度会较第一次快。
这就是buffers/chached的区别。
实战
prometheus监控 内存使用率的监控指标
之前是如下,内存使用率一直报警
- expr: round((100-(node_memory_Buffers_bytes+node_memory_Cached_bytes+node_memory_MemFree_bytes)/node_memory_MemTotal_bytes*100),0.01)
record: memory:usage
labels:
desc: "内存消耗百分比"
unit: "%"
后来换成了如下,把SReclaimable加进去好点了
- expr: round((100-(node_memory_Buffers_bytes+node_memory_Cached_bytes+node_memory_MemFree_bytes+node_memory_SReclaimable_bytes)/node_memory_MemTotal_bytes*100),0.01)
record: memory:usage
labels:
desc: "内存消耗百分比"
unit: "%"
如下命令释放内存
参考资料: https://blog.csdn.net/XD_hebuters/article/details/79608136
To free pagecache:
sync;echo 1 > /proc/sys/vm/drop_caches
To free reclaimable slab objects (includes dentries and inodes):
sync;echo 2 > /proc/sys/vm/drop_caches
To free slab objects and pagecache:
sync;echo 3 > /proc/sys/vm/drop_caches