Linux 命令系列之 top——外面藏着很多鲜为人知的宝藏常识
简介
top 命令是咱们常常用来查看零碎信息的一个指令,它提供了一个动静的而且是实时的借口帮忙咱们去查看零碎执行时的过程、线程和零碎参数的信息。
top 命令输入内容具体分析
首先咱们先看一下 top 命令的输入后果:
咱们当初一一剖析这些字段的含意:
第一行
12:53:04
示意以后工夫,也就是以后实在的工夫。up 157 days 13:35
,示意这个零碎从启动到当初的工夫,上图显示的含意就是这个零碎从 157 天 13 个小时 35 分钟以前就启动了。5 users
示意以后在应用这个机器的用户数量。load average: 0.00, 0.00, 0.00
,这个值示意零碎过来 1 分钟,5 分钟,15 分钟的零碎负载。当初有一个问题就是,什么是这里谈到的零碎负载。所谓零碎负载,咱们拿一分钟来举例子,咱们将一分钟一个 CPU 工夫定义为 t,在这一分钟之内总共耗费的 CPU 工夫为 c,那么在这一分钟之内的负载为 $\frac{c}{t}$,须要留神的是这个耗费的 CPU 工夫 c 是能够大于 t 的,因为一个程序可能应用了多个 CPU(并发程序,也可能是多个过程同时在应用不同的 CPU)。
比方下面图中的 1 分钟内的负载大概是 10,那么在过来的一分钟之内零碎当中各种程序所耗费的 CPU 工夫为 $c = 10.04 \times t$。他示意的意思就是在过来的 1 分钟之内,CPU 工夫的耗费能够看作大概有 10 个 CPU 在满负荷运行。留神:这里是能够看作是 10 个 CPU 在满负荷的运行,其实真实情况能够是在过来的一分钟之内有 20 个 CPU 在进行计算,而后每个 CPU 的计算工夫为 $\frac{1}{2}t$,或者其余雷同的 CPU 耗费状况。
第二行
- 第二行次要示意以后零碎当中工作的相干状况,所谓工作就是以后零碎当中一共有多少个过程。
652 totoal
,这个示意以后零碎当中一共有 652 个过程。1 runnung
,示意有一个过程正在执行。651 sleeping
,示意有 651 个过程处于睡眠状态,也就是不须要应用 CPU 的状态。0 stoped
,示意有 0 个过程处于stopped
状态,这个状态就是被停下来的过程,比如说通过 ctrl+ z 让一个过程停下来,你能够通过给这个过程发送一个信号 SIGCONT 让这个过程复原执行,linux 当中过程的状态变换如下所示:0 zombie
,这个就示意僵尸过程的个数,这里是 0 个僵尸过程,所谓僵尸过程就是一个过程执行实现了,对于 C 程序来说你能够了解为你的main
函数执行实现了(这个不够精确,其实main
函数执行实现之后还会有其余函数须要执行,然而这里你能够大抵这么了解),如果这个时候(函数执行实现),这个过程的父过程却没有承受子过程发送给他的信号(子过程在执行实现之后会给父过程发送信号,父过程须要通过 wait 等零碎调用去承受这个信号),那么子过程就处于 zombie 状态,处于这个状态的过程就须要父过程承受它发送的信号,而后子过程的系统资源就能够被回收了,而后子过程会彻底沦亡。
咱们当初花一点工夫来谈一谈 linux 当中的过程状态。
Ready
,当过程被创立实现之后他就处于Ready
状态,在这个状态下的过程只差 CPU 了,也就是说,他当初只须要被操作系统调度获取 CPU 而后他就能够执行了。Running
,当过程从Ready
状态获取 CPU 的执行权的时候,过程就处于 Running 状态,这个状态示意过程正在执行。traced
,这个状态次要是一个过程处于调试状态,这个状态须要调试的过程给这个被调试的过程发送信号,而后和这个过程才能够继续执行。Zombie
,当过程执行实现之后,父过程承受子过程发送的信号之前,过程就处于这个状态。Suspended
,这个状态示意过程被挂起,当过程申请 IO 的时候,须要阻塞期待 IO 申请实现,这个时候的过程状态就是Suspened
状态。
第三行
这一行次要是各种工夫所占的百分比的统计,这个数据的统计工夫区间是,从本次刷新到上一次刷新之间,切实这个区间统计的数据
us
,运行没有指定优先级的用户过程所耗费的 CPU 工夫所占百分比,默认的终端执行的程序都是没有指定优先级的,咱们能够应用nice
这个命令来扭转程序执行的优先级:sudo nice -n -10 ./time
。sy
,运行内核过程所耗费的 CPU 工夫所占的百分比。ni
,运行指定了批改过优先级之后的用户过程所占的 CPU 工夫百分比。这里能够联合 PR 和 NI 两个字段进行剖析,咱们当初执行sudo nice -n 10 ./a.out
命令,在./a.out 当中我启动了 10 个死循环的线程,咱们来看一下它的 top 输入后果:
从下面的后果来看咱们通过 nice 命令批改来过程优先级,然而须要次要的是一个过程的 PR 值越大他的优先级越低,NI 值越大优先级越低,也就是说咱们下面实际上是升高了过程执行的优先级了,然而咱们能够看到 ni 的值是发生变化了的,这也印证了下面咱们所谈到的 ni 值发生变化的过程。咱们再来看一下没有设置优先级的后果,间接执行sudo ./a.out
:
然而在试验测试的过程当中发现了一个奇怪的问题,但咱们晋升过程的优先级(晋升优先级须要管理员权限)的时候 ni 的值没有发生变化,因而下面所谈到的 ni 的变动应该只实用于普通用户的过程(因为升高优先级不须要管理员权限)。
id
,idle 过程执行所占的 CPU 工夫百分比,当零碎当中没有足够的过程让 CPU 执行的时候,idle 过程会被调度到 CPU 上进行执行,这个 idle 过程是为了让操作系统可能良好的执行起来所设置的,idle 过程次要执行 HLT 指令,这个指令次要是让 CPU 节能,不须要 CPU 满负荷运行,因为这个时候没有具体的过程须要执行,这个百分比越大阐明零碎负载越轻,CPU 不忙碌。wa
,这个很好解释,期待 IO 的工夫。hi
,解决硬件中断所耗费的工夫。si
,处理软件中断所耗费的工夫st
,这个工夫略微有点简单,IBM 解释原文为:
Steal time is the percentage of time a virtual CPU waits for a real CPU while the hypervisor is servicing another virtual processor.
这个次要是虚拟机的虚构 CPU 期待实在物理 CPU 的工夫,能够大抵认为是 Ready
状态到 Running
状态的等待时间,如果这个值越大阐明虚拟机运行状态越不好,因为它期待实在 CPU 的工夫很长。
第四行
这一行示意的是物理内存的信息,单位是 KiB。
- total, 示意一共有多少内存,也就是物理内存大小。
- free, 示意还有多少物理内存没有应用。
- used, 示意应用了多少物理内存。
- buff/cache, 示意用于用于缓存的物理内存的大小。
第五行
这一行次要示意的是对换区的数据,所谓对换区就是当操作系统发现内存满了之后,操作系统会抉择局部不常应用的页面将它放到磁盘当中当须要应用的时候再将这部分数据从磁盘当中读取进去。
- total, 示意对换区的总大小。
- free, 示意对换区当中还有多少空间没有应用。
- used, 示意对换区当中有多少空间被应用了。
- 最初一项 avail Mem 是一个可用于启动新程序的内存大小的估计值。
表头内容含意
- PID,示意过程号,就是每个过程的 ID。
- USER,就是用户的名称。
- PR,优先级值。
- NI,nice 值,通过程序给过程设置的。
- VIRT,过程应用的虚拟内存的大小,单位是 KiB。
- RES,常驻内存的内存大小,单位是 KiB。
- SHR,共享内存的大小,单位是 KiB。
-
S,示意过程的状态,有一下几个状态。
- D,不可能中断的睡眠状态。
- R,示意程序正在 CPU 上执行。
- S,示意过程正在睡眠。
- T,过程被信号进行执行。
- t,示意过程正在被调试器追踪,调试器将这个过程停了下来。
- Z,zombie 示意是一个僵尸过程。
- %CPU,上次一刷新之前对应的过程对 CPU 的占有率,这个值是能够冲破 100% 的,因为一个过程能够有多个过程,比方上面这样,咱们开启 10 个线程进行死循环:
#include <pthread.h>
void* func(void * args) {while (1)
{/* code */}
}
int main() {
#define num_threads 10
pthread_t t[num_threads];
for(int i = 0; i < num_threads; i++) {pthread_create(&t[i], NULL, func, NULL);
}
for (size_t i = 0; i < num_threads; i++)
{pthread_join(t[i], NULL);
}
return 0;
}
执行下面的程序之后,top 的输入后果如下所示:
从下面的这个后果咱们能够晓得 CPU 的占有率是能够超过 %100 的,这个值的计算次要是在刷新之间内一个过程耗费的 CPU 工夫和在这段时间内一个 CPU 可能产生的 CPU 工夫的比值。
- %MEM,这个次要是过程应用的内存占用理论的可用的物理内存的比例。
- TIME+,这个示意自从过程启动以来累计耗费的 CPU 工夫。
- COMMAND,这个示意启动过程的时候执行的命令。
top 命令交互操作
- c,具体显示命令行的内容,你在交互模式下间接按下键盘上的 c 即可。
- o,在交互模式下先按下键盘上的 o,而后就能够输出过滤条件,在这里拆穿的是 COMMAND=a.out 的过程:
- k,shell 给咱们提供了一个十分不便的操作咱们能够在交互模式下抉择咱们想要杀死的过程,比方在下图当中咱们杀死过程 135020。
咱们先在交互模式下先按下键盘上的 k,而后输出过程号,而后输出回车,再输出想发送的信号类型。
输出过程号
再输出想要发送的信号:
这里能够输出代表信号的数字,也能够输出代表信号的名字,不同的信号的名字和代表输出如下:
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
- u,通过用户过滤,在交互模式下按下键盘上的 u 键,而后就能够输出你想看那个用户的过程,输出对应的用户名称即可,比如说看 root 用户的过程:
而后咱们就只可能看到 root 用户的过程了。
- h,查看帮忙信息:
- i,过滤掉 CPU 利用率很低的过程,很多时候咱们在进行系统分析的时候须要去判断那个过程 CPU 占有率高,因而 i 是一个十分无效的形式过滤掉烦扰过程。
以上就是本篇文章的所有内容了,我是LeHung,咱们下期再见!!!更多精彩内容合集可拜访我的项目:https://github.com/Chang-LeHu…
关注公众号:一无是处的钻研僧,理解更多计算机(Java、Python、计算机系统根底、算法与数据结构)常识。