前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Linux命令(37)——free命令

Linux命令(37)——free命令

作者头像
恋喵大鲤鱼
发布2018-08-03 11:04:34
1.6K0
发布2018-08-03 11:04:34
举报
文章被收录于专栏:C/C++基础C/C++基础

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内存总结

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018年02月10日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.简介
  • 2.命令格式
  • 3.选项说明
  • 4.常用示例
  • 5.常见问题
    • 5.1buffers与cached的区别
      • 5.1buffers与cached的释放
      • 参考文献
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档