Linux运维之内存分析

free命令解析

free显示系统中空闲和已使用的物理内存和交换内存的总量,以及内核使用的缓冲区和高速缓存。 该信息是通过解析/proc/meminfo收集的。man free命令的英文介绍:

free  displays the total amount of free and used physical and swap memory in the system, as well as the buffers and caches used by the kernel. The information is gathered by parsing /proc/meminfo.

一、详解

  • 看看free支持的参数

[root@localhost home]# free --help

Usage:
 free [options]

Options:
 -b, --bytes         show output in bytes(以字节显示输出
 -k, --kilo          show output in kilobytes(以kb为单位显示输出。注:kilobytes是以1000为换算单位,而kibibyte才是以1024为换算单位)
 -m, --mega          show output in megabytes(以MB为单位显示输出)
 -g, --giga          show output in gigabytes(以GB为单位显示输出)
     --tera          show output in terabytes
     --peta          show output in petabytes
 -h, --human         show human-readable output(以人类可读的方式输出)
     --si            use powers of 1000 not 1024(K、M、G以1000为换算单位,而不是以1024换算单位)
 -l, --lohi          show detailed low and high memory statistics(显示详细的低内存和高内存统计信息)
 -t, --total         show total for RAM + swap(显示内存+交换空间的总内存)
 -s N, --seconds N   repeat printing every N seconds(每N秒打印一次)
 -c N, --count N     repeat printing N times, then exit(与-s配合使用,间隔N秒打印N次,然后退出)
 -w, --wide          wide output(完整格式输出)

     --help     display this help and exit(显示帮助信息并退出)
 -V, --version  output version information and exit(输出版本信息并退出)

 注:kilobytes、megabytes、gigabutes等都是以1000位换算单位,kibibyte、mebibyte、gibibyte等是以1024为换算单位。

二、不同版本显示效果

版本:v3.2.8

free -h
             total       used       free     shared    buffers     cached
Mem:           15G        15G       263M       1.9M       322M        12G
-/+ buffers/cache:       2.2G        13G
Swap:         8.0G       381M       7.6G

版本:v3.3.10

free -h
              total        used        free      shared  buff/cache   available
Mem:            15G        5.9G        626M        1.2G        9.1G        8.0G
Swap:           29G         28M         29G
free -wh
              total        used        free      shared     buffers       cache   available
Mem:            15G        5.9G        610M        1.2G        2.8G        6.3G        8.0G
Swap:           29G         28M         29G

1.total:总的可用物理内存。一般是总物理内存除去一些预留的和操作系统本身的内存占用,是操作系统可以支配的内存大小。这个在v3.2.8和v3.3.10一样。这个值是/proc/meminfo中MemTotal的值。
2.used:已使用的物理内存。
  在v3.2.8,这个值是(total - free 或者 buffers + cached (第一行的buffer和cached,有时候需要加上shared)+ -buffers/cache(第二行第二列的值))得出来的。可以说是系统已经被系统分配,但是实际并不一定正在被真正的使用,其空间可以被回收再分配的。
  在v3.3.10,这个值是(total - free - cache - buffers)得出来的,是真正目前正在被使用的内存。
3.free:系统还未使用的物理内存。这个值是/proc/meminfo中MemFree的值。

4.shared:共享内存的空间。这个值是/proc/meminfo中Shmem的值。

5.buffers:用来给块设备做缓存的大小。这个值是/proc/meminfo中Buffers的值。

6.cached:v3.2.8中的项。这个值是/proc/meminfo中Cached的值。
   cache:v3.3.10中的项。这个值是/proc/meminfo中(Cached + Slab)的值。
     在buff/cache是(buffers+cache)的值。free -w可以分开显示。
7.available:v3.3.10中的项。这个值才是可以使用的内存,不过(available + used) < total,也就是available < (free + cache + buffers)。
      而在v3.2.8中(free + cache + buffers)是一般认为的可用内存,既然在新版本中有这个available数据,应该是更准确的吧。

      毕竟并不是所有的未使用的内存就一定是可用的。

      这个值是取的/proc/meminfo中MemAvailable的值,如果meminfo中没有这个值,

      会依据meminfo中的Active(file),Inactive(file),MemFree,SReclaimable等值计算一个。

8.-/+ buffers/cache:v3.2.8版本有这一行,v3.3.10 已经移除了。官方解释:https://gitlab.com/procps-ng/procps/commit/f47001c9e91a1e9b12db4497051a212cf49a87b1

9.Swap:Swap分区是在系统物理内存不够用时由系统内存管理程序将很长时间没有操作内存数据临时保存到Swap分区中,以提高可用内存额度的一种机制。当那些程序要再次重新运行时,会再从Swap分区恢复之前保存的数据到内存中。
  
相关操作会导致额外的IO开销,特别是,如果内存使用率已经非常高,而同时IO性能也不是很好的情况下,该机制其实会起到相反的效果:不仅系统性能提升较小(因为内存使用率已经非常高了),而且由于频繁的内存到SWAP的切换操作,会导致产生大量额外的IO操作,导致IO性能进一步降低,最终反而降低了系统总体性能。
  
内存与磁盘性能有10倍以上的差距。Mysql等业务当内存数据临时保存到SWAP分区时,数据库的整体服务质量会大大下降。为了保证您业务的正常运行,当服务器内存不足时,建议您增加内存空间。(云服务器一般未分配swap分区,需要自己配置。可以通过free -m查看Swap这一行,total这一列有没有值,来确定有没有swap分区)

对于v3.2.8版本来验证以下个指标的关系

total:used + free

used :buffers + cached (maybe add shared also) + -buffers/cache(used)

-buffers/cache(used) 表示第三行的used列的值。

+buffers/cache(free) 表示第三行free列的值。

  -buffers/cache(used) :used - buffers - cached

  +buffers/cache(free) :free+buffers+cached

 

三、buffers和cached的解释

buffers是指用来给块设备做的缓冲大小,它只记录文件系统的metadata以及 tracking in-flight pages.

cached是用来给文件做缓冲。

那就是说:buffers是用来存储目录里面有什么内容,权限等等,并跟踪正在为特定块设备写入或读取的内存。。而cached直接用来缓存我们打开的文件。也就是说buffers是用于存放将要写入或读取到disk的块设备数据的,而cache是存放从disk上读出的数据。这二者是为了提高IO性能的,并由系统管理。

关于cached,当应用程序读写文件的时候,Linux内核为了提高读写效率与速度,会将文件在内存中进行缓存,这部分内存就是Cache Memory(缓存内存)。即使应用程序运行结束后,Cache Memory也不会自动释放。这就会导致在Linux系统中应用程序频繁读写文件后,你会发现可用物理内存变少。前阵子我就碰到这样一个案例,有位网友说他服务器上没有跑什么应用程序,但是内存都被耗尽了。其实真正的原因只是内存被用来做buffer和cached缓存数据了,而他不了解情况,以为free列就是剩余的内存,以为内存被耗尽了。如果free部分很小,但是buffer和cached部分较大的话,完全没有必要担心,缓存内存(Cache Memory)在你需要使用内存的时候会自动释放。关于buffers与cached,Don't Panic! Your ram is fine! 这篇文章对这个有个非常有意思的描述。


buffers/cahed手动释放测试

释放前

复制代码
[root@ ~]# free -h
                       total       used       free         shared    buffers     cached
Mem:                  996M       531M       465M        56K        42M       119M
-/+ buffers/cache:               369M       626M
Swap:                  1.5G       234M       1.2G
[root@ ~]# 
复制代码

 

使用命令手动释放

复制代码
[root@ ~]# echo 3 > /proc/sys/vm/drop_caches
[root@ ~]# free -h
                     total       used       free     shared    buffers     cached
Mem:                996M       391M       604M        56K       420K        26M
-/+ buffers/cache:             364M       631M
Swap:               1.5G       234M       1.2G
[root@ ~]# 
复制代码

 手动释放后我们看到 第一行Mem的used和free有了很大的提升,我们上述的观点得到了验证

 使用find 命令让buffers增加

复制代码
[root@ backup]# free -h;find .>/dev/null;free -h
             total       used       free     shared    buffers     cached
Mem:          996M       397M       598M        56K       2.6M        32M
-/+ buffers/cache:       362M       633M
Swap:         1.5G       234M       1.2G
total used free shared buffers cached Mem: 996M 415M 581M 56K 17M 32M -/+ buffers/cache: 364M 631M Swap: 1.5G 234M 1.2G [root@ backup]#
复制代码

 

 使用cat 命令让cached增加

复制代码
[root@zwj python]# free -h;find /mydata/backup/python/ -type f|xargs cat>/dev/null 2>&1;free -h
             total       used       free     shared    buffers     cached
Mem:          996M       434M       561M        56K        18M        50M
-/+ buffers/cache:       365M       630M
Swap:         1.5G       234M       1.2G
             total       used       free     shared    buffers     cached
Mem:          996M       767M       228M        56K        20M       367M
-/+ buffers/cache:       379M       617M
Swap:         1.5G       234M       1.2G
复制代码

 

四、总结

(1) 使用 free v3.2.8版本,看内存使用情况,两个办法:
1.看 -/+ buffers/cache 这一行。used 就是已使用的内存;free 就是剩余的内存。
2.看 Mem 这一行。(used - buffers - cached) 是已使用的内存;(free + buffers + cached) 是未使用的内存。
(2) 使用 free v3.3.10版本,看内存占用:
看available就是是剩余可以使用的内存。
看 Mem 这一行。used 是已使用的内存;(free + buff/cache),即(total - used)是未使用的内存;
未使用的内存不代表都可用,所以 available <(total - used)。

 

 

 

 

posted @ 2020-07-11 17:00  赤道上的冰雕  阅读(365)  评论(0编辑  收藏  举报