博文说明【前言】:

    

    本文将通过个人口吻介绍Linux下的free命令及top命令的相关知识,在目前时间点【2017年6月19号】下,所掌握的技术水平有限,可能会存在不少知识理解不够深入或全面,望大家指出问题共同交流,在后续工作及学习中如发现本文内容与实际情况有所偏差,将会完善该博文内容。


本文参考文献引用链接:

 1、http://www.cnblogs.com/imapla/archive/2013/02/15/2912752.html 【好文】
2、http://www.cnblogs.com/coldplayerest/archive/2010/02/20/1669949.html【必看,博主创新的使用数组方式讲解,相当不错】
3、http://www.cnblogs.com/ggjucheng/archive/2012/01/08/2316438.html
4、http://blog.scoutapp.com/articles/2009/07/31/understanding-load-averages【讲解top命令的系统负载,必看必看】
5、https://www.oschina.net/question/234345_42647【CPU部分讲解非常详细】
6、http://blog.csdn.net/dxl342/article/details/53507673
7、
http://www.cnblogs.com/ggjucheng/archive/2012/01/08/2316399.html



正文:


 一:free命令


free命令是显示的当前内存的使用,-m的意思是M字节来显示内容,应该是大家使用最频繁的命令之一,不多说,我们来一起看看

weblogic@YDCK-APP11:~> free -m 
                     total           used           free     shared    buffers     cached
Mem:          15953          15168            785          0        668       8000
-/+ buffers/cache:           6499           9453
Swap:           8189             58               8131
weblogic@YDCK-APP11:~> 


参数讲解:

第一部分(Mem):


total                     物理内存总量: 15953M
used                     已用物理内存量: 15168M
free                      空闲物理内存量: 785M
shared                  当前已经废弃不用,总是0
buffers Buffer       读写缓冲内存区总量:668M
cached Page         缓存内存区总量:8000M

讲解:
第一部分的输出是从操作系统(OS)层面来看的。
也就是说,从OS的角度来看,计算机上一共有:15953M(缺省时free的单位为KB)物理内存;
在这些物理内存中有15168M被使用了;还用785M是可用的;
数学关系:total(15953M) = used(15168M) + free(785M)


第二部分(-/+ buffers/cache):


(-buffers/cache) used内存数:6499M (指第一部分Mem行中的used – buffers – cached)
(+buffers/cache) free内存数: 9453M (指第一部分Mem行中的free + buffers + cached)

讲解:
free输出的第二部分是从应用程序的角度看系统内存的使用情况。

-buffers/cache:也就是used-buffers-cache,表示当前系统中实际被程序吃掉的内存;
+buffers/cache:也就是free+buffers+cache,表示当前系统中还可以挪用分配给程序的实际内存总数;

关于这部分内容,相信应该会有不少人和我之前一样存在疑惑,希望大家现在能看明白。第一部分是OS角度,第二部分是应用程序角度,实际应用中,我们主要看这一部分。

第三部分(Swap):
交换分区,这块就不说了,大家都很清楚

补充:buffers与cached的区别

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 

对于应用程序来说,buffers/cached 是等于可用的,因为buffer/cached是为了提高文件读取的性能,当应用程序需在用到内存的时候,buffer/cached会很快地被回收。
所以从应用程序的角度来说 可用内存=系统free memory+buffers+cached.

buffers是指用来给块设备做缓冲,存放即将要被处理的数据
cached是用来给文件做缓存(速度优于内存),存放已经被处理完毕的数据,如果有请求再次请求这些数据,就不用重新生成,能直接返回这些数据。

也就是说:buffers是用来存储接受的数据,而cached是用来保存我们处理完毕的数据

