TOP: VIRT, SHR, RES, DATA, CODE, SWAP , Free Command

来源:互联网 发布:台湾电视剧星星知我心 编辑:程序博客网 时间:2024/04/29 14:04

文章来源http://www.crazyshell.org/blog/?p=97

写服务端程序,对这几个值深入认识很重要,网上也有很多帖子讲这个概念的,但是大多都是出自几个作者的名下的 转载. 说的也比较笼统, 比如RES=DATA+CODE 但是很多实际情况并不是这样.

从下面的程序来分析这个值的真正含义.

查看源代码
打印帮助
1int main(void) {
2 
3    while(1) {
4        ;
5    }
6    return0;
7 
8}

运行这个程序后来看看这几个值情况:

VIRT  是这个进程最大能够占用的内存空间,是个额定值,虚拟的!

RES     为进程占用的实际内存的大小, 也就是在内存条中占用的大小(物理内存),当然不包含被置换的大小

%MEM 是进程占用的物理内存的百分比

SHR  是共享内存大小, 也是额定的 表示这个程序可能被其它程序共享到的大小

CODE 进程的代码段在实际内存中占用的空间大小

DATA 是程序运行时需要使用的数据空间(数据+栈),

SWAP 是交换分区的大小,被置换的!

.. 从上面的图可以得出

VIRT(4000) = RES(280) + SWAP(3720)

但是

RES(280) != CODE(4) + DATA(188)

这是为什么呢? 试试下面这段代码:

查看源代码
打印帮助
1#include <stdio.h>
2int main(int argc,const char *argv[])
3{
4    char* a = (char*)malloc(104857600);
5    /*memset(a, 0, 104857600);*/
6    while(1) ;
7    return0;
8}

实验发现:

data也是额定的 也就是说 当你malloc时就会显示的大小 ,而RES值不会进行变化, 但是当向malloc的这段内存中进行 memset 或者写数据时 RES 才会趋向于 data+code

查看源代码
打印帮助
1top -p 1309, 1882 查看某一进程

c 显示全路径

W 写入配置文件

Usage of Top Command: http://www.thegeekstuff.com/2010/01/15-practical-unix-linux-top-command-examples/

free命令可以查看内存占用情况, 可以 使用-k , -m , -g 分别表示以KB, MB, GB显示

比如按照MB显示内存数据:

这台电脑是虚拟机, 内存比较少, 只有1G多点, 从显示的列表来详细说下:

total表示总共内存, used表示使用了多少内存, free表示还有多少内存没被使用, shared表示多个进程共享的内存大小

其中buffers和cached表示磁盘缓冲大小,buffers表示OS用于缓冲写到磁盘的数据, cached表示OS缓冲从磁盘读出来的数据 , 两者都是由OS管理的.

另外与之相应的是

-/+ buffers/cache: 是从一个进程的角度去看的系统的内存占用情况, 其中used表示OS使用了多少内存, free表示OS还有多少内存没有被使用(是从一个进程角度去看的), 和OS角度不同,OS认为已经使用了126M, 还有875M没有使用. 但是从进程角度看buffers/cached是为了提高I/O性能的, 当进程需要使用内存的时候,这块内存是可以很快被回收的. 所以从进程角度看可用内存=OS(free) + buffers + cached

swap为交换分区大小, 一般used为0, 但是OS调度策略是和swappiness大小相关的, 默认值为60, 它的意思是若OS要使用内存, 有60%的概率使用swap, 所以有时候内存还有空间但是OS会用swap大小比如下面这张情况:

所以若尽可能的使用内存可以降低swappiness大小,可通过修改/etc/sysctl.conf文件, 在之后追加一行vm.swappiness=10

若机器不能重启的话, 可以通过

sysctl -w vm.swappiness=10 这个命令来临时修改.