说说free命令
来源:互联网 发布:修改图片大小的软件 编辑:程序博客网 时间:2024/04/26 19:50
free是个常用命令,几乎每个接触、使用linux的用户都会用到它。但往往对它的统计输出会有一些困惑,这一方面和Linux内存管理机制有关,另一方面Linux在内存统计上也确实有些不足和问题。
关键在于两个字段,buffers和cached。
你经常会发现Linux系统用了一段时间后,内存所剩无几,free命令,一看,内存全跑到 buffers和cached里面了;这个现象是正常的。访问过的磁盘文件的元数据及内容,内核都会缓存起来。这些缓存就是磁盘缓存。
Linux磁盘缓存设计特点(设计理念):
除了系统运行必须的一小部分保留外,只要有剩余内存,只要需要,就会用给磁盘缓存。(没有一个参数可以让你限定缓存的上限。2.6内核之前有一个限定参数,后来给取消了)
所以会经常看到内存所剩无几的现象,这是缓存机制导致的,对应用是透明,在有内存需要时,这些内存会释放。这个过程对应用是透明的,应用可以认为系统的可用内存包括buffers和cached。
这种设计,在大多数服务器应用场景下都有比较好的性能表现。可以说是比较可取的。
设计本身没有问题,但free命令显示的buffers和cached并不能和磁盘缓存完全对应,这是实现细节上的不足和问题。
1. buffers和cached包含了不属于磁盘缓存的内容。
由于buffers和cached实际上就是内核为所有文件映射分配的物理页的总和(page cache)。
但内核中的“文件概念”是广泛的,不仅包含了真正位于磁盘上的文件,还包含了为特殊需要创建的虚拟文件,比如:
进程间的共享内存(通过shmget API创建的内存),内核建立一个虚拟的文件和共享内存关联起来。(通过pmap命令你可以看到进程拥有的共享内存地址空间的映射字段是/SYSVXXXX字样,不是匿名的)。
非常的不幸,这些虚拟文件映射关联的page,也被算入了free命令显示的cached字段。但这部分内存没有缓存属性,在内存不足时不能按缓存的方式来回收。(使用echo 3 >/proc/sys/vm/drop_caches,无法释放掉这部分内存)
这个问题,会带来一些麻烦。比如,按照常规理解,某产品设计内存占用过高告警的条件是,空闲内存+buffers+cached小于内存总和的20% 。一般情况下没有问题,但如果产品使用了大量的共享内存,告警将失去作用。
2. buffers和cached遗漏了部分属于磁盘缓存的内容。
还是由于buffers和cached只是内核为所有文件映射分配的物理页的总和。在文件系统方面,还有一部分缓存是不和文件映射相关联的,比如内核分配的inode对象,在文件关闭时,并不会立即释放,具备缓存的属性。这部分不在基于文件映射的页面里,而是通过slab(内核内存池)分配的。
这个问题,也会带来一些麻烦,比如某产品的一个现网问题,系统物理内存用了80%,但free top命令显示,用户进程没有占用、cached buffer也没有占用,于是担心是不是内核层内存泄露了,担心会有宕机风险。
经过分析,其实就是之前做了类似"find /“ 这样的操作,导致内核分配了太多的inode对象,并且缓存起来了。但站在用户层来看,会比较困惑和担心。
通过echo 3 >/proc/sys/vm/drop_caches可以释放这部分内存,这从侧面也证明了这部分确实属于缓存的范畴。
在最新的SUSE11 SP1系统上,free命令已经把这部分内存包含到了cached字段。
- 说说free命令
- free命令
- free命令
- 命令FREE
- free 命令
- free命令
- free命令
- free命令
- free命令
- free命令
- free 命令
- free命令
- free命令
- Free 命令
- free命令
- free命令
- free命令
- free命令
- SAP DOI调用Excel例子
- 锁表机制
- 开博啦
- 数据挖掘之关联规则挖掘之Apriori算法实现
- SAP Archiving (归档)
- 说说free命令
- 浮点数的比较(转)
- Linux可用内存统计方法
- Enhancement
- 一直寻求的,灵魂__摘自复旦大学陈果教授<大学生活导论>
- SMARTFORM & SAPScript
- LSMW
- QT多线程类数组同时开启几十个线程
- ALV,TABLE TREE等一些控件