示例:
一个程序一次只能处理10KB数据,为了提升程序的处理效率,系统在内存中划分出缓冲区,大小为10KB,存放下一次要处理的输入数据,那么这也就意味着,程序不需要等待客户端的数据输入,处理完之后再拿数据接着处理,这里也就是缓冲的概念。
10KB的数据处理完了之后,我们把结果返回给客户端之后,系统同时在内存中划分出缓存区,把结果保存内存中,后续有相同的数据请求时(也就意味着会产生相同的结果),我们直接把在内存中的这个结果返回给客户端,而不需要再重新计算生成结果。

二:top命令

TOP是一个动态显示过程,即可以通过用户按键来不断刷新当前状态.如果在前台执行该命令,它将独占前台,直到用户终止该程序为止.比较准确的说,top命令提供了实时的对系统处理器的状态监视.它将显示系统中CPU最“敏感”的任务列表.该命令可以按CPU使用.内存使用和执行时间对任务进行排序;而且该命令的很多特性都可以通过交互式命令或者在个人定制文件中进行设定.

top - 18:41:57 up 631 days,  5:52,  2 users,  load average: 0.40, 0.40, 0.43
Tasks: 161 total,   1 running, 160 sleeping,   0 stopped,   0 zombie
Cpu(s):  2.2%us,  0.2%sy,  0.0%ni, 97.5%id,  0.0%wa,  0.0%hi,  0.1%si,  0.0%st
Mem:     15953M total,    15259M used,      694M free,      669M buffers
Swap:     8189M total,       58M used,     8131M free,     8090M cached

  PID USER      PR  NI  VIRT  RES  SHR S   %CPU %MEM    TIME+  COMMAND                                                                                                                        
 3720 weblogic  20   0 6158m 4.7g  32m S     18 30.3   1414:00 java                                                                                                                            
 3657 weblogic  20   0  4004  528  436 S      1  0.0  48:07.16 cronolog                                                                                                                        
13241 weblogic  20   0  8920 1168  828 R      0  0.0   0:00.45 top                                                                                                                             
    1 root      20   0 10540  736  700 S      0  0.0   5:13.87 init                                                                                                                            
    2 root      20   0     0    0    0 S      0  0.0   0:19.24 kthreadd                                                                                                                        
    3 root      20   0     0    0    0 S      0  0.0   7:19.45 ksoftirqd/0                                                                                                                     
    6 root      RT   0     0    0    0 S      0  0.0   0:39.72 migration/0                                                                                                                     
    7 root      RT   0     0    0    0 S      0  0.0   2:12.06 watchdog/0                                                                                                                      
    8 root      RT   0     0    0    0 S      0  0.0   0:52.89 migration/1                                                                                                                     
   10 root      20   0     0    0    0 S      0  0.0   1:54.42 ksoftirqd/1                                                                                                                           
   ...省略下方输出...


参数讲解:

第一部分(top,全局信息):

18:41:57                                     #当前系统时间
up 631 days,  5:52                     #系统开机运行时间为631天5小时52分
2 users                                       #当前登录用户数
load average: 0.40, 0.40, 0.43    #系统负载,即任务队列的平均长度。 三个数值分别对应为1分钟、5分钟、15分钟前到现在的平均值。

load average数据是每隔5秒钟检查一次活跃的进程数,然后按特定算法计算出的数值。

这个参数跟服务器的虚拟CPU(也就是处理器的核心)数量有关,一个虚拟CPU对应的一个值范围是0-1,多个虚拟CPU是累加的关系。也就是说,比如我现在就一个虚拟CPU,当前的系统负载的值为1,那就意味着,我的系统处于完全开工状态,也就是使用了全部的容量,我们可以把系统负载比作一条道路,再跑的活跃的程序就相当于在这条路上奔跑的汽车,当值位1的时候,就意味着我这条路上已经跑满了车,如果值为2的数,那么剩下的一倍容量(汽车)就需要等待当前的进程都处理完了之后,才能进入这条道路。

多处理器(CPU)系统中,和处理器的总核心数量挂钩,1表示单核(单车道)的满负载,2表示双核(双车道)的满负载,3表示3核心(三车道)的满负载。

