zoukankan      html  css  js  c++  java
  • linux内存查看方法

    cat /proc/meminfo

    查看RAM使用情况,最简单的方法是通过/proc/meminfo。这个动态更新的虚拟文件实际上是许多其他内存相关工具(如:free / ps / top)等的组合显示。/proc/meminfo列出了所有你想了解的内存的使用情况。进程的内存使用信息也可以通过/proc/<pid>/statm 和 /proc/<pid>/status 来查看。

    可以在/proc/<pid>/里查看进程的各种信息

    1、free -h/-g/-m

    2、htop

    3、ps aux --sort -rss

    4、ps -aux | sort -k4nr | head -K 如果是10个进程,K=10

      swap空间属于磁盘空间的一部分,独立于主分区(C盘)和扩展分区(再分为逻辑分区DEFG),是在内存不足的情况下,临时作为长久未使用程序的内存被释放后暂时存放的地方,当这些长久未被使用的程序再次被激活后,便从swap中读取保存的内容到内存中。说白了,内存不足,释放未激活进程的内存数据到swap中,未激活进程再次激活,从swap再读取数据到内存中

    关键字解释:

      

      1、众所周知,现代操作系统都实现了“虚拟内存”这一技术,不但在功能上突破了物理内存的限制,使程序可以操纵大于实际物理内存的空间,更重要的是,“虚拟内存”是隔离每个进程的安全保护网,使每个进程都不受其它程序的干扰。

      Swap空间的作用可简单描述为:当系统的物理内存不够用的时候,就需要将物理内存中的一部分空间释放出来,以供当前运行的程序使用。那些被释放的空间可能来自一些很长时间没有什么操作的程序,这些被释放的空间被临时保存到Swap空间中,等到那些程序要运行时,再从Swap中恢复保存的数据到内存中。这样,系统总是在物理内存不够时,才进行Swap交换。
      需要说明一点,并不是所有从物理内存中交换出来的数据都会被放到Swap中(如果这样的话,Swap就会不堪重负),有相当一部分数据被直接交换到文件系统。例如,有的程序会打开一些文件,对文件进行读写(其实每个程序都至少要打开一个文件,那就是运行程序本身),当需要将这些程序的内存空间交换出去时,就没有必要将文件部分的数据放到Swap空间中了,而可以直接将其放到文件里去。如果是读文件操作,那么内存数据被直接释放,不需要交换出来,因为下次需要时,可直接从文件系统恢复;如果是写文件,只需要将变化的数据保存到文件中,以便恢复。但是那些用malloc和new函数生成的对象的数据则不同,它们需要Swap空间,因为它们在文件系统中没有相应的“储备”文件,因此被称作“匿名”(Anonymous)内存数据。这类数据还包括堆栈中的一些状态和变量数据等。所以说,Swap空间是“匿名”数据的交换空间。
    如何设置Swap分区大小
      我记得曾经有人对Swap分区大小的设置这样评论过:“只要不怕浪费硬盘的话越大越好,因为linux内核在物理内存完全用完之前不会去动swap”;不过根据我的经验,可能不是这样喔!太大的 swap 空间会造成 kernel 以为有巨大的内存空间而毫不节制的想要把数据捉进内存中,从而导致 kernel 一直在做 memory swap,连带拖慢系统响应时间。
     

    ===============================================================================================================================================================  

    解释一下Linux上free命令的输出。

      下面是free的运行结果,一共有4行。为了方便说明,我加上了列号。这样可以把free的输出看成一个二维数组FO(Free Output)。例如:

    • FO[2][1] = 24677460
    • FO[3][2] = 10321516  
                       1          2          3          4          5          6
    1                total       used       free     shared    buffers     cached
    2  Mem:          7.7G       4.4G       3.3G       452K        30M       548M
    3  -/+ buffers/cache:       3.9G       3.8G
    4  Swap:           0B         0B         0B

      free的输出一共有四行,第四行为交换区的信息,分别是交换的总量(total),使用量(used)和有多少空闲的交换区(free)

      free输出的第二行和第三行都是说明内存使用情况的。第一列是总量(total),第二列是使用量(used),第三列是可用量(free)。

      第二行的输出是从操作系统(OS)的角度来看的。也就是说,从OS的角度来看,计算机上一共有:

    • 24677460KB(缺省时free的单位为KB)物理内存,即FO[2][1];
    • 在这些物理内存中有23276064KB(即FO[2][2])被使用了;
    • 还用1401396KB(即FO[2][3])是可用的,并不代表应用程序就剩这么内存可用了

    这里得到第一个等式:

    • FO[2][1] = FO[2][2] + FO[2][3]

    FO[2][4]表示被几个进程共享的内存的,现在已经deprecated,其值总是0(当然在一些系统上也可能不是0,主要取决于free命令是怎么实现的)。

    FO[2][5]表示被OS buffer住的内存。FO[2][6]表示被OS cache的内存。在有些时候buffer和cache这两个词经常混用。不过在一些比较低层的软件里是要区分这两个词的,看老外的洋文:

    • A buffer is something that has yet to be "written" to disk. 
    • A cache is something that has been "read" from the disk and stored for later use.

    也就是说buffer是用于存放要输出到disk(块设备)的数据的,而cache是存放从disk上读出的数据。这二者是为了提高IO性能的,并由OS管理。

    Linux和其他成熟的操作系统(例如windows),为了提高IO read的性能,总是要多cache一些数据,这也就是为什么FO[2][6](cached memory)比较大,而FO[2][3]比较小的原因。我们可以做一个简单的测试:

    1. 释放掉被系统cache占用的数据;
      echo 3>/proc/sys/vm/drop_caches
    2. 读一个大文件,并记录时间;
    3. 关闭该文件;
    4. 重读(从缓存Cache中读)这个大文件,并记录时间;

    第二次读应该比第一次快很多。原来我做过一个BerkeleyDB的读操作,大概要读5G的文件,几千万条记录。在我的环境上,第二次读比第一次大概可以快9倍左右。

      free输出的第三行是从一个应用程序的角度看系统内存的使用情况。

    • 对于FO[3][2],即-buffers/cache,表示一个应用程序认为系统被用掉多少内存;
    • 对于FO[3][3],即+buffers/cache,表示一个应用程序认为系统还有多少内存;

    因为被系统cache和buffer占用的内存可以被快速回收,所以通常FO[3][3]比FO[2][3]会大很多。

    这里还用两个等式:

    • FO[3][2] = FO[2][2] - FO[2][5] - FO[2][6]
    • FO[3][3] = FO[2][3] + FO[2][5] + FO[2][6]

    这二者都不难理解。

      free命令由procps.*.rpm提供(在Redhat系列的OS上)。free命令的所有输出值都是从/proc/meminfo中读出的。在系统上可能有meminfo(2)这个函数,它就是为了解析/proc/meminfo的。

      TOP个字段的含义:

    • 第一行:14:36:17--系统当前时间;125 days, 3:19--系统启动了多久;1 user--当前登录到系统的用户,更确切的说是登录到用户的终端数,同一个用户同一时间对系统多个终端的连接将被视为多个用户连接到系统,这里的用户数也将表现为终端的数目;load average--为当前系统负载的平均值,后面的三个值分别为1分钟前、5分钟前、15分钟前进程的平均数,一般的可以认为这个数值超过 CPU 数目时,CPU 将比较吃力的负载当前系统所包含的进程;
    • 第二行(Tasks):“246 total”为当前系统进程总数;“1 running”为当前运行中的进程数;“244 sleeping”为当前处于等待状态中的进程数;“0 stoped”为被停止的系统进程数;“1 zombie”为被复原的进程数;
    • 第三行(Cpus)  :分别表示了 CPU 当前的使用率;30.7%us  用户空间占用CPU百分比;1.5%sy  内核空间占用CPU百分比;0.0%ni  用户进程空间内改变过优先级的进程占用CPU百分比;67.8% id  空闲CPU百分比;0.0% wa  等待输入输出的CPU时间百分比;0.0% hi;0.0% si;0.0%st 
    • 第四行(Mem)  :分别表示了内存总量、当前使用量、空闲内存量、以及缓冲使用中的内存量;
    • 第五行(Swap)  :表示类别同第四行(Mem),但此处反映着交换分区(Swap)的使用情况。通常,交换分区(Swap)被频繁使用的情况,将被视作物理内存不足而造成的。
    • 第六行 空行,输入h可以查看帮助信息
    • 第七行序号:PID  进程id;PPID  父进程id;RUSER  Real user name;UID  进程所有者的用户id;USER  进程所有者的用户名;GROUP  进程所有者的组名;TTY  启动进程的终端名。不是从终端启动的进程则显示为 ? ;PR  优先级;NI  nice值。负值表示高优先级,正值表示低优先级;P  最后使用的CPU,仅在多CPU环境 下有意义;%CPU  上次更新到现在的CPU时间占用百分比;TIME  进程使用的CPU时间总计,单位秒 ;TIME+  进程使用的CPU时间总计,单位1/100秒  ;%MEM  进程使用的物理内存 百分比  ; VIRT  进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES  ; SWAP  进程使用的虚拟内存中,被换出的大小,单位kb。 RES  进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA  r  CODE  可执行代码占用的物理 内存大小,单位kb  ; DATA  可执行代码以外的部分(数据 段+栈)占用的物理 内存大小,单位kb ; SHR  共享内存大小,单位kb  ; nFLT  页面错误次数 ; nDRT  最后一次写入到现在,被修改过的页面数。  S  进程状态。D =不可中断的睡眠状态;R =运行; S =睡眠 T =跟踪/停止 Z =僵尸进程   COMMAND  命令名/命令行WCHAN  若该进程在睡眠,则显示睡眠中的系统函数名;Flags  任务标志,参考 sched.h   

  • 相关阅读:
    记录一次使用npm包管理器的过程
    Markdown---锚点
    Tomcat应用部署
    记录项目中使用SoapUI进行webservice接口测试
    python--使用logging库自定义日志输出
    python--configparser库处理配置文件
    python--excel操作插件openpyxl
    python--使用pycharm调试代码
    【云剪贴板】你不要点开啊!!!!
    【每天一个爆零小技巧】个人用的程序小技巧及其他_自用
  • 原文地址:https://www.cnblogs.com/shengulong/p/7373582.html
Copyright © 2011-2022 走看看