linux top命令

jopen 10年前

top命令经常用来监控linux的系统状况,比如cpu、内存的使用等。

top命令执行结果如下图所示:

linux top命令

top前五行统计信息

第一行:

15:48:01 表示当前系统时间。
up 391 days, 22:56 表示系统已经运行了391天22小时56分钟(在这期间没有重启过)
1 users 表示当前有1个用户登录系统
load average: 0.08, 0.13, 0.16 这三个数分别是1分钟内、5分钟内、15分钟内容系统的平均负载情况。load average数据是每隔5秒钟检查一次活跃的进程数,然后按特定算法计算出的数值。

 第二行: 进程信息

95 total 表示共有95个进程
1 running 正在运行中的进程数为1个
 94 sleeping 睡眠的进程数为94个
0 stopped 停止的进程数为0个
0 zombie 僵尸进程数为0个

 第三行:CPU信息

0.7%us 表示用户空间占用CPU的百分比为0.7
0.1%sy 表示内核空间占用CPU的百分比为0.1
0.0%ni 表示用户进程空间内改变过优先级的进程占用CPU百分比为0
98.8%id 表示空闲CPU百分比为98.8
0.4%wa 表示IO等待占用CPU的百分比为0.4
0.0%hi 表示IO等待占用CPU的百分比为0
0.0%si 表示软中断(Software Interrupts)占用CPU的百分比
0.0%st

当us值过高时,表示运行的应用消耗大量的CPU。java应用造成us高的原因主要是线程一直处于可运行(Runnable)状态,通常这些线程在执行无阻塞、循环、正则或纯粹的计算等任务造成的;另外一个可能也会造成us高的原因是频繁GC。

当sy值高时,表示linux花费了更多的时间在进行java线程切换。 java应用造成这种现象的主要原因是启动的线程比较多,且这些线程多数处于不断的阻塞(例如锁等待,IO等待状态)和执行状态的变化过程中,这就导致了 操作系统要不断地切换执行的线程,产生大量的线程上下文切换。

(上面红色的结论来自:http://blog.csdn.net/axman/article/details/7104819

第四行:内存信息

5242880k total 物理内存总量
4656748k used 使用中的内存总量
586132k free 空闲内存总量
262660k buffers 用作内核缓存的内存量

 第五行:swap交换分区信息

2097144k total 交换区总量
989520k used 使用的交换区总量
1107624k free 空闲交换区总量
471860k cached 缓冲的交换区总量

 

 top第七行开始为各进程状态监控

默认情况下仅显示比较重要的  PID、USER、PR、NI、VIRT、RES、SHR、S、%CPU、%MEM、TIME+、COMMAND  列。各列的含义如下:

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

可以用快捷键更改显示内容:
(1)更改显示内容:通过 f键可以选择显示的内容。

       按 f 键之后会显示列的列表,按 a-z  即可显示或隐藏对应的列,最后按回车键确定。

(2)按o键可以改变列的显示顺序。

       按小写的 a-z 可以将相应的列向右移动,而大写的 A-Z  可以将相应的列向左移动。最后按回车键确定。

       按大写的 F 或 O 键,然后按 a-z 可以将进程按照相应的列进行排序。而大写的  R 键可以将当前的排序倒转。

  (3)  shift + m 根据内存占用从大到小排列;shift + p 根据cpu占用从大到小排列

  设置完按回车返回界面。

 

上面展示的是进程的情况,还可以通过命令:top -p PID -H来查看进行对应的线程,如下图:

linux top命令

 

当系统的load比较高时,可以通过如下步骤排查:

1、使用命令:top,找出哪个进程的cpu使用率比较高,记录对应的进程PID1;

2、使用命令:top -p PID1 -H,查看该进程下的所有线程,找出哪些线程的cpu使用率比较高,记录对应的线程PID2

3、新开终端,使用命令:jstack PID2 > jstack.lg  将这一时刻的线程栈,保存到文件jstack.log。注意:输出线程栈和保存top命令快照尽量同时进行,因为线程随时在变化,对应的PID2可能很快变为无效。

4、由于jstack.log文件记录的线程ID是16进制,需要将top命令展示的线程号转换为16进制,以15100为例,在linux下输入命令:printf 0x%x 15100,得到15100的十六进制为0x3afc

5、在jstack.log中搜索0x3afc关键字,可以清晰看到该线程在执行的一些代码。