注意:处理器数量和核心数量是两个不同的概念东西。一个处理器中可以包含多个处理器核心,而我们在这里使用的参数的处理器核心,而不是处理器个数,一定要注意。


第二部分(Tasks,进程信息):

161 total                    #系统已经加载的进程总数(161个)
1 running                   #处于运行状态的进程数量(1个)
160 sleeping              #处理休眠状态的进程数量(160个)             
0 stopped                  #处理停止状态的进程数量(0个)              
0 zombie                   #处理僵尸状态的进程数量(0个)


第三部分(Cpu(s),cpu信息)

Cpu(s):  2.2%us,  0.2%sy,  0.0%ni, 97.5%id,  0.0%wa,  0.0%hi,  0.1%si,  0.0%st

这里各个参数值显示的都是百分比。

点数字键1可以展开或合上多个CPU, 如下:
    Cpu0  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
    Cpu1  :  0.0%us,  0.3%sy,  0.0%ni, 99.7%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st

us  -- User CPU time-【用户空间占用CPU百分比】
    CPU花在未调整优先级的(not niced)用户进程的时间。
    The  time  the  CPU  has spent running users’ processes that are not niced.

    注: nice 命令: 调整程序运行的优先级(范围 -20 到 19,越大,优先级越高)
sy  --  System CPU time-【内核空间占用CPU百分比】
    CPU花在内核及其进程上的时间。
    The time the CPU has spent running the kernel and its processes.

ni  --  Nice CPU time    CPU花在调整过优先级的(niced)用户进程的时间。
    The time the CPU has spent running users’ proccess  that  have  been niced.

id  --  ? time    CPU花在空闲等待的时间,也就是空闲CPU百分比

wa  --  iowait-【等待输入输出的CPU时间百分比】
    等待I/O结束的CPU时间。
    Amount of time the CPU has been waiting for I/O to complete.

hi  --  Hardware IRQ-【硬件CPU中断占用百分比】
    CPU花在硬件中断的时间。
    The amount of time the CPU has been servicing hardware interrupts.

si  --  Software Interrupts-【软中断占用百分比】
    CPU花在软件中断的时间。
    The amount of time the CPU has been servicing software interrupts.

st  --  Steal Time-【虚拟机占用百分比】
    The amount of CPU ’stolen’ from this virtual machine by the hypervisor for other tasks (such
 as running another virtual machine).

第四部分(MEM-内存信息)

15953M total                 #物理内存总量
15259M used                 #已使用的物理内存总量
694M free                      #空闲的物理内存总量(不包括缓存和缓冲区)
669M buffers                 #buffer缓存区使用的内存总量

第五部分(Swap,交换分区信息)

8189M total                    #交换分区的总量      
58M used                       #已使用的交换分区总量
8131M free                     #空闲的交换分区总量            
8090M cached                #cached缓存区的交换区总量,这个值按道理用该放在第四部分,实际占用的空间是物理内存,意义请参考前面的free命令,放在第五行是为了美观。

第六部分(进程信息)

  PID USER      PR  NI  VIRT  RES  SHR S   %CPU %MEM    TIME+  COMMAND                                                                                                                        
 3720 weblogic  20   0 6158m 4.7g  32m S     18 30.3   1414:00 java                                                                                                                            
 3657 weblogic  20   0  4004  528  436 S      1  0.0  48:07.16 cronolog                                                                                                                        
13241 weblogic  20   0  8920 1168  828 R      0  0.0   0:00.45 top 
    ...省略...

PID                     #进程ID
USER                  #进程所有者
PR                      #进程优先级
NI                       #nice值,负值表示高优先级,正值表示低优先级
VIRT                   #进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
RES                    #进程使用的,未被换出的物理内存大小,单位kb。RES=CODE+DATA
SHR                   #共享内存大小,单位kb
S                        #进程状态(D=不可中断的睡眠状态,R=运行,S=睡眠,T=跟踪/停止,Z=僵尸进程)
%CPU                #进程启动后所占用的CPU时间百分比,单位1/100秒
%MEM               #进程使用的物理内存百分比
TIME+                #进程使用的CPU时间总计
COMMAND        #任务名称


