经常在CentOS系统中使用top命令查看系统系统各种资源的占用数据,有些参数实在疑惑,故写此博客汇总写。

top命令窗口

Tasks: 103 total,   2 running, 101 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.3%us,  0.3%sy,  0.0%ni, 99.3%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   1019492k total,   816120k used,   203372k free,   132280k buffers
Swap:        0k total,        0k used,        0k free,   432264k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                      
21293 root      10 -10  256m  32m 7704 S  0.7  3.3   0:02.29 ovs-vswitchd                                                                                  
 1580 root      20   0  741m  10m 6376 S  0.3  1.1   1:44.95 AliYunDun                                                                                     
    1 root      20   0 19284 1504 1224 S  0.0  0.1   0:00.79 init                                                                                          
    2 root      20   0     0    0    0 S  0.0  0.0   0:00.00 kthreadd                                                                                      
    3 root      20   0     0    0    0 S  0.0  0.0   0:00.08 ksoftirqd/0                                                                                   
    5 root       0 -20     0    0    0 S  0.0  0.0   0:00.00 kworker/0:0H                                                                                  
    6 root      20   0     0    0    0 S  0.0  0.0   0:00.41 kworker/u30:0                                                                                 
    7 root      RT   0     0    0    0 S  0.0  0.0   0:00.00 migration/0                                                                                   
    8 root      20   0     0    0    0 S  0.0  0.0   0:00.00 rcu_bh                                                                                        
    9 root      20   0     0    0    0 S  0.0  0.0   0:00.00 rcuob/0                                                                                       
   10 root      20   0     0    0    0 S  0.0  0.0   0:00.00 rcuob/1                                                                                       
   11 root      20   0     0    0    0 S  0.0  0.0   0:00.00 rcuob/2                                                                                       
   12 root      20   0     0    0    0 S  0.0  0.0   0:00.00 rcuob/3                                                                                       
   13 root      20   0     0    0    0 S  0.0  0.0   0:00.00 rcuob/4                                                                                       
   14 root      20   0     0    0    0 S  0.0  0.0   0:00.00 rcuob/5                                                                                       
   15 root      20   0     0    0    0 S  0.0  0.0   0:00.00 rcuob/6                                                                                       
   16 root      20   0     0    0    0 S  0.0  0.0   0:00.00 rcuob/7                                                                                       
   17 root      20   0     0    0    0 S  0.0  0.0   0:00.00 rcuob/8 

常见的参数大家都理解,重点说明如下几个参数:

VIRT:virtual memory usage。Virtual这个词很神,一般解释是:virtual adj.虚的, 实质的, [物]有效的, 事实上的。到底是虚的还是实的?让Google给Define之后,将就明白一点,就是这东西还是非物质的,但是有效果的,不发生在真实世界的,发生在软件世界的等等。这个内存使用就是一个应用占有的地址空间,只是要应用程序要求的,就全算在这里,而不管它真的用了没有。写程序怕出错,又不在乎占用的时候,多开点内存也是很正常的。

RES:resident memory usage。常驻内存。这个值就是该应用程序真的使用的内存,但还有两个小问题,一是有些东西可能放在交换盘上了(SWAP),二是有些内存可能是共享的。

SHR:shared memory。共享内存。就是说这一块内存空间有可能也被其他应用程序使用着;而Virt - Shr似乎就是这个程序所要求的并且没有共享的内存空间。

DATA:数据占用的内存。如果top没有显示,按f键可以显示出来。这一块是真正的该程序要求的数据空间,是真正在运行中要使用的。

因此,DATA的含义比较确定,甚至可以用程序读取的数据量计算出来;SHR是一个潜在的可能会被共享的数字,如果只开一个程序,也没有别人共同使用它;VIRT里面的可能性更多,比如它可能计算了被许多X的库所共享的内存;RES应该是比较准确的,但不含有交换出去的空间;但基本可以说RES是程序当前使用的内存量。