1、命令
1.简介
top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器。
显示系统当前的进程和其他状况; top是一个动态显示过程,即可以通过用户按键来不断刷新当前状态.如果在前台执行该命令,它将独占前台,直到用户终止该程序为止. 比较准确的说,top命令提供了实时的对系统处理器的状态监视.它将显示系统中CPU最“敏感”的任务列表.该命令可以按CPU使用.内存使用和执行时间对任务进行排序;而且该命令的很多特性都可以通过交互式命令或者在个人定制文件中进行设定。下面详细介绍它的使用方法。
2.使用方法
2.1 使用格式
top [-] [d] [p] [q] [c] [C] [S] [s] [n]
2.2 参数说明
- d 指定每两次屏幕信息刷新之间的时间间隔。当然用户可以使用s交互命令来改变之。
- p 通过指定监控进程ID来仅仅监控某个进程的状态。
- q 该选项将使top没有任何延迟的进行刷新。如果调用程序有超级用户权限,那么top将以尽可能高的优先级运行。
- S 指定累计模式
- s 使top命令在安全模式中运行。这将去除交互命令所带来的潜在危险。
- i 使top不显示任何闲置或者僵死进程。
- c 显示整个命令行而不只是显示命令名
2.3 其他
下面介绍在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 切换显示命令名称和完整命令行。
M 根据驻留内存大小进行排序。
P 根据CPU使用百分比大小进行排序。
T 根据时间/累计时间进行排序。
W 将当前设置写入~/.toprc文件中。这是写top配置文件的推荐方法。
3.实例解析
前五行是系统整体的统计信息。
3.1 第一行是任务队列信息,同 uptime 命令的执行结果。其内容如下:
- 10:45:47 当前时间
- up 61 days 系统运行时间
- 1 user 当前登录用户数
- load average: 6.28, 6.99, 7.18 系统负载,任务队列的平均长度,即CPU的平均负载情况,三个数值分别为 1分钟、5分钟、15分钟前到现在的平均值。
我们任取一列,如第一列,即表示在刚刚过去的1分钟内:
如果是单核CPU的话,1.00就表示CPU已经满负荷了,
如果是多核CPU的话,load average达到CPU的核数即说明该CPU已经满负荷了,
如果是多颗物理CPU,则当load average达到所有物理CPU的总核数时,说明系统CPU满负荷了。
简而言之,CPU的核数即为我们根据load average衡量CPU负载的依据。
刚刚我们看的是最近1分钟的负载,load average还显示了最近5分钟和15分钟的负载,那么一般情况下我们应该看哪个呢?
其实,1分钟,5分钟,15分钟体现的是刚刚过去15分钟系统负载的一种趋势,
如果1分钟负载高于5分钟和15分钟的负载,说明负载是最近1分钟发生的,尚未反映到5分钟和15分钟的负载上,
如果在随后的15分钟内系统一直维持最近1分钟的负载,那么5分钟和15分钟的负载也将逐近提高到1分钟的水平;
如果随后的负载没有继续维持最近1分钟的负载,而是降低到原来水平,那么5分钟和15分钟的负载会有微小波动然后维持现有水平。
如果1分钟负载低,而5分钟和15分钟的负载高,说明最近15分钟内系统负载高,但是CPU的使用情况在最近的1分钟降了下来。
由此看来,1分钟的数据更能反映CPU负载的实时情况,而15分钟的数据则说明系统稳定在某一情况,更有指示价值。
那么当CPU负载达到哪个值时,就该引起我们注意了呢?按照参考文章给的经验值是CPU核数乘以0.7,
即如果CPU总核数为4,当load average上15分钟的数值达到2.8时,我们就该好好进系统看看了。
3.2 第二、三行为进程和CPU的信息。当有多个CPU时,这些内容可能会超过两行。内容如下:
Tasks:
- 310 total 进程总数
- 1 running 正在运行的进程数
- 309 sleeping 睡眠的进程数
- 0 stopped 停止的进程数
- 0 zombie 僵尸进程数
Cpu(s):
- 3.3 us 用户空间占用CPU百分比
- 3.6 sy 内核空间占用CPU百分比
- 0.2 ni 用户进程空间内改变过优先级的进程占用CPU百分比
- 27.1 id 空闲CPU百分比
- 65.6 wa 等待输入输出的CPU时间百分比
- 0.0 hi hardware irq
- 0.2 si software irq
- 0.0 st steal time
3.3 最后两行为内存信息。内容如下:
Mem:
- 12304244 total 物理内存总量
- 146240 free 空闲内存总量
- 8502892 used 使用的物理内存总量
- 3655112 buff/cache 用作内核缓存的内存量
buffer是即将要被写入磁盘的,cache是被从磁盘中读出来的。这二者是为了提高IO性能的,并由OS管理,并非应用自己分配的内存,而是OS自己根据需要对空闲内存进行的额外利用。因为这部分只是缓存,降低IO,提升性能,只要应用程序有需要,OS可以直接将buffer写入磁盘,将cache删掉来得到空闲内存给应用程序使用。
buffer是用于存储速度不同步的设备或优先级不同的设备之间传输数据的区域。缓冲(buffers)是根据磁盘的读写设计的,把分散的写操作集中进行,减少磁盘碎片和硬盘的反复寻道,从而提高系统性能。
cache经常被用在磁盘的I/O请求上,如果有多个进程都要访问某个文件,于是该文件便被做成cache以方便下次被访问,这样可提供系统性能。缓存(cached)是把读取过的数据保存起来,重新读取时若命中(找到需要的数据)就不要去读硬盘了,若没有命中就读硬盘。其中的数据会根据读取频率进行组织,把最频繁读取的内容放在最容易找到的位置,把不再读的内容不断往后排,直至从中删除。
使用内存是实际当前使用内存减去buffers/cache之和;空闲内存是实际空闲内存加上buffers/cache之和
Swap:
- 4063228 total 交换区总量
- 2991268 free 空闲交换区总量
- 1071960 used 使用的交换区总量
- 2905240 avail Mem 表示可用于进程下一次分配的物理内存数量,这个大小一般比free大一点,因为除了free的空间外,系统还能立即释放出一些空间来。
备注:
我们在观察Linux的内存使用情况时,只要没发现用swap的交换空间,就不必担心自己的内存太少。
如果常常看到swap用了很多,那么你就要考虑加物理内存了。这也是在Linux服务器上看内存是否够用的标准。
3.4 进程信息区
统计信息区域的下方显示了各个进程的详细信息。首先来认识一下各列的含义。
序号 列名 含义
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 键可以将当前的排序倒转。
字段c详解
常用命令及快捷键:
top命令的输出如下
- 第一行:系统运行时间和平均负载
当前时间、系统已运行时间、当前登录用户的数量、最近5、10、15分钟内的平均负载
- 第二行:任务
任务的总数、运行中(running)的任务、休眠(sleeping)中的任务、停止(stopped)的任务、僵尸状态(zombie)的任务
- 第三行:cpu状态
字段 | 字段释义 |
us | user: 运行(未调整优先级的) 用户进程的CPU时间 |
sy | system: 运行内核进程的CPU时间 |
ni | niced:运行已调整优先级的用户进程的CPU时间 |
id | idle:空闲时间 |
wa | IO wait: 用于等待IO完成的CPU时间 |
hi | 处理硬件中断的CPU时间 |
si | 处理软件中断的CPU时间 |
st | 这个虚拟机被hypervisor偷去的CPU时间(译注:如果当前处于一个hypervisor下的vm,实际上hypervisor也是要消耗一部分CPU处理时间的) |
- 第四行:内存
全部可用内存、已使用内存、空闲内存、缓冲内存
- 第五行:swap
全部、已使用、空闲和缓冲交换空间
- 第七行至N行:各进程任务的的状态监控
字段 | 释义 |
PID | 进程ID,进程的唯一标识符 |
USER | 进程所有者的实际用户名 |
PR | 进程的调度优先级。这个字段的一些值是'rt'。这意味这这些进程运行在实时态。 |
NI | 进程的nice值(优先级)。越小的值意味着越高的优先级。负值表示高优先级,正值表示低优先级 |
VIRT | virtual memory usage 虚拟内存,进程使用的虚拟内存。进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES 1、进程“需要的”虚拟内存大小,包括进程使用的库、代码、数据等 |
RES | resident memory usage 常驻内存,驻留内存大小。驻留内存是任务使用的非交换物理内存大小。进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA 1、进程当前使用的内存大小,但不包括swap out |
SHR | SHR:shared memory 共享内存 1、除了自身进程的共享内存,也包括其他进程的共享内存 |
S | 这个是进程的状态。它有以下不同的值:
|
%CPU | 自从上一次更新时到现在任务所使用的CPU时间百分比。%CPU显示的是进程占用一个核的百分比,而不是整个cpu(N核)的百分比,有时候可能大于100,那是因为该进程启用了多线程占用了多个核心,所以有时候我们看该值得时候会超过100%,但不会超过总核数*100 |
%MEM | 进程使用的可用物理内存百分比 |
TIME+ | 任务启动后到现在所使用的全部CPU时间,精确到百分之一秒 |
COMMAND | 运行进程所使用的命令。进程名称(命令名/命令行) |
可用列名 含义
- 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
- CODE 可执行代码占用的物理内存大小,单位kb
- DATA 可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb
- SHR 共享内存大小,单位kb
- nFLT 页面错误次数
- nDRT 最后一次写入到现在,被修改过的页面数。
- S 进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程
- COMMAND 命令名/命令行
- WCHAN 若该进程在睡眠,则显示睡眠中的系统函数名
- Flags 任务标志
2、交互命令
按“h”或者“?”,会显示帮助
Z:改变颜色;B:加粗
t:显示和隐藏任务/cpu信息;m:内存信息
1:监控每个逻辑CPU的状况;
f:进入字段显示配置模式,可增加或者移除显示字段,按相应的字母新增或去除;o:进入字段顺序设置模式,可配置显示位置顺序,按相应的字母往下移动,按“shift+相应的字母”往上移动 ---------常用
F:进入字段排序配置模式,可设置排序的字段;
R:正常排序/反向排序;
s:设置刷新的时间--------常用
u:输入用户,显示用户的任务
i:忽略闲置和僵死进程。这是一个开关式命令。
r:重新安排一个进程的优先级别。系统提示用户输入需要改变的进程PID以及需要设置的进程优先级值。输入一个正值将使优先级降低,反之则可以使该进程拥有更高的优先权。默认值是10。
c:切换显示命令名称和完整命令行。
M:根据驻留内存大小进行排序。-------------常用
P:根据CPU使用百分比大小进行排序。-----------常用
H:显示线程
3、常用参数与命令
d:指定每两次屏幕信息刷新之间的时间间隔。当然用户可以使用s交互命令来改变之。
p:通过指定监控进程ID来仅仅监控某个进程的状态。
top –p PID
-H: 设置线程模式
显示某个进程所有活跃的线程消耗情况
top -H -p pid
按f、再按j把P调出来,P代表”Last used CPU”
设置线程模式下:第二行的tasks指的是线程个数
4、疑问
如下这个java进程设置的最大可用内存为128m,但是这里virt达到了2478m,RES达到了295m,为什么?
参考答案:
结论:
VIRT高是因为分配了太多地址空间导致。
一般来说不用太在意VIRT太高,因为你有16EB的空间可以使用。