标签:
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%"
标签:
原文地址:http://www.cnblogs.com/mengwenlu/p/4794743.html