关键在于两个字段,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命令的人,一看就清楚了
解释一下Linux上free命令的输出。 下面是free的运行结果,一共有4行。为了方便说明,我加上了列号。这样可以把free的输出看成一个二维数组FO(Free Output)。例如: FO[2][1] = 24677460 FO[3][2] = 10321516 1 2 ...
Linux系统命令源码包,包含Top,Free,ps,kill等命令
Linux是有名的开源操作系统之一,它拥有着极其巨大的命令集。... free命令用于检测物理内存和交换内存已使用量和可用量(默认单位为KB)。下面演示命令的使用情况。 # free total used free
作为一名linux系统管理员,监控内存的使用状态是非常重要的,监控内存最常使用的命令有free、top等,下面是某个系统free的输出
free命令free命令是用来查看内存占用情况, -m表示以M为单位显示, -h表示以方便阅读的方式显示参数说明total 内存总数used 已经使用的内存数f
本篇文章主要介绍了linux free命令详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
freeradius2.1.8 连接mysql5.1安装配置过程
bugfree bugfree bugfree bugfree bugfree bugfree bugfree bugfree bugfree bugfree bugfree bugfree bugfree
Linux free命令 Linux free命令用于显示内存状态。 free指令会显示内存的使用情况,包括实体内存,虚拟的交换文件内存,共享内存区段,以及系统核心使用的缓冲区等。 语法free [-bkmotV][-s ] 参数说明: -b 以Byte...
Linux的free命令来显示系统中空闲和已使用的内存.docx
free 命令能够显示系统中物理上的空闲和已用内存,还有交换内存,同时,也能显示被内核使用的缓冲和缓存。这些信息是通过解析文件 /proc/meminfo 而收集到的。 不带任何选项运行 free 命令会显示系统内存,包括空闲...
(1)BUGFREE好文章 (2)cisco技术 (3)loadrunner脚本录制 ...(11)路由器配置命令 (12)企业防火墙安全防护配置七大问题 (13)网站功能测试 (14)在 Windows xp 上安装 GreenAMP 和 BugFree 的详细步骤 (15)其他
苹果系统终端的常用命令,MAC OS X 系统终端的常用命令 OSX 采用的Unix文件系统,所有文件都挂在跟目录 / 下面,所以不在要有Windows 下的盘符概念。 你在桌面上看到的硬盘都挂在 /Volumes 下。
FreeMODBUS一个奥地利人写的Modbus协议。它是一个针对嵌入式应用的一个免费(自由)的通用MODBUS协议的移植。Modbus是一个工业制造环境中应用的一个通用协议
Freeman-Durden极化分解代码
FreeCAD 手册 是另一种更线性的方式,来呈现FreeCAD帮助信息。它做成了一本书的形式,也会善意地引导您进入FreeCAD世界。
freemodbus-STM32F103裸机成功移植,内含word移植说明文档超详细
FreeRADIUS-server for windows