参考文献

top命令说明

1
2
3
4
5
6
7
8
9
10
11
top - 16:30:42 up 308 days, 19:08,  1 user,  load average: 0.00, 0.02, 0.00
Tasks: 120 total, 1 running, 119 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.5 us, 1.0 sy, 0.0 ni, 98.2 id, 0.0 wa, 0.3 hi, 0.0 si, 0.0 st
MiB Mem : 3591.0 total, 158.4 free, 2741.9 used, 690.7 buff/cache
MiB Swap: 0.0 total, 0.0 free, 0.0 used. 565.8 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2017796 root 10 -10 199460 41096 10140 S 2.0 1.1 338:29.25 AliYunDun
1722384 root 20 0 4097288 1.0g 3248 S 0.7 29.2 228:07.45 java
31258 root 20 0 3677056 1.2g 10628 S 0.3 34.9 612:31.70 java
2204867 root 20 0 0 0 0 I 0.3 0.0 0:00.21 kworker/0:2-events
2205104 root 20 0 67436 4832 4028 R 0.3 0.1 0:00.17 top

第一行

  • 16:30:42: 系统当前时间
  • up 308 days, 19:08: 系统开机到现在经过了多少时间
  • 1 user: 当前2用户在线
  • load average: 0.00, 0.02, 0.00: 系统1分钟、5分钟、15分钟的CPU负载信息

第二行

  • Tasks: 任务
  • 120 total: 很好理解,就是当前有120个任务,也就是120个进程
  • 1 running: 1个进程正在运行
  • 119 sleeping: 119个进程睡眠
  • 0 stopped: 停止的进程数
  • 0 zombie: 僵死的进程数

第三行

  • %Cpu(s): 表示这一行显示CPU总体信息
  • 0.5%us (user): 用户态进程占用CPU时间百分比,不包含renice值为负的任务占用的CPU的时间.
  • 1.0%sy (system): 内核占用CPU时间百分比
  • 0.0%ni (nice): 改变过优先级的进程占用CPU的百分比
  • 98.2%id (idle): 空闲CPU时间百分比
  • 0.0%wa (iowait): 等待I/O的CPU时间百分比
  • 0.3%hi (hard interrupt): CPU硬中断时间百分比
  • 0.0%si (soft interrupt): CPU软中断时间百分比
  • 0.0%st (steal): 表示当前系统运行在虚拟机中的时候,被其他虚拟机占用的CPU时间比例
  • 注: 这里显示数据是所有cpu的平均值,如果想看每一个cpu的处理情况,按1即可;折叠,再次按1;
类型 含义 异常/正常说明
us CPU执行用户代码消耗的CPU时间比例,这个比例越高,就说明CPU的利用率越好,因为我们的目的就是为了让CPU将更多的时间用在执行用户代码上.如果这一项过高引起了你的业务抖动,那你就需要去分析你的业务代码了 比例越高越好
sys CPU执行内核代码消耗的CPU时间比例,这个比例越低越好.因为CPU不应该把时间浪费在执行内核函数上,如果在内核函数里浪费了很多时间,那说明内核可能需要优化了. 比例越低越好
ni Nice值被调大的线程执行用户代码消耗的CPU百分比.
id 这个指标表示CPU空闲时间,通常说的整体CPU利用率(100-idl)这个值,也就是其他几项的之和.为了提示系统的资源利用率,我们的目标就是尽量降低idl. 不影响业务正常运行下,尽量降低idl
wa 这个指标表示CPU阻塞在I/O上的时间,比如说CPU从磁盘读取文件内容时,由于磁盘I/O太慢,导致CPU不得不等待数据就绪,然后才能继续执行下一步操作,这就是wait时间. 这个值越高,说明I/O处理能力出了问题
hi CPU小号在硬中断里的时间,正常情况下这个值都很低,因为中断处理是很快的,即使有大量硬件中断,也不会消耗很多CPU时间
si Soft irq,处理软中断的时间,这个时间不计入进程CPU时间.系统中常见的软中断有网络收发包的软中断,写文件落盘产生的软中断等.在网络吞吐量较高的系统中,这个值也会高一点.
st Steal, 表示同一个宿主机上的其他虚拟机抢走的CPU时间

