top命令是Linux下使用相当频繁的一个命令,可是有一天突然发现,原来自己对他还是知之甚少(尤其是内存状态这块儿),所以照着man文档和参阅了一些资料,整理如下
执行方式
top -hv | -bcHisSM -d delay -n iterations -p pid [,pid...]
其中:h 输出帮助信息;v输出版本信息,这些命令行选项多数可以通过交互式命令改变top输出,进入top以后按‘h’可现实交互式的命令清单,如下图
-b: ‘批量模式’,用来将输出重定向到指定文件,一般配合-n 指定输出几次统计信息,使用模式
top -n 3 -b > /tmp/top.tmp
-c: 显示产生进程的完成命令
-H: 线程切换模式,所有独立的线程都会被显示在结果中(以线程为粒度),不加此参数的话,top会以进程为粒度来显示信息
-i: 不显示idled或zombied进程
-s: 安全模式
-S: 累计模式,显示该进程以及他的所有子进程(包括已死的)总共占用的cpu时间
-M: 内存统计相关--显示内存单位(k/M/G)并且显示浮点值(带小数点)的值,如下图
-d: 指定刷新时间,默认刷新时间是3s
-n: 执行状态刷新的次数
-p: 指定pid 多个pid以‘逗号’分开,只显示指定pid进程的状态
字段解释:
PID、PPID(父pid)、USER、GROUP、TTY这些字段都是字面意思,就不多说了。着重说一下cpu和内存相关字段的意思
top默认输出如下
按 f 可以进入交互模式,选择更多的输出项,途中红框内为默认显示的项目
我们选择显示更多的cpu和内存相关的项目,
增加显示项目之后,top输出如下
我们以上图输出介绍个字段cpu和内存相关字段含义:
VIRT -- (kb)任务使用的虚拟内存总量,包含所有交换到内存的code、data和shared libraries plus pages. VIRT = SWAP + RES.只要进程申请了内存,都会计入此值。;例如进程想内核申请了100M内存,此值增加100M,而不管内核实际分配给了多少
RES -- (kb)常驻内存数量,即此任务使用的非交换分区的内存(即物理内存)
SHR -- (kb)任务所使用的共享内存的数量,他只简单的反映了可能与其他进程共享的内存
SHR是RES中”映射至文件”的物理内存总和。包括:
程序的代码段。
动态库的代码段。
通过mmap做的文件映射。
通过mmap做的匿名映射,但指明了MAP_SHARED属性。
注:RES要和SHR结合者看,内核把物理内存分为了两部分,一部分是映射至文件的,一部分是没有映射至文件的即匿名内存,完全和共不共享没有关系!