linux内存使用率详解

free命令结果如下:

i2000:~ # free
             total       used       free     shared    buffers     cached
Mem:      24157516   23714828     442688    7100040     881324   18425668
-/+ buffers/cache:    4407836   19749680
Swap:     12583332     178792   12404540

  

第一行 (可以理解为从操作系统的角度来看内存分配)

   

total

总物理内存大小。

used

已分配的大小,注意,对操作系统来说任何被使用的内存都是used。

free

未被分配的物理内存大小。

shared

共享内存大小,主要用于进程间通信,例如Oracle会使用上GB的共享内存。

buffers

主要用于块设备数据缓冲,例如记录文件系统的metadata(目录、权限等等信息)。

cached

主要用于文件内容缓冲

# 这里补充一下关于文件系统的常识 ^_^

# 文件系统实际上可以粗略的划分为两个部分:

# (1)metadata:即通常说的元数据,包括目录结构、文件的名字、大小、修改时间、权限等等信息。

# (2)filedata:即文件中真正存储的内容。

# 由于计算机中各个部件之间的速度相差很大,通常情况下CPU的cache最快,其次是内存,最慢的自然就是硬盘等外部设备了。

# 而越慢的设备越廉价,所以硬盘就被用来存储大量数据(有一天内存不要钱了大家就不用在被buffer、cache这个东东折磨了 <( ̄︶ ̄)>)。

# 所以,文件系统就被放在了硬盘上(不可避免的悲剧~~)。但是由于硬盘速度实在太慢了,为了改善IO性能,最终就诞生了"缓存"这一概念。

# "缓存"实际上就是在内存中划分一块区域作为硬盘和进程之间的缓冲区域,写进程把数据写到这里然后就干其他事情去了,读进程需要时先在这里找,找不到再去找硬盘,这样就大大提高了读写效率,同时缩短了IO等待时间,否则你在linux上运行man iptables 这样的命令的时候每次都会等N久。。。

# 这里还有一个"物理内存"和"虚拟内存"的概念,这个概念比较难讲,大家去google一些大牛的帖子看吧,涉及的东西太多了。。。。

   

所以,这里,buffer实际上是用来存储了文件系统的元数据(这样我们每次ls就会很快了 ^_^),而cache则缓存了近期读写过的文件的内容(第一次读文件会很慢,以后就会很快,就是因为有cache的存在),把这个理解了free命令就理解了大半了。

  

第二行 (可以理解为从应用程序的角度来看内存分配)

   

-/+ buffers/cached: 22556 102232

这里的 -/+ 实际上分别指的是 - buffers/cached 和 + buffers/cached 两个部分。

   

- buffers/cached

= used(第一行) - buffers - cached

实际上是程序当前"真实使用"的"物理内存"的大小。

+ buffers/cached

= buffers + cached

两个加起来可以理解为"暂时借给"系统作为"缓冲区"使用的内存大小。

   

大家做一下简单的加减法就清楚了:

从应用多角度来说,实际上系统还可以分配给他的内存有这么多:11356(free) + 15308(buffers) + 75568(cached)= 102232(free)

而系统所拥有的总的物理内存大小 113432 = 22556( - buffers/cached) + 102232 (+ buffers/cached)

   

所以,第一行的数据实际上是从操作系统角度来看的。

对于操作系统来说已分配的内存表示已经被某些数据所占据了,但是具体这些数数据是用来做什么的他不会去理会。

实际上正如前面所说,这部分物理内存被拿来做"缓存"了。

shell脚本为:

#!/bin/bash


#from os view
os_used=$(free | grep "Mem" | awk '{print $3}')
total=$(free | grep "Mem" | awk '{print $2}')
os_rate=$(echo "scale=4;$os_used/$total"|bc)
percent_part1=$(echo $os_rate | cut -c 2-3)
percent_part2=$(echo $os_rate | cut -c 4-5)
echo "Operation system memery is already use: $percent_part1.$percent_part2%"

#from user view
user_free_tmp=$(free | grep "Mem:" | awk '{print $4 " " $6 " " $7}')
user_free=$(echo $user_free_tmp | awk '{print $1+$2+$3}')
user_used=`expr $total - $user_free`
user_rate=$(echo "scale=4;$user_used/$total"|bc)
part1=$(echo $user_rate | cut -c 2-3)
part2=$(echo $user_rate | cut -c 4-5)
echo "User system memery is already use: $part1.$part2%"

  

我可能什么都想要
原文地址:https://www.cnblogs.com/mengwenlu/p/4794743.html