Chinaunix

标题: Linux内存管理机制的疑惑 [打印本页]

作者: ljok30    时间: 2008-07-07 17:56
标题: Linux内存管理机制的疑惑
现象:有台服务器,在长时间运行后,用top看系统物理内存free只剩下20MB左右,但是cached占了整个系统内存的80%左右,自己的应用进程本身占有的内存并没有什么变化!
一种解释说法:linux对内存的使用上的机制导致,只要used-buffer-cached不是很大,就没有问题!
针对这种说法我做了测试,calloc一块很大的内存,然后写一些数据,然后释放掉内存,cached和buff没有任何变化,used和free在变化!和以上结论有些出入?
疑问:什么情况下,buff会涨?什么情况下,cache会涨?什么时候,cached或buffer的内存会还给系统?

[ 本帖最后由 ljok30 于 2008-7-7 23:35 编辑 ]
作者: epegasus    时间: 2008-07-07 20:09
没释放掉没用的内存?
作者: rainysky    时间: 2008-07-07 20:23
你的现像应该没有什么关系。
Cache是为了以后加快速度用的,内在不够用的时候Cache会释放的。
你自己分配的内在属于匿名内存,释放了就归还系统了,没有cache价值,一般cache的都是磁盘上的文件吧。比如你运行一个程序,第一次运行的时候会很慢,因为要执行的代码都从磁盘读取。然后你退出了,再次运行就会发现快了不少,就因为系统把磁盘上的程序做了cache,第二次直接从内存读的。
没怎么看过LINUX内核代码,以前BSD的代码也许大概可能是这样的,嘿嘿
作者: ljok30    时间: 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 编辑 ]
作者: rainysky    时间: 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吧,因为几乎不可能重用。我所知也就这么多了。
作者: zhoubug    时间: 2008-07-08 09:40
声明:服务器进程有日志的相关操作,怀疑这是引起cache升高的元凶

我做过测试,这个确实是cache升高的原因,只要没有内存泄露cache升高也没问题,很多情况下服务器的free内存会逐步降到很低的水平,
但只要不使用交换应该无妨。
作者: Kevin_zqw    时间: 2008-07-08 18:45
Linux执行的是激进式的缓存机制,只要还有可用内存,就会缓存尽可能多的有用数据

在/proc下面哪里好像可以配置
作者: ljok30    时间: 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一下,防止丢数据。

作者: Alligator27    时间: 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
作者: beepbug    时间: 2008-07-08 21:35
你做free时,只是告诉系统,这块空间我不要了。至于何时被真正回收,那是系统的事。由系统的垃圾回收机制的几个算法决定。
作者: crowsy001    时间: 2008-07-08 22:16
原帖由 rainysky 于 2008/7/8 09:25 发表
cache应该是由内核自动管理的,对用户来说,cache的memory应该可以被当作是free的memory吧。
阈值是肯定有的,如果free为0,那么再做其它事就难了,呵呵。就像不用一个临时变量要交换两个数的值,


有谁知道:不用一个临时变量要交换两个数的值。
请解释如何实现,谢谢。
作者: zhoubug    时间: 2008-07-09 13:14
http://blog.chinaunix.net/u/22520/showart_234910.html
作者: rain_fish    时间: 2010-04-29 09:38
目前我们的服务程序,需要大量的查询数据库操作,而且使用了短连接,即连接数据库,查询, 断开数据库,造成了cached一直在增加,不知道有没有人碰到这样的情况,怎么不让cached增加?
作者: doofy    时间: 2010-04-29 10:42
挖的很有技术含量!
作者: rain_fish    时间: 2010-04-29 11:23
回复 14# doofy


    必须得
作者: darkengine    时间: 2010-06-29 17:32
回一下#11的问题

两变量a,b
执行a = a+b;
      b = a-b;
则可
作者: rain_fish    时间: 2010-06-29 17:46
目前我们的服务程序,需要大量的查询数据库操作,而且使用了短连接,即连接数据库,查询, 断开数据库,造成 ...
rain_fish 发表于 2010-04-29 09:38



    又看到了这篇文章。把这个问题的缘由写出来供大家参考。
我们的服务程序cache增长的原因是写了一个很大的文件,这个文件的长度一直在增长,cache也在增长,直到达到内存最大值就不长了。
作者: 没本    时间: 2010-06-29 18:30
Linux的内存使用策略是只要有空余的内存,就尽量利用起来,DRAM空着也要耗电不是?
现在Windows 7也有样学样,尽量占光内存了。XP则用的原来的分配策略。
cache住的内存当程序进行分配请求时就会归还了,不用紧张。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2