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 条评论
登录 后参与评论

相关文章

来自专栏大数据文摘

麻省理工三位教授教你一步步创建自己的R程序包(附完整教程下载)

1873
来自专栏java一日一条

Java 线程池的理论与实践

前段时间公司里有个项目需要进行重构,目标是提高吞吐量和可用性,在这个过程中对原有的线程模型和处理逻辑进行了修改,发现有很多基础的多线程的知识已经模糊不清,如底层...

1485
来自专栏我是业余自学C/C++的

实验一 查看CPU和内存,用机器指令和汇编指令编程

1993
来自专栏程序员互动联盟

【专业技术】8大你不得不知的Android调试工具

1. 查看当前堆栈 1) 功能:在程序中加入代码,使可以在logcat中看到打印出的当前函数调用关系 2) 方法: new Exception(“print ...

66513
来自专栏有趣的django

Django用户登录与注册系统

一、创建项目 1.1.创建项目和app django-admin startproject mysite_login python manage.py sta...

2K7

Web服务器压力测试工具Siege

Siege是一款HTTP压力测试和基准测试的实用工具,可用于在压力条件下对Web服务器的性能进行测量。它的评估依据包括传输数据量、服务器的响应时间、事务处理速率...

3283
来自专栏游戏杂谈

Linux下使用rsync同步文件

遇到的问题是几台游戏服务器,有一台新的服务器之前已经copy(Linux的scp命令)过文件上去,但在测试的过程中发现还是图片无法正常不显示出来,然后用http...

4702
来自专栏xcywt

Linux下检测内存泄露的工具 valgrind

参考:http://www.cnblogs.com/sunyubo/archive/2010/05/05/2282170.html 几乎是照抄参考过来的,只不过...

5409
来自专栏开发与安全

进程控制块PCB结构 task_struct 描述

注:本分类下文章大多整理自《深入分析linux内核源代码》一书,另有参考其他一些资料如《linux内核完全剖析》、《linux c 编程一站式学习》等,只是为了...

2798
来自专栏北京马哥教育

Django 1.11官方教程翻译

一直以来由于英语废所以极端抵触看英文文档。感觉人还是要逼一下自己,所以就有了这篇翻译。如果有翻译错误的地方欢迎在评论中指正。 Let’s learn by e...

6366

扫码关注云+社区

领取腾讯云代金券