专栏首页C/C++基础Linux命令(37)——free命令

Linux命令(37)——free命令

1.简介

free命令用于显示系统内存使用情况,包括物理内存(Physical Memory)、虚拟内存(Swap Memory)、共享内存(Shared Memory)以及内核使用的缓冲(Buffers)与缓存(Cached)大小。在Linux系统监控的工具中,free命令是最经常使用的命令之一。

free命令的所有输出值都是从/proc/meminfo中读取的。

2.命令格式

free [-b | -k | -m] [-o] [-s delay ] [-t] [-l] [-V]

3.选项说明

-b:以Byte为单位显示内存使用情况;
-k:以KB为单位显示内存使用情况;
-m:以MB为单位显示内存使用情况;
-g:以GB为单位显示内存使用情况;
-o:不显示缓冲区调节列;
-s [间隔秒数]:以指定间隔时间持续观察内存使用状况;
-t:显示内存总和列;
-l:显示详细的低内存和高内存统计;
-V:显示版本信息。

4.常用示例

(1)使用GB为单位显示内存使用情况。

[root@test ~]#free -g
             total       used       free     shared    buffers     cached
Mem:            62         61          0          0          2         56
-/+ buffers/cache:          2         59
Swap:            1          0          1

显示结果描述:

第一行释义如下: total:物理内存总大小; used:物理内存已使用大小; free:物理内存空闲大小; shared:系统中分配的共享内存大小,此列已经deprecated,数值一般为0。当然在一些系统上也可能不是0,主要取决于free命令是怎么实现的。如果为0,要想查看系统分配的共享内存大小,请查看/proc/meminfo的Shmem一项; buffers:系统分配的buffer大小; cached:系统分配的cache大小。包含了共享内存和tmpfs内存文件系统占用的内存。这两部分内存之和可通过/proc/meminfo的Shmem字段直接获取。

注意:其中 total = used + free,理论空闲内存大小 free2=free1+buffers+cached=58GB,其中free2表示free列第二行的取值。实际上,cached中的共享内存大小和tmpfs内存文件系统大小也是实际被使用的内存,所以正真可用内存大小 real free=free1+buffers+cached-Shmem。Shmem大小具体参见/proc/meminfo的Shmem字段取值。

第二行表示减去与增加buffers和cache大小,分别对应物理内存的理论已使用和理论空闲大小。理论空闲内存大小的计算方法如上文所述,理论已使用大小 used2=used1-(buffers+cache)=3。为什么不是显示的2呢,因为这里存在四舍五入,导致显示有一定误差,使用MB为单位来显示,数值就能对的上了。

第三行swap标识交换分区(即虚拟内存)的大小。如果swap内存有被使用,则说明系统内存不够使用,需要进行扩容。

(2)显示high memory使用情况。

[root@test ~]#free -gl
             total       used       free     shared    buffers     cached
Mem:            62         61          0          0          2         56
Low:            62         61          0
High:            0          0          0
-/+ buffers/cache:          2         59
Swap:            1          0          1

使用-l选项可以查看高低内存使用情况,发现低内存与Mem的使用情况相同,高内存全部为零,为什么会这样呢?先看一下什么是high memory和low memory。

32位的CPU,最大寻址范围为2^32 - 1也就是4G的线性地址空间。Linux简化了分段机制,使得虚拟地址与线性地址总是一致的。linux一般把这个4G的地址空间划分为两个部分:其中0~3G为用户程序地址空间,虚地址0x00000000到0xBFFFFFFF,供各个进程使用;3G~4G为内核的地址空间,虚拟地址0xC0000000到0xFFFFFFFF, 供内核使用。

Linux 内核采用了最简单的映射方式来映射物理内存,即把物理地址+PAGE_OFFSET按照线性关系直接映射到内核空间。PAGE_OFFSET大小为0xC0000000。但是Linux内核并没有把整个1G空间用于线性映射,而只映射了最多896M物理内存,预留了最高端的128M虚拟地址空间给IO设备和其他用途。所以,当系统物理内存较大时,超过896M的内存区域,内核就无法直接通过线性映射直接访问了。这部分内存被称作high memory。相应的可以映射的低端物理内存称为Low memory。L

那kernel就永远无法访问到超过896M的内存了吗?不是的,kernel已经预留了128M虚拟地址,我们可以用这个地址来动态的映射到high memory,从而访问high memory。所以预留的128M除了映射IO设备外,还有一个重要的功能是提供了一种动态访问high memory的一种手段(kmap主要就是干这个的,当然还有vmalloc)。

结论: (1)high memory针对的是物理内存,不是虚拟内存。 (2)high memory也是被内核管理的(有对应的page结构),只是没有映射到内核虚拟地址空间。当内核需要分配high memory时,通过kmap等从预留的地址空间中动态分配一个地址,然后映射到high memory,从而访问这个物理页。high memory映射到内核地址空间一般是暂时性的映射,不是永久映射。 (3)high memory和low memory一样,都是参与内核的物理内存分配,都可以被映射到内核地址空间,也都可以被映射到用户地址空间。 (4)物理内存<896M时,没有high memory,因为所有的内存都被kernel直接映射了。 (5)64位系统下不会有high memory,因为64位虚拟地址空间非常大(分给kernel的也很大),完全能够直接映射全部物理内存。

