没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
linux
下释放
cache
内存
2008-05-17 00:02 5772 人阅读 评论(1) 收藏 举报
linux 下释放 cache 内存
细心的朋友会注意到,当你在 linux 下频繁存取文件后,物理内存会很快被用光,当程序结束后,内
存不会被正常释放,而是一直作为 caching.这个问题,貌似有不少人在问,不过都没有看到有什么
很好解决的办法.那么我来谈谈这个问题.
先来说说 free 命令
[root@server ~]# free -m
$ $$ $$ $$ $ total$ $$ $ used$ $$ $ free$ $$$shared$ $ buffers$ $$$cached
Mem:$ $$ $$ $$$249$ $$ $$$163$ $$ $$ $86$ $$ $$ $ 0$ $$ $$ $10$ $$ $$ $94
-/+ buffers/cache:$ $$ $$ $58$ $$ $$$191
Swap:$ $$ $$ $ 511$ $$ $$ $ 0$ $$ $$$511
其中:
total 内存总数
used 已经使用的内存数
free 空闲的内存数
shared 多个进程共享的内存总额
buffers Buffer Cache 和 cached Page Cache 磁盘缓存的大小
-buffers/cache 的内存数:used - buffers - cached
+buffers/cache 的内存数:free + buffers + cached
可用的 memory=free memory+buffers+cached
有了这个基础后,可以得知,我现在 used 为 163MB,free 为 86,buffer 和 cached 分别为 10,94
那么我们来看看,如果我执行复制文件,内存会发生什么变化.
[root@server ~]# cp -r /etc ~/test/
[root@server ~]# free -m
$ $$ $$ $$ $ total$ $$ $ used$ $$ $ free$ $$$shared$ $ buffers$ $$$cached
Mem:$ $$ $$ $$$249$ $$ $$$244$ $$ $$ $ 4$ $$ $$ $ 0$ $$ $$ $ 8$ $$ $$$174
-/+ buffers/cache:$ $$ $$ $62$ $$ $$$187
Swap:$ $$ $$ $ 511$ $$ $$ $ 0$ $$ $$$511
在我命令执行结束后,used 为 244MB,free 为 4MB,buffers 为 8MB,cached 为 174MB,天呐都被
cached 吃掉了.别紧张,这是为了提高文件读取效率的做法.
引用[url]http://www.2qyou.com/thread-591-1-1.html[/url] 为了提高磁盘存取效率, Linux 做了一
些精心的设计, 除了对 dentry 进行缓存(用于 VFS,加速文件路径名到 inode 的转换), 还采取了
两种主要 Cache 方式:Buffer Cache 和 Page Cache。前者针对磁盘块的读写,后者针对文件
inode 的读写。这些 Cache 有效缩短了 I/O 系统调用(比如 read,write,getdents)的时间。"
那么有人说过段时间,linux 会自动释放掉所用的内存,我们使用 free 再来试试,看看是否有释放>?
[root@server test]# free -m
$ $$ $$ $$ $ total$ $$ $ used$ $$ $ free$ $$$shared$ $ buffers$ $$$cached
Mem:$ $$ $$ $$$249$ $$ $$$244$ $$ $$ $ 5$ $$ $$ $ 0$ $$ $$ $ 8$ $$ $$$174
-/+ buffers/cache:$ $$ $$ $61$ $$ $$$188
Swap:$ $$ $$ $ 511$ $$ $$ $ 0$ $$ $$$511
MS 没有任何变化,那么我能否手动释放掉这些内存呢???回答是可以的!
/proc 是一个虚拟文件系统,我们可以通过对它的读写操作做为与 kernel 实体间进行通信的一种
手段.也就是说可以通过修改/proc 中的文件,来对当前 kernel 的行为做出调整.那么我们可以通
过调整/proc/sys/vm/drop_caches 来释放内存.操作如下:
[root@server test]# cat /proc/sys/vm/drop_caches
0
首先,/proc/sys/vm/drop_caches 的值,默认为 0
[root@server test]# sync
手动执行 sync 命令(描述:sync 命令运行 sync 子例程。如果必须停止系统,则运行 sync 命令
以确保文件系统的完整性。sync 命令将所有未写的系统缓冲区写到磁盘中,包含已修改的 i-
node、已延迟的块 I/O 和读写映射文件)
[root@server test]# echo 3 > /proc/sys/vm/drop_caches
[root@server test]# cat /proc/sys/vm/drop_caches
3
将/proc/sys/vm/drop_caches 值设为 3
[root@server test]# free -m
$ $$ $$ $$ $ total$ $$ $ used$ $$ $ free$ $$$shared$ $ buffers$ $$$cached
Mem:$ $$ $$ $$$249$ $$ $$ $66$ $$ $$$182$ $$ $$ $ 0$ $$ $$ $ 0$ $$ $$ $11
-/+ buffers/cache:$ $$ $$ $55$ $$ $$$194
Swap:$ $$ $$ $ 511$ $$ $$ $ 0$ $$ $$$511
再来运行 free 命令,发现现在的 used 为 66MB,free 为 182MB,buffers 为 0MB,cached 为 11MB.
那么有效的释放了 buffer 和 cache.
有关/proc/sys/vm/drop_caches 的用法在下面进行了说明
/proc/sys/vm/drop_caches (since Linux 2.6.16)
Writing$$to$$this$$file$$causes the kernel to drop clean caches,
dentries and inodes from memory, causing that memory$$to$$become
free.
To$$free$$pagecache,$$use$$echo 1 > /proc/sys/vm/drop_caches; to
free dentries and inodes, use echo 2 > /proc/sys/vm/drop_caches;
to$ $free$ $pagecache,$ $dentries$$and$$inodes,$$use$$echo$$3$$>
/proc/sys/vm/drop_caches.
Because this is a non-destructive operation$$and$$dirty$$objects
are not freeable, the user should run sync(8) first.
Linux
内存计数详解(读写文件时的缓存机制与
windows
不同,
以致于读写大文件时
cached
值非常大且居高不下)
2008-05-16 23:42 1310 人阅读 评论(0) 收藏 举报
Linux 内存计数详解
$$$$又中计了……
$$$$近几天用 oracle,发现 oracle 狂用内存,经常内存小到 10M 的规模。汗一个,赶快让经理
买了新的 1G 内存来装,上去后发现根本认不出来。加班一多小时才发现 386 内核根本不认高
端内存(HIGHMEM),所以内存极限一直是 896M。以前是 1G 内存,所以看不出来,现在换了
1.5G,看出来了。
$$$$赶快上了一个 2.6.12-1-686 的内核,然后重启,认出来了。不过 free 还是只有 32M 左右,
我们大惊小怪的打电话到 oracle 那里去咨询,得到的答复是要安装完整的补丁,并且要用
oracle 认证过的服务器。oracle 认证了啥服务器?RedHatEnterpriseAS3/4,那个东西要收费的,
而且绝对不便宜。最后无奈,做了一次不启动 oracle 的测试。出乎我们意料的,mysql 吃了多
数的内存。具体造成这种状况的原因是啥呢?
$$$$偶查阅了 linux 内存管理资料,发现 linux 的内存管理计数上讲的东西和 windows 讲的有很
大差异。下面具体列举下几种计数、查看方式和含义。
$$$$total$mem,可以用 top$free 查看出来。
$$$$free$mem,可以用 top$free$vmstat 查看出来。
$$$$used$mem,可以用 top$free 查看出来.
$$$$buffer$mem,可以用 top$free$vmstat 查看出来。
$$$$shared$mem,可以用 free 查看出来。
$$$$swap$mem,可以用 top 查看出来。
$$$$swap$used,可以用 top$vmstat 查看出来。
$$$$cached$mem,可以用 top$free$vmstat 查看出来。
$$$$active$mem,可以用 free$vmstat$-a 查看出来,即 cached$used。
$$$$inactive$mem,可以用 free$vmstat$-a 查看出来,即 cached$free。
$$$$其中 total$mem 是除去系统外的可用内存,系统大约占 1M 多。然后分配给 free$mem 和
used$mem。used$mem 又包括了内核表使用(例如 GDT),程序使用,buffer,cached。所
以
$$$$cached$mem=active$mem+inactive$mem
$$$$total$mem=free$mem+used$mem
$$$$used$mem=内核表使用+程序使用物理内存+buffer$mem+cached$mem
略去内核表使用,这个式子可以变形成这样:
$$$$程序使用总内存=swap$used+程序使用物理内存
$$$$$$$$$$$$$$$$$$$$$$$$$=swap$used+used$mem-buffer$mem-cached$mem
$$$$$$$$$$$$$$$$$$$$$$$$$=total$mem-free$mem+swap$used-buffer$mem-cached$mem
根据所有系统内存管理的恒等式:
$$$$程序使用总内存+一次可申请内存=total$mem+swap$used
我们可以计算出:
$$$$一次可申请内存=free$mem+buffer$mem+cached$mem(事实上要略小于这个值)
$$$$程序使用的部分 swap 出去部分,占用 total 部分,剩下的就是一次可以申请的最大值。多次
申请造成这个值太小就继续向 swap 里面交换。
$
$$$$首先解释 buffer 和 cached 区别。通俗的讲,buffer 中放的是对象数据结构,而 cached 中放
的是无结构的块数据。cached 可以缓冲任何标准的块设备,而不用管是什么东西。其中涉及
写通和写回的概念,大家自己看去吧。
$$$$然后是程序使用物理内存的概念。程序的总内存等于交换出去的部分加上程序使用物理内存。
而程序使用的总内存和各个程序的内存占用是什么关系呢?这个又要涉及共用页面的问题。
$$$$windows 中也有类似概念,如果两个页面内容相同,那么在内存中保留一份就可以了。这个
是动态链接库/动态共享库的理论基础。所以所有进程的 shared$mem 只有一份 copy。进程使
用的 Data+Stack 是数据空间,code 是代码空间,两者和减去 shared$mem 是私有空间,也就
是俗称的进程内存占用。将所有内存占用求和加上 shared$mem 的和,就得到了程序的总内存。
$$$$Linux 的 cached 和 windows 的一个很大差异在于,windows 的磁盘缓存是读写缓存队列。
写入操作和预读取操作在队列中排序。完了就释放了,主要用于平缓读写瓶颈。读取预测机制
才是增加命中的重头。linux 的 cached 读写完了一直不释放,直到内存不足再释放。释放的速
剩余21页未读,继续阅读
资源评论
hewen0204
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- HandTrackingModule.py
- Python基于卷积神经网络的鸟类识别项目源代码,ipynb文件
- 批量将py编译为pyd文件.atbx
- Python项目-学生管理系统
- 图像处理基于matlab图像RGB三色合成分离【含Matlab源码第1发】
- verilog HDL硬件语法设计包括算术运算三人表决器Verilog的阻塞和非阻塞赋值源码例程quartus13.1工程合集
- 【文章话题分类论文】OpenAlex Topic Classification Whitepaper
- linux学习常用命令
- 功率拓扑快速参考指南-ti,TI官方出品
- 开源2023电赛国赛运动目标控制(E题)视觉部分
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功