转载:http://www.javashuo.com/article/p-bmnhzphi-ek.html node
线上集群后端某台Web服务器例行检查时,我观察到+buffers/cache值(即Linux内存的实际使用状况)一直都是5365左右,就算停掉Nginx+FastCGI程序和其它程序也是同样,考虑到这台机器常常在使用rsync+inotify,确定会存在着频繁存取文件的状况。而Linux系统有一个特性:在Linux下频繁存取文件时,就会占用物理内存。当程序结束时并不会自动释放被占用的内存,而是一直做为Cache存在。实际上内核结束一个程序后,它是会释放内存的,可是内核并无马上将这部分收集到free当中,而是存在在cached或者buffer当中,提升系统的io效率,cache和buffered的内存是由内核进行动态的配置管理,若是系统的free大小不够的时候,系统会自动释放cache buffer的内存给程序使用(所以若是是看到used不少,来手动释放内存实际上是不须要的,我前面的文章及书籍其实也说明了咱们应该如何观察Linux系统的实际内存使用状况,这里就再也不多描述了)。web
操做步骤:
后端
一、查询当前内存使用状况和释放缓存的参数缓存
free -mbash
命令结果如示所示:服务器
1
2
3
4
|
total used
free
shared buffers cached
Mem: 10988 6792 4196 0 168 1001
-/+ buffers
/cache
: 5622 5365
Swap: 4295 0 4295
|
查看释放缓存参数的命令,以下所示:app
1
|
cat
/proc/sys/vm/drop_caches
|
系统默认显示为0,0为默认值,即表示不释放。ide
二、使用sync命令,将系统缓存区中的脏数据写入磁盘中,包括已修改的i-node、已延迟的块I/O和读写映射文件,命令以下:spa
1
|
sync
|
三、配置文件/proc/sys/vm/drop_caches中记录了缓存释放的参数,命令以下:
code
1
|
echo
3 >
/proc/sys/vm/drop_caches
|
四、不重启机器使配置改生效,命令以下:
1
|
sysctl -p
|
执行以上操做之后, +buffers/cache值由5365涨到了9500,这个值就恢复正常了。不过我的以为Linux系统(尤为是CentOS系统)管理内存的方式实际上是很优异的,不少时候并不须要手动释放内存;另外,工做中感受rsync+inotify的方式仍是存在着不少缺陷,正在慢慢将其往rsync+puppet环境迁移。