因为测试的机器是64位机器,所以不存在high memory,故全部为零。

5.常见问题

5.1buffers与cached的区别

(1)buffer(缓冲) buffer是用于存储速度不同步的设备或优先级不同的设备之间传输数据的区域。缓冲(buffers)是为磁盘的读写设计的,把分散的写操作集中进行,减少磁盘碎片和硬盘的反复寻道,从而提高系统性能。

buffers就是存放要输出到disk(块设备)的数据,缓冲满了一次写,提高IO性能(内存 -> 磁盘)。

(2)cache(缓存) cache经常被用在磁盘的I/O请求上,如果有多个进程都要访问某个文件,于是该文件便被做成cache以方便下次被访问,这样可提供系统性能。

缓存是把读取过的数据保存起来,重新读取时若命中(找到需要的数据)就不要去读硬盘了,若没有命中就读硬盘。其中的数据会根据读取频率进行组织,把最频繁读取的内容放在最容易找到的位置,把不再读的内容不断往后排,直至从中删除。

cached 就是存放从disk上读出的数据,常用的缓存起来,减少io(磁盘 -> 内存)。

buffer 和 cache,两者都是RAM中的数据。简单来说,buffer是即将要被写入磁盘的,cache是被从磁盘中读出来的。

5.1buffers与cached的释放

buffers主要用于缓存文件系统中的元数据信息(dentries、inodes),cached主要用于缓存文件系统中的pages信息,在必要时buffers、cached所占内存可被回收用于其他应用程序。

设置以下值可以将文件系统缓存的clean pages、dentries、inodes移出内存,腾出可用内存:

[plain] view plain copy
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  

以上操作并非具有破坏性,因为他们并不会将dirty caches释放掉,为了获得更多的可用内存,用户可以先执行sync操作将dirty caches写回磁盘,使之变为clean caches(cache中的内容还是保留在内存中),然后在设置drop_caches。

这里释放完成后,发现cached数值仍然不为0,原因是free命令计算的cached包含了共享内存的大小,共享内存需要使用ipcrm [ -M key | -m id ]命令来释放。buffers的数值也不为0,因为系统时刻在运行着,释放完成后,buffers又被分配出去。


参考文献

[1]free命令.Linux命令大全 [2]Linux free命令:buffer 与 cache 区别 [3]linux内核的high memory概念详解 [4]Linux上的free命令详解 [5]由free命令想到的 [6]linux内存总结

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • *** glibc detected *** malloc(): memory corruption

    在Linux Server上不好模拟出来:不过若是先malloc,再越界memset,再free此内存块,然后malloc新内存块就会出现类似错误。

    Dabelv
  • 操作系统简介

    操作系统(Operating System,OS)是计算机系统组成要素,是管理和控制计算机硬件与软件资源的基本软件。操作系统是用户和计算机交互的接口,也是计算机...

    Dabelv
  • 内存池介绍与经典内存池的实现

    利用默认的内存管理函数new/delete或malloc/free在堆上分配和释放内存会有一些额外的开销。

    Dabelv
  • C/C++ 学习笔记七(内存管理)

    工作中经常使用到C/C++,为对C有个比较深刻的了解,重新拾起学习C的任务。在看书的同时,记录下思考的过程,也记录下重要的知识点。

    Celebi
  • 看你用错了没!Linux必知必会之内存使用统计命令free

    本文由马哥教育面授班25期学员推荐,转载自互联网,作者为Alli,内容略经小编改编和加工,观点跟作者无关,最后感谢作者的辛苦贡献与付出。 本文详细介绍了Linu...

    小小科
  • 微信小程序60秒倒计时插件

    为了帮助开发者更便捷的使用微信小程序的短信验证码功能,特别是初学者更好的使用,榛子云短信特地开发了60秒倒计时插件,效果:

    用户4432598
  • 小程序分享及用户信息授权等接口能力的调整通知

    针对近期部分小程序接口能力使用不合理的情况,微信公众平台将对下列能力进行调整。开发者可在最新版开发者工具内,选择最新基础库版本体验。调整方案具体如下,请开发者尽...

    中微信通
  • Vivado综合属性:ASYNC_REG

    在异步跨时钟域场合,对于控制信号(通常位宽为1-bit)常使用双触发器方法完成跨时钟域操作,如下图所示。此时对于图中标记的1号和2号触发器需要使用综合属性ASY...

    Lauren的FPGA
  • JS魔法堂:被玩坏的innerHTML、innerText、textContent和value属性

    一、前言                                 由于innerText并非W3C标准属性,因此我们无法在FireFox中使用它(修正:...

    ^_^肥仔John
  • yii2 restful 风格搭建(二)接口认证

    1、HTTP 基本认证: \yii\filters\auth\HttpBasicAuth

    botkenni

扫码关注云+社区

领取腾讯云代金券