`

说说free命令

 
阅读更多

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字段。

分享到:
评论

相关推荐

    Linux系统命令top,ps,kill,free,vmstat等命令的源码

    3. **free命令**:`free`用来查看系统中的物理内存和交换内存的使用情况。通过分析源码,我们可以看到它是如何读取`/proc/meminfo`文件来获取内存统计数据的,以及如何计算和展示不同类型的内存(如已用、空闲、缓存...

    free命令详解

    ### free命令详解 #### 命令概述 `free`命令是Linux系统中一个非常重要的工具,用于报告系统中物理内存、虚拟内存的使用情况。它可以帮助用户了解系统的内存使用状态,判断系统是否存在内存瓶颈等问题。 #### 命令...

    Linux上的free命令详解

    在Linux系统中,`free`命令是一个非常实用的工具,用于查看系统内存的状态,包括物理内存(RAM)和交换空间(Swap)。通过分析`free`命令的输出,我们可以获取到系统内存使用的详细信息,这对于系统管理员监控和优化...

    嵌入式Linux内存管理之free命令

    内存监控是系统管理的一个重要环节,而free命令作为Linux系统中常用的内存状态查看工具,能够帮助管理员快速了解系统内存的使用情况。 Free命令提供了系统中物理内存和交换空间(swap)的当前状态,包括总量、已...

    freeradius连接mysql数据库+linux常用60个命令

    ### Freeradius连接MySQL数据库及Linux常用60个命令知识点详解 #### Freeradius连接MySQL数据库安装配置过程 **Freeradius**是一款广泛应用于无线网络认证的开源软件,支持多种认证协议,包括PAP、CHAP、MS-CHAP、...

    检测Linux内存使用情况的free命令的10个例子

    Linux是有名的开源操作系统之一,它拥有着极其巨大的命令集。...  free命令用于检测物理内存和交换内存已使用量和可用量(默认单位为KB)。下面演示命令的使用情况。  # free  total used free 

    linux free命令详解

    《深入解析Linux free命令》 Linux操作系统中,监控系统资源的使用情况是日常管理的重要一环,其中`free`命令便是用来查看系统内存使用状态的工具。本文将详细介绍`free`命令的使用方法和解析其输出结果,以帮助...

    yiyulianzhou#PHP-NOTES#free命令1

    free命令free命令是用来查看内存占用情况, -m表示以M为单位显示, -h表示以方便阅读的方式显示参数说明total 内存总数used 已经使用的内存数f

    Linux的free命令来显示系统中空闲和已使用的内存.docx

    Linux中的`free`命令是一个非常实用的工具,用于监控系统中的内存使用情况,包括空闲、已用、共享、缓存等各项指标。这个命令对于系统管理员来说是必不可少的,因为它可以帮助他们确保服务器的健康运行,及时发现...

    FreeRDP的安装文档

    FreeRDP可以使用xfreerdp命令连接到远程桌面,例如: xfreerdp -u [username] -p [password] [IPADDRESS] 如果启用多媒体重定向功能,可以使用以下命令: xfreerdp -u [username] -p [password] --plugin drdynvc...

    freeRadius安装配置说明书 完全文档

    1.编译安装:使用tarball安装FreeRadius,执行configure、make和make install命令 2.配置安装:编辑radiusd.conf文件,配置FreeRadius服务器的基本参数 第四章_FreeRadius配置 FreeRadius配置主要包括以下几个方面...

    FreeRDP-FreeRDP-1.0.1-217-gc0fcf6a.zip_FreeRDP_freerdp安卓下载_remot

    在本案例中,我们讨论的是针对Android平台的FreeRDP版本,文件名"FreeRDP-FreeRDP-1.0.1-217-gc0fcf6a.zip_FreeRDP_freerdp安卓下载_remote"暗示这是一款更新到特定Git提交哈希(c0fcf6a)的Android应用。...

    ubuntu rdp连接windows系统 freerdp

    1. 快捷安装:使用 `apt-get` 命令安装 FreeRDP:`apt-get install freerdp-x11` 2. 源码安装:首先下载 FreeRDP 的源代码,然后编译安装。 ``` git clone https://github.com/FreeRDP/FreeRDP.git cd FreeRDP apt-...

    Linux free命令用法详解

    Linux free命令 Linux free命令用于显示内存状态。 free指令会显示内存的使用情况,包括实体内存,虚拟的交换文件内存,共享内存区段,以及系统核心使用的缓冲区等。 语法free [-bkmotV][-s ] 参数说明: -b 以Byte...

    bugfree bugfree bugfree bugfree bugfree

    bugfree bugfree bugfree bugfree bugfree bugfree bugfree bugfree bugfree bugfree bugfree bugfree bugfree

    FreeRDP-Configuration-Manual_FreeRDP_

    在Ubuntu或Debian上,可以通过`apt-get`命令安装: ```bash sudo apt-get update sudo apt-get install freerdp-x11 ``` 在Fedora或CentOS系统中,可以使用`yum`或`dnf`: ```bash sudo yum install freerdp # 或 ...

    FreeRadius客户端和服务器配置

    在安装过程中,我们需要使用 `./configure`、`make` 和 `make install` 命令来编译和安装 FreeRadius。 1. 安装 FreeRadius 客户端:下载 FreeRadius 客户端源代码,解压并编译安装。 2. 安装 FreeRadius 服务器:...

    windows下编译FreeRDP.zip

    1. **获取源码**:打开Git Bash,使用`git clone https://github.com/FreeRDP/FreeRDP.git`命令克隆FreeRDP的源代码仓库至本地。 2. **创建构建目录**:在FreeRDP源码目录外创建一个新的目录,例如`build`,然后...

    c51_Freemodbus.rar_c51 freemodbus_free modbus C51_freemodbus C51

    《深入理解C51 FreeMODBUS:构建嵌入式Modbus通信系统》 在工业自动化领域,Modbus协议因其简单、可靠的特点而被广泛应用。FreeMODBUS是一个由奥地利开发者编写的开源项目,专为嵌入式系统设计,实现了对Modbus协议...

    FreeModbusstm32f103移植.rar_FreeModBus_FreeModbus裸机_freemodbus_STM

    FreeModbus是一个开源的、免费的Modbus协议实现库,广泛应用于嵌入式系统中,尤其是基于STM32F103系列微控制器的设备。本文将深入探讨FreeModbus在STM32F103上的移植过程以及相关知识点。 1. **Modbus协议**: ...

Global site tag (gtag.js) - Google Analytics