共计 1166 个字符,预计需要花费 3 分钟才能阅读完成。
线上集群后端某台 Web 服务器例行检查时,我观察到 +buffers/cache 值(即 Linux 内存的实际使用情况)一直都是 5365 左右,就算停掉 Nginx+FastCGI 程序和其它程序也是一样,考虑到这台机器经常在使用 rsync+inotify,肯定会存在着频繁存取文件的情况。而 Linux 系统有一个特性:在 Linux 下频繁存取文件时,就会占用物理内存。当程序结束时并不会自动释放被占用的内存,而是一直作为 Cache 存在。实际上内核结束一个程序后,它是会释放内存的,但是内核并没有立刻将这部分收集到 free 当中,而是存在在 cached 或者 buffer 当中,提高系统的 io 效率,cache 和 buffered 的内存是由内核进行动态的配置管理,如果系统的 free 大小不够的时候,系统会自动释放 cache buffer 的内存给程序使用(因此如果是看到 used 很多,来手动释放内存其实是不需要的,我前面的文章及书籍其实也说明了我们应该如何观察 Linux 系统的实际内存使用情况,这里就不再多描述了)。
操作步骤:
1、查询当前内存使用情况和释放缓存的参数
free -m
命令结果如示所示:
total used free shared buffers cached
Mem: 10988 6792 4196 0 168 1001
-/+ buffers/cache: 5622 5365
Swap: 4295 0 4295
查看释放缓存参数的命令,如下所示:
cat /proc/sys/vm/drop_caches
系统默认显示为 0,0 为默认值,即表示不释放。
2、使用 sync 命令,将系统缓存区中的脏数据写入磁盘中,包括已修改的 i -node、已延迟的块 I / O 和读写映射文件,命令如下:
sync
3、配置文件 /proc/sys/vm/drop_caches 中记录了缓存释放的参数,命令如下:
echo 3 > /proc/sys/vm/drop_caches
4、不重启机器使配置改生效,命令如下:
sysctl -p
执行以上操作以后,+buffers/cache 值由 5365 涨到了 9500,这个值就恢复正常了。不过个人觉得 Linux 系统(尤其是 CentOS 系统)管理内存的方式其实是很优异的,很多时候并不需要手动释放内存;另外,工作中感觉 rsync+inotify 的方式还是存在着很多缺陷,正在慢慢将其往 rsync+puppet 环境迁移。
CentOS 5.6 Linux 安装系统后的基本优化 http://www.linuxidc.com/Linux/2012-02/54504.htm
更多 CentOS 相关信息见 CentOS 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=14