序号  列名    含义
a    PID     进程id
b    PPID    父进程id
c    RUSER   Real user name
d    UID     进程所有者的用户id
e    USER    进程所有者的用户名
f    GROUP   进程所有者的组名
g    TTY     启动进程的终端名。不是从终端启动的进程则显示为 ?
h    PR      进程优先级
i    NI      nice值。负值表示高优先级,正值表示低优先级
j    P       最后使用的CPU,仅在多CPU环境下有意义
k    %CPU    进程启动后的CPU时间占用百分比
l    TIME    进程使用的CPU时间总计,单位秒
m    TIME+   进程使用的CPU时间总计,单位1/100秒
n    %MEM    进程使用的物理内存百分比
o    VIRT    进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
p    SWAP    进程使用的虚拟内存中,被换出的大小,单位kb。
q    RES     进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
r    CODE    可执行代码占用的物理内存大小,单位kb
s    DATA    可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb
t    SHR     共享内存大小,单位kb
u    nFLT    页面错误次数
v    nDRT    最后一次写入到现在,被修改过的页面数。
w    S       进程状态(D=不可中断的睡眠状态,R=运行,S=睡眠,T=跟踪/停止,Z=僵尸进程)
x    COMMAND 命令名/命令行
y    WCHAN   若该进程在睡眠,则显示睡眠中的系统函数名
z    Flags   任务标志,参考 sched.h


默认情况下仅显示比较重要的 PID、USER、PR、NI、VIRT、RES、SHR、S、%CPU、%MEM、TIME+、COMMAND 列。可以通过下面的快捷键来更改显示内容。 

更改显示内容通过 f 键可以选择显示的内容。按 f 键之后会显示列的列表,按 a-z 即可显示或隐藏对应的列,最后按回车键确定。 
按 o 键可以改变列的显示顺序。按小写的 a-z 可以将相应的列向右移动,而大写的 A-Z 可以将相应的列向左移动。最后按回车键确定。 
按大写的 F 或 O 键,然后按 a-z 可以将进程按照相应的列进行排序。而大写的 R 键可以将当前的排序倒转。

top命令补充:

命令格式:top [-] [d] [p] [q] [c] [C] [S] [s]  [n]

d 指定每两次屏幕信息刷新之间的时间间隔。当然用户可以使用s交互命令来改变之。 
p 通过指定监控进程ID来仅仅监控某个进程的状态。 
q 该选项将使top没有任何延迟的进行刷新。如果调用程序有超级用户权限,那么top将以尽可能高的优先级运行。 
S 指定累计模式 
s 使top命令在安全模式中运行。这将去除交互命令所带来的潜在危险。 
i 使top不显示任何闲置或者僵死进程。 -【这个比较有用】
c 显示整个命令行而不只是显示命令名  -【这个比较有用,组合使用,top -ic】

NTP-slave:~ # top -ic
top - 07:15:19 up 5 days,  1:58,  2 users,  load average: 0.30, 0.18, 0.10
Tasks: 118 total,   1 running, 117 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.3%us,  0.2%sy,  0.0%ni, 99.5%id,  0.1%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   1910720k total,  1809476k used,   101244k free,   200864k buffers
Swap:  4192252k total,        0k used,  4192252k free,  1506872k cached

   PID USER      PR  NI  VIRT  RES  SHR S   %CPU %MEM    TIME+  COMMAND                                                                                                                       
 47347 root      20   0  8916 1112  808 R      2  0.1   0:00.01 top -ic 

其他实用命令
下面介绍在top命令执行过程中可以使用的一些交互命令。从使用角度来看,熟练的掌握这些命令比掌握选项还重要一些。这些命令都是单字母的,如果在命令行选项中使用了s选项,则可能其中一些命令会被屏蔽掉。

