免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 10811 | 回复: 17
打印 上一主题 下一主题

Linux内存管理机制的疑惑 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-07-07 17:56 |只看该作者 |倒序浏览
现象:有台服务器,在长时间运行后,用top看系统物理内存free只剩下20MB左右,但是cached占了整个系统内存的80%左右,自己的应用进程本身占有的内存并没有什么变化!
一种解释说法:linux对内存的使用上的机制导致,只要used-buffer-cached不是很大,就没有问题!
针对这种说法我做了测试,calloc一块很大的内存,然后写一些数据,然后释放掉内存,cached和buff没有任何变化,used和free在变化!和以上结论有些出入?
疑问:什么情况下,buff会涨?什么情况下,cache会涨?什么时候,cached或buffer的内存会还给系统?

[ 本帖最后由 ljok30 于 2008-7-7 23:35 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-07-07 20:09 |只看该作者
没释放掉没用的内存?

论坛徽章:
0
3 [报告]
发表于 2008-07-07 20:23 |只看该作者
你的现像应该没有什么关系。
Cache是为了以后加快速度用的,内在不够用的时候Cache会释放的。
你自己分配的内在属于匿名内存,释放了就归还系统了,没有cache价值,一般cache的都是磁盘上的文件吧。比如你运行一个程序,第一次运行的时候会很慢,因为要执行的代码都从磁盘读取。然后你退出了,再次运行就会发现快了不少,就因为系统把磁盘上的程序做了cache,第二次直接从内存读的。
没怎么看过LINUX内核代码,以前BSD的代码也许大概可能是这样的,嘿嘿

论坛徽章:
0
4 [报告]
发表于 2008-07-07 23:32 |只看该作者
翻了翻以前的帖子,似乎学到点东西,但是还是不理解!
1,“Cache是为了以后加快速度用的,内在不够用的时候Cache会释放的”,内存不够用,是free为0嘛?还是启用swap呢?后者内核有什么阀值?
2,“你自己分配的内在属于匿名内存,释放了就归还系统了,没有cache价值,一般cache的都是磁盘上的文件吧”,这句话赞同,我搜集了点关于linux内存管理方面的资料(本人没有读过内核的代码, ),cache一般是i/o操作!那cache有多大,什么时候释放呢?
3,buff什么时候缓存数据?有多大?什么时候释放呢?
声明:服务器进程有日志的相关操作,怀疑这是引起cache升高的元凶,今天刚看到,明天去测试代码,有结果和大家共享!

附上以前的一个帖子地址,希望大家一起讨论,从原理上去理解linux的内存管理机制!
http://linux.chinaunix.net/bbs/v ... p;extra=&page=1

[ 本帖最后由 ljok30 于 2008-7-8 08:21 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2008-07-08 09:25 |只看该作者
cache应该是由内核自动管理的,对用户来说,cache的memory应该可以被当作是free的memory吧。
阈值是肯定有的,如果free为0,那么再做其它事就难了,呵呵。就像不用一个临时变量要交换两个数的值,虽然可以做到,但比较麻烦了吧:)

一般来说会有个watermark,也就是一个阈值了,当free的内存低与这个值时候,内核就会自动free memory了,就简单的就是把cache的memory放到free 里面去。还有一个值叫free_target吧,就是当free达到free_target的时候就不会再free了。
cache多少一般而言只要free的memory不低于watermark,就一直会cache。

你服务器的情况不了解,呵呵。狭义的数据(指一些变量的值什么的)一般不会被cache吧,因为几乎不可能重用。我所知也就这么多了。

论坛徽章:
0
6 [报告]
发表于 2008-07-08 09:40 |只看该作者
声明:服务器进程有日志的相关操作,怀疑这是引起cache升高的元凶

我做过测试,这个确实是cache升高的原因,只要没有内存泄露cache升高也没问题,很多情况下服务器的free内存会逐步降到很低的水平,
但只要不使用交换应该无妨。

论坛徽章:
0
7 [报告]
发表于 2008-07-08 18:45 |只看该作者
Linux执行的是激进式的缓存机制,只要还有可用内存,就会缓存尽可能多的有用数据

在/proc下面哪里好像可以配置

论坛徽章:
0
8 [报告]
发表于 2008-07-08 19:32 |只看该作者
今天做了测试,cache升高的原因就是日志引起,但是buffer什么时候会升高呢?
还有就是对于cache和buffer有没有可以设置的阀值,什么时候释放呢?
找了相关资料,找到了释放cache和buffer的方法,但是本人是ES4.0,没有那个设置项,不知各位能不能给小弟点指点?

cache释放:
To free pagecache:
echo 1 > /proc/sys/vm/drop_caches
To free dentries and inodes:
echo 2 > /proc/sys/vm/drop_caches
To free pagecache, dentries and inodes:
echo 3 > /proc/sys/vm/drop_caches

说明,释放前最好sync一下,防止丢数据。

论坛徽章:
0
9 [报告]
发表于 2008-07-08 21:13 |只看该作者

回复 #8 ljok30 的帖子

我试验过/proc/sys/vm/drop_caches, 结果把机器搞死了。RH ES5 的实现可能还有问题。

传统的办法是运行一个小程序,狂用内存。程序退出,buffer/cache变成free.

控制swapping thread (kswapd) 的阀值 pages_high, pages_low and pages_min是:

$ sysctl vm.min_free_kbytes

论坛徽章:
0
10 [报告]
发表于 2008-07-08 21:35 |只看该作者
你做free时,只是告诉系统,这块空间我不要了。至于何时被真正回收,那是系统的事。由系统的垃圾回收机制的几个算法决定。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP