linux top命令
top命令经常用来监控linux的系统状况,比如cpu、内存的使用等。
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来查看进行对应的线程,如下图:
当系统的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关键字,可以清晰看到该线程在执行的一些代码。