问题现象如下:
情况1:free -m查看内存使用了1.1G,但是空闲free只有88m
情况2:used直接使用了90%+,其余没有看出占用
top查看进程,只有java占用了不到50%,折算下来空闲内存应该至少还有600M左右,但是实际可用已经没有了。
原因:
简单理解内存分为物理内存和虚拟内存(swap),这里不考虑swap问题。
物理内存又被系统划分为了Buffers、Cached、Active、Inactive,这4大块,其中buffer是给文件的缓冲大小,cache是做内存缓存的,active是活跃内存,inactive是非活跃内存。
其中active又包含了Active(file)、Active(anon)、pagecahce等等,这里不做详细解释,可自行搜索【meminfo详解】
其实平时我们查看具体的内存占用普遍使用free -h去查看,但是要查具体哪个进程占用了内存会考虑使用top,这就产生了问题。
首先,free -h会显示内存总量、使用量、剩余量、cache占用量不包含在已使用量之中,会引起客户误判,不去考虑这个buffer/cache的占用。
其次,top看进程内存占用,也不会去考虑哪个进程使用了多少cache。
所以这就造成了使用率不一致的情况。标准解决,使用命令查看物理内存占用详情。
以MB为单位显示:
cat /proc/meminfo | awk '{print $1,$2/1024" MB"}'|column -t
以GB为单位显示:
cat /proc/meminfo | awk '{print $1,$2/(1024*1024)" GB"}'|column -t
显示的明明白白,清清楚楚。
然后具体情况具体分析,看是哪一块占用了,根据meminfo详解去对照解释。
关于cache、pagecache等的释放命令:
1、sync (将未落盘的内存脏数据同步到磁盘,防止内存数据丢失)
2、
# echo 1 > /proc/sys/vm/drop_caches;
# echo 2 > /proc/sys/vm/drop_caches
# echo 3 > /proc/sys/vm/drop_caches
对于1、2、3的解释:
echo 1是释放页缓存,echo 2 是释放slab,而echo 3就是既释放页缓存,又释放slab
查看Buffer&Cache被哪些进程占用
使用hcache工具查看:
- wget https://silenceshell-1255345740.cos.ap-shanghai.myqcloud.com/hcache
- chmod 755 hcache
示例: