之前在看top的八股的时候,发现写top的大部分blog并没有完全把整个概念讲全,有必要再汇总一下

参考文章 :

man top

Linux top命令详解 – 小a玖拾柒 – 博客园 (cnblogs.com)

Linux的进程优先级NI和PR – lclc – 博客园 (cnblogs.com)

(58条消息) 如何理解uptime–“平均负载Load Average”_KingOfMyHeart的博客-CSDN博客

top 界面

第一行,任务队列信息,同 uptime 命令的执行结果

系统时间:19:27:01

运行时间:up — min,

当前登录用户: — user

负载均衡(uptime) load average: 0.02, 0.03, 0.00

average后面的三个数分别是1分钟、5分钟、15分钟的负载情况。

load average数据是每隔5秒钟检查一次活跃的进程数,然后按特定算法计算出的数值。如果这个数除以逻辑CPU的数量,结果高于5的时候就表明系统在超负荷运转了

官方的解释:单位时间内,系统中可运行(R)和不可中断(D)进程的平均进程数,也就是平均活跃进程数。

最理想的是,不论在单CPU还是多CPU,每时每刻每个CPU上都刚好运行着一个进程
假设此时的load average为2:

如果在2个CPU的系统上,表示CPU刚刚好都有进程使用,没有等待排队的进程;
如果在4个CPU系统上,表示说明CPU还空闲2个,自然也没有进程排队等待;
如果在一个单CPU的系统上,表示每次只能有一个进程执行,有一个进程在排队,属于过载情况。

第二行 tasks 进程数

Tasks: — total 进程总数
— running 正在运行的进程数
— sleeping 睡眠的进程数
— stopped 停止的进程数
— zombie 僵尸进程数

第三行 cpu状态

us 用户空间占用CPU百分比
sy 内核空间占用CPU百分比
ni 用户进程空间内改变过优先级的进程占用CPU百分比(niced)
id 空闲CPU百分比
wa 等待输入输出的CPU时间百分比(IOwait)
hi 硬中断
si 软中断
st 被hypervisor偷去的时间

第四五行 内存/swap交换分区 状态

Mem: –k total 物理内存总量
used 使用的物理内存总量
free 空闲内存总量
buffers 用作内核缓存的内存量
Swap: –total 交换区总量
cached 缓冲的交换区总量。 内存中的内容被换出到交换区,而后又被换入到内存,但使用过的交换区尚未被覆盖, 该数值即为这些内容已存在于内存中的交换区的大小。 相应的内存再次被换出时可不必再对交换区写入。

进程信息区

统计信息区域的下方显示了各个进程的详细信息。首先来认识一下各列的含义。

序号 列名 含义
a PID 进程id
b PPID 父进程id
c RUSER Real user name
d UID 进程所有者的用户id
e USER 进程所有者的用户名
f GROUP 进程所有者的组名
g TTY 启动进程的终端名。不是从终端启动的进程则显示为 ?
h PR 优先级
i NI nice值。负值表示高优先级,正值表示低优先级
j P 最后使用的CPU,仅在多CPU环境下有意义
k %CPU 上次更新到现在的CPU时间占用百分比
l TIME 进程使用的CPU时间总计,单位秒
m TIME+ 进程使用的CPU时间总计,单位1/100秒
n %MEM 进程使用的物理内存百分比
o VIRT 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
p SWAP 进程使用的虚拟内存中,被换出的大小,单位kb。
q RES 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
r CODE 可执行代码占用的物理内存大小,单位kb
s DATA 可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb
t SHR 共享内存大小,单位kb
u nFLT 页面错误次数
v nDRT 最后一次写入到现在,被修改过的页面数。
w S 进程状态。 D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程
x COMMAND 命令名/命令行
y WCHAN 若该进程在睡眠,则显示睡眠中的系统函数名
z Flags 任务标志,参考 sched.h

默认情况下仅显示比较重要的 PID、USER、PR、NI、VIRT、RES、SHR、S、%CPU、%MEM、TIME+、COMMAND 列。可以通过下面的快捷键来更改显示内容。

更改显示内容

通过 f 键可以选择显示的内容。按 f 键之后会显示列的列表,按 a-z 即可显示或隐藏对应的列,最后按回车键确定。

o 键可以改变列的显示顺序。按小写的 a-z 可以将相应的列向右移动,而大写的 A-Z 可以将相应的列向左移动。最后按回车键确定。

按大写的 FO 键,然后按 a-z 可以将进程按照相应的列进行排序。而大写的 R 键可以将当前的排序倒转。

常用命令

在top基本视图中,按键盘数字“1”,可监控每个逻辑CPU的状况

b 高亮显示当前运行进程

k 终止一个进程。系统将提示用户输入需要终止的进程PID,以及需要发送给该进程什么样的信号。一般的终止进程可以使用15信号;如果不能正常结束那就使用信号9强制结束该进程。默认值是信号15。

M 根据驻留内存大小进行排序。

P 根据CPU使用百分比大小进行排序。

T 根据时间/累计时间进行排序。

R 反序

s 改变两次刷新之间的延迟时间。(可以在top参数时-d)

c 显示完整命令

V 树视图

t&m 切换任务(cpu和tasks)&内存信息的显示(更加可视化/不显示)

q 退出程序

A: 切换交替显示模式

这个命令在全屏和交替模式间切换。在交替模式下会显示4个窗口(译注:分别关注不同的字段):

Def (默认字段组)

Job (任务字段组)

Mem (内存字段组)

Usr (用户字段组)

这四组字段共有一个独立的可配置的概括区域和它自己的可配置任务区域。4个窗口中只有一个窗口是当前窗口。当前窗口的名称显示在左上方。(译注:只有当前窗口才会接受你键盘交互命令)

我们可以用’a’和’w’在4个 窗口间切换。’a’移到后一个窗口,’w’移到前一个窗口。用’g’命令你可以输入一个数字来选择当前窗口。

I: irix mode

对于%cpu这一项在上面两种模式下是不一样的,在irix mode下,%cpu指的是本进程在本进程运行的cpu中(可能是多cpu的系统)占用的百分比

对于solaris mode 在irix的基础上除以cpu个数

常见提问

什么是NICE值?

NICE值应该是熟悉Linux/UNIX的人很了解的概念了,它是反应一个进程“优先级”状态的值,其取值范围是-20至19,一共40个级别。

这个值越小,表示进程”优先级”越高,而值越大“优先级”越低。

nice值虽然不是priority,但是它确实可以影响进程的优先级。

在英语中,如果我们形容一个人nice,那一般说明这个人的人缘比较好。什么样的人人缘好?往往是谦让、有礼貌的人。

比如,你跟一个nice的人一起去吃午饭,点了两个一样的饭,先上了一份后,nice的那位一般都会说:“你先吃你先吃!”,这就是人缘好,这人nice!但是如果另一份上的很晚,那么这位nice的人就要饿着了。

这说明什么?

越nice的人抢占资源的能力就越差,而越不nice的人抢占能力就越强。这就是nice值大小的含义,nice值越低,说明进程越不nice,抢占cpu的能力就越强,优先级就越高

相互关系:有个一般公式,PRI(new) = PRI(old) + NI

但是,PRI 是 OS 动态调整的,但是 PRI 的最终值还需要由 OS 分析决定的(虽然 NI 会影响 PRI)

僵尸进程和孤儿进程

孤儿进程:一个父进程退出,而它的每个子进程还在进行,那些子进程称为孤儿进程

僵尸进程:一个进程使用fork创建子进程,子进程先于父进程退出,而父进程没有调用wait或waitid,子进程的进程描述符仍保存在系统中。

load average

见上文

通过top查看程序cpu使用率为什么会超过100%

%CPU表示的是上次更新到现在的CPU时间占用百分比,在实际的SMP环境中,如果进程有多个线程,且top命令不在线程模式时,那么可能导致结果大于100%。

对于线程模式,因为top命令默认显示进程的数据,如果使用top -H,该选项会列出所有Linux线程。如果top已经运行了,也可以通过按“H”键将线程查看模式切换为开或关。