0. 概述
在 Linux 下稍微定位过性能问题的同学应该对 Top 命令都是了解的,但是,不知道你对 Top 命令的了解有多少,本文就个人的理解进行一个总结。
1. 总览
第一步还是快速看一个最平凡的例子,那就是什么参数都不加执行执行 top 命令的时候的输出是什么:
图 1:平凡的 Top 命令 |
---|
这里可以看到整体的结构为:
上面有 5 行的 summary,每行对应的为:
- 系统 Summary:(其实就是 uptime 的信息)
- 系统当前时间
- 系统运行了多久
- 有多少个登陆 Session
- 最近 5、10 和 15 分钟内的平均负载
- 进程 Summary
- 运行中
- 睡眠中
- 停止
- Zombie 进程
- CPU Summary
- us:用户态(未调整优先级)百分比
- sy:系统(内核)百分比
- ni:用户态(调整优先级)百分比
- id:空闲百分比
- wa:IO 等待百分比
- hi:硬件中断处理百分比
- si:软件中断处理百分比
- st:被 hypervisor 偷窃的百分比
- 2 行的 Memory Summary
- 真实内存占用
- 虚拟内存占用
然后下面就是具体的进程信息,默认为 CPU Usage 排序。这里默认显示的字段分别为:
- PID:进程 ID
- USER:进程运行用户
- PR:进程优先级
- NI:进程 Nice 值(用于调整优先级)
- VIRT:占用的虚拟内存
- RES:真实使用物理内存大小
- SHR:共享内存大小
- s:进程状态
- CPU:CPU 使用率
- MEM:内存使用率
- TIME:任务启动后到现在所使用的全部 CPU 时间,精确到百分之一秒。
- COMMAND:启动进程的时间
这些都是默认的输出,已经可以帮助我们很多了,但是,很多时候,我们需要的信息更加具体,所以需要看一些额外的信息。下面就列举一些常见的场景。
2. 查看特定的进程
因为下半部分的进程列表是动态的,我们很可能只想看某个具体的进程,那么可以这么看:
[root@liqiang.io]# top -p 2140
图 2:查看具体的进程 |
---|
3. 查看更多的字段
[root@liqiang.io]# top -p 2140
使用 top 命令,然后按 ‘f’ 键,就进入了字段选择页面,按 ‘d’ 选择/取消对应的字段:
图 3:查看对应的字段 |
---|
3.1 内存排序
Shift + M
3.2 CPU 排序
Shift + P
查看进程的线程数
[root@liqiang.io]# top -Hp 460643
top - 17:08:31 up 44 days, 23 min, 1 user, load average: 0.00, 0.01, 0.04
Threads: 9 total, 0 running, 9 sleeping, 0 stopped, 0 zombie
%Cpu(s): 1.1 us, 0.5 sy, 0.0 ni, 98.2 id, 0.1 wa, 0.0 hi, 0.0 si, 0.1 st
MiB Mem : 3731.2 total, 483.4 free, 1014.9 used, 2233.0 buff/cache
MiB Swap: 0.0 total, 0.0 free, 0.0 used. 2228.9 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
460643 root 20 0 1311756 38284 11260 S 0.0 1.0 9:14.31 http-server
460704 root 20 0 1311756 38284 11260 S 0.0 1.0 8:04.01 http-server
460705 root 20 0 1311756 38284 11260 S 0.0 1.0 6:35.95 http-server
460706 root 20 0 1311756 38284 11260 S 0.0 1.0 9:23.04 http-server
460707 root 20 0 1311756 38284 11260 S 0.0 1.0 9:16.96 http-server
460708 root 20 0 1311756 38284 11260 S 0.0 1.0 0:00.00 http-server
460710 root 20 0 1311756 38284 11260 S 0.0 1.0 5:47.84 http-server
460878 root 20 0 1311756 38284 11260 S 0.0 1.0 9:13.93 http-server
461863 root 20 0 1311756 38284 11260 S 0.0 1.0 6:07.49 http-server
这里的 Threads: 9 total
就是进程开启的线程数量
4. Zombie 进程是什么
- Zombie 进程:子进程退出了,但是父进程没有接收退出状态,导致子进程的 Zombie 数据结构一直在内存中,会导致内存泄露;
- 孤儿进程:子进程还没结束,但是父进程退出了,子进程就自动归给 init 进程作为子进程,当子进程退出后,init 进程会接收子进程的退出状态,没有什么负面影响;
5. 为什么有 Priority 和 Nice 两个优先级
这两个值都能影响系统对进程的调度优先级,数值越低,优先级越高,区别在于:
- Priority:内核指定的优先级,用户无法修改
- Nice:用户可以修改的优先级,Nice 值的设定范围区分用户
- root 用户的设置范围为:-20 ~ 19
- 普通用户的设置范围为:0~19
真实调度的时候的优先级 Real Priority = Priority + Nice,所以用户可以根据设置 Nice 值在一定程度上影响对应进程的调度优先级。