性能分析工具之top

时间:2024-03-19 14:45:57

性能分析工具之top

top命令是Linux下最常用、最基础的性能分析工具之一。top命令的功能类似于Windows下的任务管理器。

我定位性能问题的习惯是:不管三七二十一,首先使用top看一下,然后再决定下一步怎么办。

top命令的用法很简单,直接输入top,显示如下:

性能分析工具之top

下面逐行介绍top命令的输出。

第一行

性能分析工具之top

使用uptime命令、w命令也可以获得相同的信息。其中每个字段的含义如下:

09:40:07
当前系统时间:9点40分07秒

up 5 min
系统运行时间:已运行5分钟

1 user
当前登录用户数:1个用户

load average: 0.02, 0.18, 0.12
最近1分钟、5分钟、15分钟的load average(即:平均负载),此处分别为0.02、0.18和0.12。
那么,load average的数值到底如何理解?多大算是CPU负载高,多大算是CPU负载低?
这个问题,此处不展开,只给个结论:
当load average == CPU核心数时为满负荷,即:
假设系统使用1核CPU,那么当load average == 1时,CPU为满负荷;当 load average > 1时,CPU超负荷。
假设系统使用4核CPU,那么当load average == 4时,CPU为满负荷;当 load average > 4时,CPU超负荷。
CPU超负荷时必然会影响性能。

第二行

第二行是进程状态总览:

性能分析工具之top

140 total
进程总数为140个

1 runing
可执行状态的进程为1个

139 sleeping
睡眠状态的进程为139个

0 stopped
暂停状态的进程为0个

0 zombie
僵尸状态的进程0个

如果想了解每种进程状态可参考博文“Linux系统之进程状态” 传送门

第三行

性能分析工具之top

第三行是CPU使用情况

us
用户空间消耗CPU时间的百分比

sy
内核空间消耗CPU时间的百分比

ni
用户空间通过nice值改变过优先级的进程消耗CPU时间的百分比

id
CPU处于idle状态的百分比,一般来说 us + sy + id ≈≈ 100

wa
等待IO操作消耗CPU时间的百分比

hi
处理硬中断消耗CPU时间的百分比

si
处理软中断消耗CPU时间的百分比

st
time stolen from this vm by the hypervisor. 此项只有当Linux作为虚拟机运行时才有意义。我做的都是嵌入式的项目,没用过虚拟机,不知道此项怎么理解。以后如涉及到再看吧。

对于多核CPU,top默认显示的是多核整体的信息,如需按核查看CPU信息,可以在top运行时按“1”进行控制

第四行、第五行

性能分析工具之top

第四行和第五行是内存使用情况,其中第四行"KiB Mem"是物理内存使用情况,而第五行"KiB Swap"是硬盘上交换分区使用情况。

说明:在top中,这两行的显示格式容易误导人。上图红框中的"avail Mem"虽然在"KiB Swap"这一行,但它实际上是"KiB Mem"的内容,所以应该把"avail Mem"放在"KiB Mem"这一行来看。对此有疑问的同学可以看下free命令的显示效果。

其中,"KiB Mem"中的"used"指的是现在系统内核管理的物理内存数,"free"是内核还未纳入其管控范围的数量。纳入内核管理的内存不见得都在使用中,还包括过去使用过的现在可以被重复利用的内存,内核并不把这些可被重新使用的内存交还到"free"中去,因此当"KiB Mem"中的"free"内存会越来越少时,这并不表示物理内存真的不够了

我们可以通过"avail Mem"来确认真正还可以使用的物理内存数。

另外,“KiB Swap"中的"used”,如果这个数值在不断的变化,说明内核在不断进行Mem和Swap的数据交换,这是真正的内存不够用了。

单个进程信息

性能分析工具之top

进程信息包含PID、USER、PR、NI、VIRT、RES、SHR、S、%CPU、%MEM、TIME+、COMMAND。其中PID、USER就不说了,其它信息下面分别解释:

PR
优先级:范围0~99,默认为20。PR值越小优先级越高。PR值为RT表示实时进程。

NI
nice值:范围-20~19。低nice值意味着进程会获得更多的处理器时间。Linux对进程的调度由PR和NI共同决定。

VIRT
进程使用的RES和Swap的总合,单位kb。这里要注意,虽然VIRT是virtual的缩写,但VIRT表示的并非我们常说的虚拟内存。可以将VIRT理解为该进程使用的总内存。

RES
进程使用的物理内存大小,单位kb。RES和第四行中Mem的含义一样都是只物理内存,只不过此处显示的是单个进程使用的物理内存。

SHR
共享内存大小,单位kb。

S
进程状态,每种进程状态的含义可参考博文“Linux系统之进程状态” 传送门

%CPU
从上次更新到现在占用CPU时间的百分比

%MEM
进程使用的物理内存百分比

TIME+
进程使用的CPU时间总计。进程占用多个CPU时,各CPU的时间是累加的。比如某进程同时占用CPU0和CPU1一分钟,那么此处TIME+为两分钟。格式为 分钟:秒,如0:01.24,表示0分钟,1.24秒。

COMMAND
进程对应的程序

使用top定位性能问题的典型场景和操作

如何查看线程信息?

定位问题是,我们一般会先关注到某个进程,然后最好能看到该进程中每个线程的资源占用情况,此时我们需要使用如下参数来显示线程信息:

top -H -p xxx
其中:
-p xxx 指定PID,xxx就是指定的PID
-H 显示每个线程的信息

说明:

对于线程信息,PID这一列显示的其实是线程的TID。
在Linux语境下,“进程”和“线程”这两个词语的区分不是很严格,有时会把“进程”和“线程”、“PID”和“TID”等词语混用。
所以,我们千万不要在PID和TID上较真,只要能根据上下文理解要表达的意思即可。

如何判断内存是否够用?

前面介绍第四行、第五行时已经讲过了,请看对应的章节。