linux free命令输出的每一列的含义

Linux中,free命令用于查看内存状态。本文详细解释了free命令输出的每一列,包括total、used、free、shared、buffers、cached以及swap的含义。cached和buffers是RAM中的数据,分别用于缓存读取和写入的数据。swap则是当物理内存不足时,将部分内存换出到硬盘,以扩大内存空间。内存使用率准确计算应排除buffers和cached。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

free

linux中,free命令用来查看内存状态。在一台linux主机上,使用free命令后,得到如下结果:

 

#free
             total       used       free     shared    buffers     cached
Mem:      16467424   15696636     770788          0     158636    7059612
-/+ buffers/cache:    8478388    7989036
Swap:            0          0          0

(注:该主机为6u机器,7u机器情况不同。怎么查看版本:uname -r | grep -oP '..x86_64$' | sed 's/.x86_64//g')

此时所有的数据默认都是 KB,如果想要得到MB, 则输入free -m

#free -m
             total       used       free     shared    buffers     cached
Mem:         16081      15285        796          0        154       6901
-/+ buffers/cache:       8229       7852
Swap:            0          0          0

对于输出的第一行,我们先纵向看,可以发现除去第一列,后面一共有六列,分别为total、used、free、shared、buffers、cached

  • total:物理内存大小,就是机器实际的内存
  • used:已使用的内存大小,这个值包括了 cached 和 应用程序实际使用的内存
  • free:未被使用的内存大小
  • shared:共享内存大小,是进程间通信的一种方式
  • buffers:被缓冲区占用的内存大小
  • cached:被缓存占用的内存大小

对于Mem对应的行:total = used + free

下面一行,代表应用程序实际使用的内存:

  • 前一个值表示 - buffers/cached,即 used - buffers/cached,表示应用程序实际使用的内存。
  • 后一个值表示 + buffers/cached,即 free + buffers/cached,表示理论上都可以被使用的内存。
  • 这两个值相加=total

所以说我们在说机器的内存使用率的时候,简单的使用used/total,并不准确,应为total不代表应用程序实际使用过的内存,只有减去buffers/cached才准确,所以计算公式应该为:(used -buffers-cached)/total,结果则为应用程序实际使用内存的内存使用率。用shell命令可以这么写:

free |grep Mem|awk -F ' ' '{printf("%.2f",($3-$7-$6)/$2)}'

第三行表示 swap 的使用情况:总量、使用的和未使用的。swap硬盘上交换分区的使用大小。设计的目的就是当上面提到的+buffers/cache表示的可用内存都已使用完,新的读写请求过来后,会把内存中的部分数据写入磁盘,从而把磁盘的部分空间当做虚拟内存来使用。

那么具体上面提到的cached、buffers、sharded以及swap分别是什么东西呢?下面具体分析一下。

首先,linux中是如何使用内存和磁盘数据的?
答:当有应用需要读写磁盘数据时,由系统把相关数据从磁盘读取到内存,如果物理内存不够,则把内存中的部分数据导入到磁盘,从而把磁盘的部分空间当做虚拟内存来使用,也称为Swap。如果给所有应用分配足够的内存后,物理内存还有剩余,linux会尽量再利用这些空闲内存,以提高整体I/O效率,其方法是把这部分剩余内存再划分为cached和buffers两部分加以利用。

分析下Cached的场景

Cached

在系统在进行的时候,从磁盘读取到内存的数据在被相关应用程序读取后,如果有剩余内存,则这部分会存入cached,以备再次读取,避免重复磁盘。所以,有程序进行大量的读文件的操作时,会发现内存使用率上去了。这时候,如果有其他程序要使用内存的时候,linux会把没有人使用的cache释放掉,给其他运行的程序使用。

注:此处cached,是代表内存中的cache,而非cpu的高速缓存。

验证下这个场景:

首先,1、用free -m命令看下开始时内存的使用情况:

#free -m    
             total       used       free     shared    buffers     cached
Mem:         16081      15057       1023          0        155       6655
-/+ buffers/cache:       8246       7834
Swap:            0          0          0

2、用 dd 命令创建一个 50M 的文件:

dd if=/dev/zero of=test.log bs=1M count=50

3、再来看一下内存信息:、

#free -m    
             total       used       free     shared    buffers     cached
Mem:         16081      15211        869          0        155       6706
-/+ buffers/cache:       8349       7732
Swap:            0          0          0

我们可以发现cached由6655增加到了6706,增加了51M,差不多是我刚创建的test.log的文件大小,有1M的误差,应该是主机上其他程序的影响。

我们可以推断test.log的内容,都在cached中,此时我们读取它的话就会很快:

#time cat test.log >/dev/null

real    0m0.019s
user    0m0.000s
sys     0m0.019s

我们手动清除一下cached:

#echo 1 > /proc/sys/vm/drop_caches

#free -m
             total       used       free     shared    buffers     cached
Mem:         16081       8169       7912          0          4         95
-/+ buffers/cache:       8069       8011
Swap:            0          0          0

重新读取下test.log

#time cat test.log >/dev/null

real    0m0.331s
user    0m0.000s
sys     0m0.033s

读取时间已经从0.019s变成了0.331s。

Buffers

当一个应用程序在内存中修改过数据后,因为写入磁盘速度相对较低,在有空闲内存的情况下,这些数据会先存入buffers,这以后某个时间再写入磁盘,从而应用程序可以继续后面的操作,而不必等待这些数据写入磁盘的操作。这样设计是为了把分散的写操作集中进行,减少磁盘碎片和磁盘的反复寻道,从而提高系统性能。liunux有一个守护进程定期清空缓存内容(写入磁盘),也可以通过sync命令手动执行。

有个例子:我们从电脑向u盘拷贝东西时,明明看到文件已经拷贝完了,但系统还是会提示 U 盘正在使用中。过了一会(或者手动sync),才显示才结束。这就是 buffer 的原因,拷贝程序把东西放到 buffer 之后,但是 U 盘还没有写完。卸载设备时会清空缓存,所以有时候卸载设备要等上一段时间。

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

Swaps

swap 是实现虚拟内存的重要概念。如果系统的负载太大,内存被用完,可能会出现严重的问题。swap 就是把硬盘上一部分空间当做内存使用,正在运行程序会使用物理内存,把没有正在使用的内存放到硬盘,这叫做 swap out;而把硬盘 swap 部分的内存重新放到物理内存中,叫做 swap in。swap 可以再逻辑上扩大内存空间,但是会造成系统变慢,因为硬盘读写速度很慢。

参考:https://www.cnblogs.com/tudachui/p/11970595.html

参考:https://cizixs.com/2015/10/01/linux-memory-management-through-free/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值