zoukankan      html  css  js  c++  java
  • free 详解

    原文连接:(感谢博主)

    https://www.cnblogs.com/cpw6/p/11711817.html 

    https://blog.csdn.net/knowledgeaaa/article/details/13774203

    https://blog.csdn.net/crisschan/article/details/46606459 

    https://www.cnblogs.com/pipci/p/11399250.html

    1、解释

    total 总物理内存 :188G
    used 实际使用的内存 :3.7G
    free 剩余空闲内存:575M
    shared 程序使用的共享内存:32G
    available 还可以被 应用程序使用的内存大小 151G
    shared 程序分配被共享使用的内存
    buff/cache 184G


    2、buff/cache为什么会这么大?

    (1)linux的内存管理机制的思想为了保证内存利用率最大化,内核会把剩余的内存申请为cached,而cached不属于free范畴。当 系统运行时间较久,会发现cached很大,对于有频繁文件读写操作的系统,这种现象会更加明显。

    (2)在linux的内存分配机制中,优先使用物理内存,当物理内存还有空闲时(还够用),不会释放其占用内存,就算占用内存的程序已经被关闭了,该程序所占用的内存用来做缓存使用,对于开启过的程序、或是读取刚存取过得数据会比较快

    (3)Linux 为了提升读写性能,会消耗一部分内存资源缓存磁盘数据,对于内核来说,buffer 和 cache 其实都属于已经被使用的内存。但当应用程序申请内存时,如果 free 内存不够,内核就会回收 buffer 和 cache 的内存来满足应用程序的请求。这就是稍后要说明的 buffer 和 cache。

    3、shared :一般由程序分配,比如pg库里面指定了shared_buffers=32G,就意味着这只能被pg进程使用(大白话:这内存就是pg用的)
    应用程序可用内存:   available = total - used - shared


    4、在Linux的内存管理中,这里的buffer指Linux内存的:Buffer cache。这里的cache指Linux内存中的:Page cache

    (1)Page cache主要用来作为文件系统上的文件数据的缓存来用,尤其是针对当进程对文件有read/write操作的时候。如果你仔细想想的话,作为可以映射文件到内存的系统调用:mmap是不是很自然的也应该用到page cache?在当前的系统实现里,page cache也被作为其它文件类型的缓存设备来用,所以事实上page cache也负责了大部分的块设备文件的缓存工作。

    (2)Buffer cache则主要是设计用来在系统对块设备进行读写的时候,对块进行数据缓存的系统来使用。这意味着某些对块的操作会使用buffer cache进行缓存,比如我们在格式化文件系统的时候。一般情况下两个缓存系统是一起配合使用的,比如当我们对一个文件进行写操作的时候,page cache的内容会被改变,而buffer cache则可以用来将page标记为不同的缓冲区,并记录是哪一个缓冲区被修改了。这样,内核在后续执行脏数据的回写(writeback)时,就不用将整个page写回,而只需要写回修改的部分即可。

    5、swap 

    在Linux下,SWAP的作用类似Windows系统下的“虚拟内存”。当物理内存不足时,拿出部分硬盘空间当SWAP分区(虚拟成内存)使用,从而解决内存容量不足的情况。

    SWAP意思是交换,顾名思义,当某进程向OS请求内存发现不足时,OS会把内存中暂时不用的数据交换出去,放在SWAP分区中,这个过程称为SWAP OUT。当某进程又需要这些数据且OS发现还有空闲物理内存时,又会把SWAP分区中的数据交换回物理内存中,这个过程称为SWAP IN。

    当然,swap大小是有上限的,一旦swap使用完,操作系统会触发OOM-Killer机制,把消耗内存最多的进程kill掉以释放内存。

    6、swap分区占用shell脚本查看

    #!/bin/bash
    
    ###############################################################################
    
    # 日期 : 2015-09-10
    
    # 作者 : wangtenghe 
    
    # Email : secure1@sina.com
    
    # 版本 : 2.0
    
    # 脚本功能 : 列出正在占用swap的进程。
    
    ###############################################################################
    
    echo -e "PID		Swap		Proc_Name"
    
     
    
     for pid in `ls -l /proc | grep ^d | awk '{ print $9 }'| grep -v [^0-9]`
    
    # /proc目录下所有以数字为名的目录(进程名是数字才是进程,其他如sys,net等存放的是其他信息)
    
     do
    
          if [ $pid -eq 1 ];then continue;fi # Do not check init process
    
    # 让进程释放swap的方法只有一个:就是重启该进程。或者等其自动释放。
    
    # 如果进程会自动释放,那么我们就不会写脚本来找他了,找他都是因为他没有自动释放。
    
    # 所以我们要列出占用swap并需要重启的进程,但是init这个进程是系统里所有进程的祖先进程
    
    # 重启init进程意味着重启系统,这是万万不可以的,所以就不必检测他了,以免对系统造成影响。
    
            grep -q "Swap" /proc/$pid/smaps 2>/dev/null #检查是否占用swap分区
    
             if [ $? -eq 0 ];then 
    
              swap=$(gawk '/Swap/{ sum+=$2;} END{ print sum }' /proc/$pid/smaps) #统计占用的swap分区的大小 单位是KB 
    
               proc_name=$(ps aux | grep -w "$pid" | awk '!/grep/{ for(i=11;i<=NF;i++){ printf("%s ",$i); }}')   #取出进程的名字
    
              if [ $swap -gt 0 ];then    #判断是否占用swap  只有占用才会输出
    
              echo -e "$pid	${swap}	$proc_name"
    
              fi
    
              fi
    
             done | sort -k2 -n | gawk -F'	' '{   
    
    
    
            if($2<1024)
    
               printf("%-10s	%15sKB	%s
    ",$1,$2,$3);
    
            else if($2<1048576)
    
               printf("%-10s	%15.2fMB	%s
    ",$1,$2/1024,$3);
    
            else
    
          printf("%-10s	%15.2fGB	%s
    ",$1,$2/1048576,$3);
    
                                                }'
  • 相关阅读:
    mysql配置参数
    nginx配置https,重定向后https变成了http
    网速测试工具
    批量清理mysql进程
    新版本django中的path不能使用正则表达式
    巨好看的xshell配色
    zabbix 基于sendmail发送邮件相关问题
    curl分析请求的各个部分耗时情况
    wqs二分的边界
    oauth2
  • 原文地址:https://www.cnblogs.com/wangyong-blog/p/14213247.html
Copyright © 2011-2022 走看看