
top 命令的选项
top 命令有丰富的选项可以使用, 常用的如以下几种:
# -u user, 指定展示的用户
# -d delay, 指定刷新频率
top -u nginx -d 1
# -n iteration, 指定刷新多少次之后自动退出 top 命令
# -p pid, 指定进程 id
top -n 20 -p {pid1} {pid2} ...
全局系统信息
top 命令的界面被分为泾渭分明的两部分, 上半部分是全局类的信息, 展示 load, cpu, 内存, 进程数目统计等信息, 本节主要介绍的就是上半部分: 全局系统信息;
top - 11:59:14 up 194 days, 21:56, 2 users, load average: 0.74, 0.97, 1.18
Tasks: 108 total, 1 running, 107 sleeping, 0 stopped, 0 zombie
%Cpu(s): 2.0 us, 2.0 sy, 0.0 ni, 82.2 id, 13.7 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 3881920 total, 139820 free, 2848020 used, 894080 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 773540 avail Mem
- 第一行是 uptime 信息;
- 第二行和第三行是 cpu 及进程信息;
- 第四行和第五行是 free 信息;
cpu 全局统计信息
全局的 cpu 统计信息, 主要存在于 top 命令的第三行:
# us user time
# sy system time
# ni niceness process time
# id idle time
# wa wait time
# hi hardware interrupt time
# si software interrupt time
# st stole time, used in virtualization
%Cpu(s): 5.8 us, 1.0 sy, 0.0 ni, 90.4 id, 2.8 wa, 0.0 hi, 0.0 si, 0.0 st
其中有几个比较重要的指标:
user time 时间占比大, 说明用户空间内的 cpu 计算比较多, 这属于最常见的状态;
system time 时间占比大, 说明 system call 系统调用比较多, 计算多在内核空间发生;
这往往不是一个好的兆头, 如果伴随着系统的性能异常, 需要使用 strace 等命令追踪系统调用的状态;
如果一个正常情况下 system time 很少的进程, 突然莫名其妙得 user time 与 system time 的差距达到了量级, 那么有相当的概率, 系统内核发生了性能问题, 比如进程上下文切换 (context switch) 频繁以及缺页 (page fault);
如果一个进程每次启动都会造成很高的 system time, 那么很可能是进程内部的逻辑在执行某些耗时的 system call.idle time 时间占比很大, 说明 cpu 很闲, 时间多消耗在了闲置进程上;
wait time 时间占比很大, 这十有八九是 cpu 等待 IO 设备的时间过长, 比较常见的是磁盘 IO 出现了吞吐瓶颈, 导致 cpu wait; 当然也有可能是网络适配器的带宽被打满了;
除此之外, 其余的几个指标, nice, hardware interrupt, software interrupt, stole, 相对来说要次重要一些, 对系统的影响有限;
全局系统信息 快捷键
- 按小写 l (字母) 可以显示/隐藏 uptime 信息;
- 连续按 t 可以切换四种(包括隐藏) cpu 信息的显示方式;
- 按小写 1 (数字) 可以详细显示 cpu 的每一个 core 的状态统计信息;
- 连续按 m 可以切换四种(包括隐藏) free 信息的显示方式;
- 连续按 E 可以切换 KB, MB, GB, TB, PB, EB 六种 free 信息显示的单位;
进程详细信息
top 命令的界面被分为泾渭分明的两部分, 下半部分是进程的详细信息, 展示特定进程的 cpu, 内存, 命令等信息, 本节主要介绍的就是下半部分: 进程详细信息;
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 44752 6880 3504 S 0.0 0.2 2:29.89 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.20 kthreadd
3 root 20 0 0 0 0 S 0.0 0.0 0:06.73 ksoftirqd/0
5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
7 root rt 0 0 0 0 S 0.0 0.0 0:00.36 migration/0
第一行的字段含义
PR: priority
NI: nice
VIRT: virtual mem, 虚拟内存
RES: resident mem, 常驻内存
SHR: shared mem, 共享内存
S: state: R(running), S(sleep), Z(zombie), T(terminate)
%CPU: cpu 综合使用量
%MEM: 内存 综合使用量
TIME+: 进程的 cpu 时间
其中:
PR 为 rt 代表进程运行在实时态;
VIRT = RES + SWAP;
RES = CODE + DATA = SHR + 程序自身所占的物理内存;
进程详细信息 快捷键
- V 以树形结构显示各进程;
- c 详细/简略 显示 COMMAND 列的信息(带命令参数与否);
- enter/space 立即刷新指标;
- e 连续敲击 可以切换 KB, MB, GB, TB, PB 五种内存显示(VIRT, RES, SHR)的单位;
- d/s 改变 top 命令刷新指标的频率, 会出现交互提示, 输入指定的时间; 默认是 3s;
- M 以内存使用率从大到小排序;
- P 以 CPU 使用率从大到小排序;
- k kill 掉指定的进程, 会出现交互提示, 先输入 pid, 再输入 signal id;
注意, 第 8 条 kill 指定进程, 一定要以启动进程的用户执行 top 命令才有权限 kill 它; 或者更统一的, 直接用 sudo 执行 top 命令, 就有权限 kill 指定进程了;