第四行

  • MiB Mem: 内存的意思,单位是MiB
  • 3591.0 total: 物理内存总量
  • 158.4 free: 空闲的物理内存量
  • 2741.9 used: 使用的物理内存量
  • 690.7 buff/cache: 用作内核缓存的物理内存量

第五行

  • MiB Swap: 交换空间
  • 0.0 total: 交换区总量
  • 0.0 free: 使用的交换区量
  • 0.0 used: 空闲的交换区量
    • Swap total表示能用的swap总量,swap free表示剩余,used表示已经使用的.这三个值都为0表示系统关闭了swap功能
  • 565.8 avail Mem:

第六行

1
PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
  • PID 进程ID

  • USER 进程所有者的用户名,例如root

  • PR 进程调度优先级

  • NI 进程nice值(优先级),越小的值代表越高的优先级

  • VIRT 进程使用的虚拟内存

  • RES 进程使用的物理内存(不包括共享内存)

  • SHR 进程使用的共享内存

  • S 列(也就是 Status 列)表示进程的状态

    • R 是 Running 或 Runnable 的缩写,表示进程在 CPU 的就绪队列中,正在运行或者正在等待运行.
    • D 是 Disk Sleep 的缩写,也就是不可中断状态睡眠(Uninterruptible Sleep),一般表示进程正在跟硬件交互,并且交互过程不允许被其他进程或中断打断.
    • Z 是 Zombie 的缩写,如果你玩过“植物大战僵尸”这款游戏,应该知道它的意思.它表示僵尸进程,也就是进程实际上已经结束了,但是父进程还没有回收它的资源(比如进程的描述符、PID 等).
    • S 是 Interruptible Sleep 的缩写,也就是可中断状态睡眠,表示进程因为等待某个事件而被系统挂起.当进程等待的事件发生时,它会被唤醒并进入 R 状态.
    • I 是 Idle 的缩写,也就是空闲状态,用在不可中断睡眠的内核线程上.前面说了,硬件交互导致的不可中断进程用 D 表示,但对某些内核线程来说,它们有可能实际上并没有任何负载,用 Idle 正是为了区分这种情况.要注意,D 状态的进程会导致平均负载升高, I 状态的进程却不会.
    • 上面的示例并没有包括进程的所有状态.除了以上 5 个状态,进程还包括下面这 2 个状态
      • T 或者 t,也就是 Stopped 或 Traced 的缩写,表示进程处于暂停或者跟踪状态

      • 向一个进程发送 SIGSTOP 信号,它就会因响应这个信号变成暂停状态(Stopped);再向它发送 SIGCONT 信号,进程又会恢复运行(如果进程是终端里直接启动的,则需要你用 fg 命令,恢复到前台运行).

      • 而当你用调试器(如 gdb)调试一个进程时,在使用断点中断进程后,进程就会变成跟踪状态,这其实也是一种特殊的暂停状态,只不过你可以用调试器来跟踪并按需要控制进程的运行.

      • X,也就是 Dead 的缩写,表示进程已经消亡,所以不会在 top 或者 ps 命令中看到它.

    线程状态 描述
    S SLEEPING
    R、R+ RUNNABLE
    D UNINTR_SLEEP
    T STOPPED
    t DEBUG
    Z ZOMBIE
    X EXIT_DEAD
    x TASK_DEAD
    K WAKE_KILL
    W WAKING
    D K
    D W
  • CPU 进程使用的CPU占比

  • MEM 进程使用的内存占比

  • TIME 进程启动后到现在所用的全部CPU时间

  • COMMAND 进程的启动命令(默认只显示二进制,top -c能够显示命令行和启动参数)

使用示例

