Linux Cached 过大问题
Linux Cached 过大问题
某日,愉悦Coding.
负责人抛过来一个问题:“XXX说咱们的服务内存使用量过大,你接下来看看这个问题.”
此时的我一脸蒙蔽的ssh到VM上输入如下命令 free -h 此时bash显示
free -h
total used free shared buff/cache available
Mem: 11G 1.5G 3.5G 184M 6.6G 9.6G
Swap: 4.0G 0B 4.0G
懵逼的我不禁发出了感叹–这内存状况良好得运维看了都想给机器减配!
只好再看看服务的状况了 于是我敲下了以下命令 top 映入眼帘的景象让我大呼上当
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
**** **** 20 0 **** **** **** S 21.3 2.2 147:22.09 node /home/www
**** **** 20 0 **** **** **** S 14.0 2.2 136:32.45 node /home/www
**** **** 20 0 **** **** **** S 5.3 2.6 145:11.27 node /home/www
**** **** 20 0 **** **** **** S 3.0 2.2 147:21.91 node /home/www
平均每个进程3%不到的占用,怎么就内存使用过大了?
由于感觉到事情已经超出了自己的认知能力,只好找到负责人:“我看服务状况蛮好啊,XXX为啥说过大?”
XXX加入会话:“监控系统显示内存剩余量只有1.5G左右了,怕流量打起来出故障.”
我一脸问号,并贴出了大大的❓❓❓
老哥怕不是把cached内存算在不可使用内存范围了,后续沟通证明事实确实如此,误会接触.
那么为啥会产生这样的误会呢
我们搞前端的兄弟们写习惯了UI,少有接触linux知识,我们先来了解下Linux下的buff/cache memery 到底是个啥?
-
buff(Buffer Cache)是一种I/O缓存,用于内存和硬盘的缓冲,是io设备的读写缓冲区。根据磁盘的读写设计的,把分散的写操作集中进行,减少磁盘碎片和硬盘的反复寻道,从而提高系统性能。
-
cache(Page Cache)是一种高速缓存,用于CPU和内存之间的缓冲 ,是文件系统的cache。把读取过的数据保存起来,重新读取时若命中(找到需要的数据)就不要去读硬盘了,若没有命中就读硬盘。其中的数据会根据读取频率进行组织,把最频繁读取的内容放在最容易找到的位置,把不再读的内容不断往后排,直至从中删除。
有心的小伙伴可以扩展查看《Linux System Administrators Guide:Chapter 6. Memory Management》
简单点来说:Buffer Cache是即将写入磁盘的数据,Page Cache则是从磁盘中读取的数据.他们都占用内存,且都存储在RAM中.
不过它们虽然都占用内存但是在合适的时机会被内核释放掉,而一般情况下不需要我们去关注cached内存,它的存在可以增加文件的读写性能.
那么看到这里的看官可能已经猜到为啥我们这个服务的cached内存占用8Gb了–是的没错,写日志文件!
好了今天的总结就到此为止.顺带贴上一篇贼出名的文章《linux ate my ram》
但是有的人看着不爽
既然看着不爽,那就只能手动或者定时任务来清理它啦!
手动清理
server# sync #一定要记得这个写入硬盘,防止数据丢失
server# echo 1 > /proc/sys/vm/drop_caches
server# echo 1 > /proc/sys/vm/drop_caches
server# echo 1 > /proc/sys/vm/drop_caches
写成脚本
#!/bin/bash
echo "清除cached缓存"
sync
sleep 10
echo 1 > /proc/sys/vm/drop_caches
echo 2 > /proc/sys/vm/drop_caches
echo 3 > /proc/sys/vm/drop_caches
然后就是创建该脚本的定时任务啦!