top参数详解
第一行, 任务队列信息, 同 uptime 命令的执行结果
- 系统时间:15:57:40
- 运行时间:up 6 days, 4:30
- 当前登录用户: 3 user
- 负载均衡(uptime) load average: 0.22, 0.25, 0.23
load average 后面的三个数分别是1分钟、5分钟、15分钟的负载情况。load average数据是每隔5秒钟检查一次活跃的进程数,然后按特定算法计算出的数值。如果这个数除以逻辑CPU的数量,结果高于5的时候就表明系统在超负荷运转了
第二行, Tasks — 任务(进程)
- 总进程:234 total, 运行:1 running, 休眠:232 sleeping, 停止: 1 stopped, 僵尸进程: 0 zombie
第三行, cpu状态信息
- 1.0%us【user space】— 用户空间占用CPU的百分比。
- 0.6%sy【sysctl】— 内核空间占用CPU的百分比。
- 0.0%ni【】— 改变过优先级的进程占用CPU的百分比
- 98.4%id【idolt】— 空闲CPU百分比
- 0.0%wa【wait】— IO等待占用CPU的百分比
- 0.0%hi【Hardware IRQ】— 硬中断占用CPU的百分比
- 0.0%si【Software Interrupts】— 软中断占用CPU的百分比
第四行, 内存状态
32780168 total, 279136 free, 20911624 used, 11589408 buff/cache
第五行, swap交换分区信息
2097148 total, 2097148 free, 0 used. 11307284 avail Mem
可用内存=free + buffer + cached
对于内存监控, 在top里我们要时刻监控第五行swap交换分区的used, 如果这个数值在不断的变化, 说明内核在不断进行内存和swap的数据交换, 这是真正的内存不够用了。
第四行中使用中的内存总量(used)指的是现在系统内核控制的内存数,第四行中空闲内存总量(free)是内核还未纳入其管控范围的数量。
纳入内核管理的内存不见得都在使用中,还包括过去使用过的现在可以被重复利用的内存,内核并不把这些可被重新使用的内存交还到free中去,因此在linux上free内存会越来越少,但不用为此担心。
第六行, 空行
第七行以下:各进程(任务)的状态监控
PID — 进程id
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时间总计
COMMAND — 进程名称(命令名/命令行)
常用快捷键
h 显示快捷键帮助
k 终止一个进程
i 开/关忽略闲置和僵死进程
q 退出程序
r 重新安排一个进程的优先级别
S 切换到累计模式
s 更改刷新间隔时间,单位秒
f,F 从当前显示中添加或者删除项目
o,O 改变显示项目的顺序
l 切换显示平均负载和启动时间信息
m 切换显示内存信息
M 根据内存使用大小排序
t 切换显示进程和CPU状态信息
c 切换显示命令名称和完整命令行
P 根据CPU使用率进行排序 (默认排序)
T 根据时间/累计时间进行排序
w 将当前设置写入~/.toprc文件中
1 展开多核cpu显示
top使用方法
使用格式:
top [-] [d] [p] [q] [c] [C] [S] [s] [n]
参数说明:
d:指定每两次屏幕信息刷新之间的时间间隔。当然用户可以使用s交互命令来改变之。
p:通过指定监控进程ID来仅仅监控某个进程的状态。
q:该选项将使top没有任何延迟的进行刷新。如果调用程序有超级用户权限,那么top将以尽可能高的优先级运行。
S:指定累计模式。
s:使top命令在安全模式中运行。这将去除交互命令所带来的潜在危险。
i:使top不显示任何闲置或者僵死进程。
c:显示整个命令行而不只是显示命令名。
生产 CPU 高负载问题排查
1.top -c 将系统资源使用情况实时显示出来(-c 参数可以完整显示命令)
2. 输入大写 P 将应用按照 CPU 使用率排序
3. top -Hp pid 然后输入 P 可以按照 CPU 使用率将线程排序
4. 将线程的 ID 转换为 16 进制(printf "%x\n" PID), 通过 jstack pid >pid.log 生成日志文件,利用刚才的 16 进制进程 ID 去这个线程快照中搜索即可知道消耗 CPU 的线程在干啥了.