top过滤进程名

  • 直接在 top 命令行中使用进程名过滤

    • 可以通过 top 命令的 -p 参数指定要监视的进程 ID 或者进程名称,例如:

      1
      top -p $PID
  • 通过管道符结合 grep 命令过滤进程名

    • 可以使用管道符将 top 命令的输出传递给 grep 命令,使用 grep 命令来过滤进程名.例如:

      1
      top -b -n 1 | grep process_name
      • 这里的 process_name 是您想要过滤的进程名,-b 和 -n 参数是让 top 命令在批处理模式下运行,并仅运行一次.

只查找由特定用户启动的进程

  • 可以使用以下 -u 选项获取该信息

    1
    top -u 'root'

要获取系统上的空闲进程列表

  • 使用以下 -i选项

    1
    top -i 

更新间隔设置为以秒为单位的任意值

1
2
# 将间隔时间改为5秒一次  默认为3秒
top -d 5

将迭代次数设置为两次,然后退出

1
top -n 2

查看内存情况

  • 打开top后,然后按g再输入3,从而进入内存模式就可以了。在内存模式中,我们可以看到各个进程内存的%MEM、VIRT、RES、CODE、DATA、SHR、nMaj、nDRT

    • nMaj(Major Page Fault, 主缺页中断,指内容不在内存中然后从磁盘中来读取的页数)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    top - 10:12:20 up 11 days, 16:18,  4 users,  load average: 0.01, 0.05, 0.01
    Tasks: 752 total, 1 running, 537 sleeping, 2 stopped, 0 zombie
    %Cpu(s): 0.1 us, 0.1 sy, 0.0 ni, 99.9 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
    KiB Mem : 98597184 total, 14083688 free, 41466956 used, 43046540 buff/cache
    KiB Swap: 0 total, 0 free, 0 used. 56285348 avail Mem

    PID %MEM VIRT RES CODE DATA SHR nMaj nDRT %CPU COMMAND
    40807 10.0 36.897g 9.395g 2088 12.478g 934008 0 0 1.3 python
    1974 7.3 33.379g 6.831g 2088 9.875g 949952 829 0 0.3 python
    9112 6.8 8835072 6.400g 62856 7608920 13224 588 0 1.0 mongod
    11357 5.8 6622784 5.473g 79456 5846672 36500 383 0 0.0 node
    7155 2.7 15.591g 2.496g 4 5304604 14728 15k 0 0.0 java
    16416 1.3 2106536 1.180g 79456 1233764 36892 0 0 0.0 node
    1800 1.1 37.409g 1.075g 4 1475280 20396 6825 0 0.3 java
    7467 0.9 2008528 876672 8 1269340 15556 511 0 0.3 java
    5718 0.8 14.575g 833952 8 1302464 15944 2104 0 0.3 java
    12975 0.6 1383980 588368 79456 601368 38324 7 0 0.0 node
    // 略

top交互

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
s:设置刷新时间间隔
c:显示命令完全模式
t::显示或隐藏进程和CPU状态信息
m:显示或隐藏内存状态信息
l:显示或隐藏uptime信息
f:增加或减少进程显示标志
S:累计模式,会把已完成或退出的⼦进程占⽤的CPU时间累计到⽗进程的MITE+
P:按%CPU使⽤率排⾏
T:按MITE+排⾏
M:按%MEM排⾏
u:指定显示⽤户进程
r:修改进程renice值
kkill:进程
i:只显示正在运⾏的进程
W:保存对top的设置到⽂件~/.toprc,下次启动将⾃动调⽤toprc⽂件的设置。
h:帮助命令。
q:退出
按Z键更改输出的颜色
按1键可查看系统上每个 CPU 内核的图形表示.反复按1以评估 CPU 内核的内核统计信息.
按m键以图形方式显示内存使用情况

top定位一个进程

  • Shift+L按名称查找进程.这会在粗体表标题行上方创建一个提示.输入您要查找的进程的名称,然后按EnterReturn以查看在新排序的进程列表中高亮显示该进程的实例.