Linux 实时查看进程 top
top命令用于动态实时的查看进程信息,以及系统信息,包括:CPU、内存、负载。
为更好的理解各数据,我们运行了一个消耗系统CPU与内存的程序。本文结尾附JAVA程序。
基本语法
top
 
运行结果

1 结果说明
第1行 综合说明
top - 05:24:40 up 3:34 :当前时间为05:24:40,已运行时间3:34(小时:分钟)
3 users :当前登录用户3个。
load average: 2.04, 2.73, 2.21 :系统负载平均值:过去1分钟的均值,过去5分钟的均值,过去15分钟的均值。
第2行 进程情况
Tasks: 212 total, :进程的总数量212
1 running :正在运行进程的数量1
211 sleeping, 0 stopped, 0 zombie :睡眠进程,停止进程,僵尸进程的数量。
第3行 CPU情况
%Cpu(s): 55.8 us, 0.8 sy, 0.0 ni, 43.4 id:用户进程使用率,系统进程使用率,nice用户进程使用率, idle进程使用率
0.0 wa, 0.0 hi, 0.0 si, 0.0 st:等待IO,硬件中断,软件中断,抢断 (的消耗时间)
第4行 内存情况
KiB Mem : 1862996 total, 472880 free, 951280 used, 438836 buff/cache
总大小:1.8G,空闲0.47G,已使用0.95G,缓存0.43G。
第5行 SWAP情况
KiB Swap: 2097148 total, 2097148 free, 0 used. 732068 avail Mem
交换区 总大小2G,空闲2G,已使用0,可一次性分配给程序的可用大小:0.73G。
第6行 进程表格
| 标题 | 示例值 | 说明 | 
|---|---|---|
| PID | 5788 | Process ID,进程ID | 
| USER | root | 用户名 | 
| PR | 20 | priority,进程优先级 | 
| NI | 0 | nice,用户进程nice值 | 
| VIRT | 2898832 | virtual,虚拟内存大小 | 
| RES | 435836 | 常驻内存大小 | 
| SHR | 12232 | 共享内存大小 | 
| S | S | State,状态。R表示运行中;S表示睡眠。 | 
| %CPU | 227.6 | CPU使用率 | 
| %MEM | 23.4 | 内存使用率 | 
| TIME+ | 2:22.25 | 累计使用CPU时间 | 
| COMMAND | java | 运行命令 | 
2 进程%CPU为什么大于100
示例数据中
汇总%Cpu(s): 54.3 us,用户进程CPU总共占54.3%;
而java进程%CPU为227.6,大于100,为什么?
原因
汇总值是以所有CPU个数的对应时间为比例进行计算;
进程%CPU是以单个CPU的对应时间为比例进行计算。
查看CPU个数设置

CPU内核数为4 。
54.3*4=217.2,约等于227.6 。
3 操作命令
top运行结果界面实时更新,也可以同时按操作命令键,执行相应操作。
| 操作命令 | 说明 | 
|---|---|
| 回车或空格 | 立即刷新 | 
| c | 显示命令的详细信息 | 
| i | 只显示占用资源高的进程;再次按显示所有进程 | 
| o | 添加过滤 | 
| ctrl+o | 显示过滤 | 
| = | 取消所有过滤 | 
| q | 退出 | 
例1:查看命令详情
按下c运行结果

默认情况,只有命令名,没有运行参数与选项。C后显示。
例2:查看高负载进程
按下i运行结果

其它低负载进程不再显示。连续按i进行切换。
例3:过滤
按o,然后输入过滤条件 COMMAND=java

回车后

Ctrl+O查看过滤条件

= 取消过滤。
4 附:模拟消耗资源的程序
dushareBig.java
import java.util.ArrayList;
/**
 * Author: 关关教程  tuto.dushare.cn
 * 用于消耗CPU与内存
 * 消耗内存:约1G
 * 消耗CPU:会尽量消耗,其中有死循环
 */
public class dushareBig {
    public static void main(String[] args) {
        for(;true;){
            ArrayList arrayList = new ArrayList();
            for (int i = 0; i < 100; i++) {
                byte[] byteArr = new byte[1000000];
                byteArr[i] = (byte)i ;
                arrayList.add(byteArr);
            }
        }
    }
}
 
已经编绎好dushareBig.class,可通过下方群获取,或者自行编绎。
将dushareBig.class上传到/code目录

cd到/code目录,然后执行
[root@dushare code]# java dushareBig
 

代码会一直运行,命令提示符不会弹出。要执行其它命令需要新打开一个连接。