Ctrl+L 擦除并且重写屏幕。 
h或者? 显示帮助画面,给出一些简短的命令总结说明。 
k       终止一个进程。系统将提示用户输入需要终止的进程PID,以及需要发送给该进程什么样的信号。一般的终止进程可以使用15信号;如果不能正常结束那就使用信号9强制结束该进程。默认值是信号15。在安全模式中此命令被屏蔽。 
i 忽略闲置和僵死进程。这是一个开关式命令。 
q 退出程序。 
r 重新安排一个进程的优先级别。系统提示用户输入需要改变的进程PID以及需要设置的进程优先级值。输入一个正值将使优先级降低,反之则可以使该进程拥有更高的优先权。默认值是10。 
S 切换到累计模式。 
s 改变两次刷新之间的延迟时间。系统将提示用户输入新的时间,单位为s。如果有小数,就换算成m s。输入0值则系统将不断刷新,默认值是5 s。需要注意的是如果设置太小的时间,很可能会引起不断刷新,从而根本来不及看清显示的情况,而且系统负载也会大大增加。 
f或者F 从当前显示中添加或者删除项目。 
o或者O 改变显示项目的顺序。 
l 切换显示平均负载和启动时间信息。 -【就是控制最上方显示不显示,没什么用】
m 切换显示内存信息。               -【就是控制最上方显示不显示,没什么用】
t 切换显示进程和CPU状态信息。      -【就是控制最上方显示不显示,没什么用】
c 切换显示命令名称和完整命令行。 -【有用,能看到完整的命令】

N 以 PID 的大小的顺序排列表示进程列表
M 根据驻留内存大小进行排序。     -【根据内存使用情况进行排序,有用】
P 根据CPU使用百分比大小进行排序。 -【根据CPU使用情况进行排序,有用】
T 根据时间/累计时间进行排序。     -【根据进程使用的CPU时间总计排序,有用】


W 将当前设置写入~/.toprc文件中。这是写top配置文件的推荐方法。-【有用】

附常用操作:
top                           //每隔5秒显式所有进程的资源占用情况
top -d 2                  //每隔2秒显式所有进程的资源占用情况
top -c                     //每隔5秒显式进程的资源占用情况,并显示进程的命令行参数(默认只有进程名)
top -p 12345 -p 6789//每隔5秒显示pid是12345和pid是6789的两个进程的资源占用情况
top -d 2 -c -p 123456 //每隔2秒显示pid是12345的进程的资源使用情况,并显式该进程启动的命令行参数



三:查看多核CPU命令

命令:mpstat -P ALL  和  sar -P ALL 

示例:
weblogic@YDCK-APP18:~/domains/mcp_domain/log/7116> mpstat -P ALL 

Linux 3.0.76-0.11-default (YDCK-APP18)     2017年06月16日     _x86_64_

09时39分36秒  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
09时39分36秒  all    0.43    0.00    0.07    0.01    0.00    0.02    0.00    0.00   99.46
09时39分36秒    0    2.48    0.00    0.37    0.04    0.00    0.16    0.00    0.00   96.95
09时39分36秒    1    0.57    0.00    0.16    0.03    0.00    0.00    0.00    0.00   99.24
09时39分36秒    2    0.07    0.00    0.01    0.00    0.00    0.00    0.00    0.00   99.91
09时39分36秒    3    0.06    0.00    0.01    0.00    0.00    0.00    0.00    0.00   99.92
09时39分36秒    4    0.08    0.00    0.02    0.02    0.00    0.00    0.00    0.00   99.88
09时39分36秒    5    0.07    0.00    0.01    0.01    0.00    0.00    0.00    0.00   99.91
09时39分36秒    6    0.04    0.00    0.01    0.00    0.00    0.00    0.00    0.00   99.95
09时39分36秒    7    0.05    0.00    0.01    0.00    0.00    0.00    0.00    0.00   99.94




结尾:



     感谢阅读,祝有收获的一天,谢谢!