• 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%"
    

      

    我可能什么都想要
  • 相关阅读:
    Offer快到碗里来,囊中之物-CAS
    SQL 两表一对多关联,主表某字段保存所有关联的id
    No Feign Client for loadBalancing defined
    Clean Code读书笔记 3--类
    Clean Code读书笔记(2)---函数
    Clean Code读书笔记(1)---有意义的命名
    [CF1354D] Multiset
    [CF1365E] Maximum Subsequence Value
    [CF1358D] The Best Vacation
    [CF463C] Gargari and Bishops
  • 原文地址:https://www.cnblogs.com/mengwenlu/p/4794743.html
Copyright © 2020-2023  润新知