0
点赞
收藏
分享

微信扫一扫

Linux 一篇文章带你循序渐进top命令


Linux中的top命令显示系统上正在运行的进程。它是系统管理员最重要的工具之一。被广泛用于监视服务器的负载。在本篇中,我们会探索top命令的细节。top命令是一个交互命令。在运行top的时候还可以运行很多命令。我们也会探索这些命令。

(译注:不同发行版的top命令在各种细节有不同,如果发现不同时,请读你的帮助手册和命令内的帮助。)

 

1. Top 命令输出

首先,让我们了解一下输出。top命令会显示系统的很多信息。我们需要理解不同部分输出的意义:默认运行时,top命令会显示如下输出:

Linux 一篇文章带你循序渐进top命令_top命令

前几行水平显示了不同系统参数的概括,接下来是进程和它们在列中的属性。

1.1 第一行——基本信息 系统运行时间和平均负载

Linux 一篇文章带你循序渐进top命令_数据_02

 top命令的顶部显示与uptime命令相似的输出。

这些字段显示:

  • 当前时间
  • 系统已运行的时间
  • 当前登录用户的数量
  • 相应最近5、10和15分钟内的平均负载。

可以使用’l’命令切换uptime的显示。

 

Linux 一篇文章带你循序渐进top命令_top命令_03

load average:

  load average 表示系统负载均值,使用 top 或 uptime 可以查看到负载均值的信息,三个数值分表表示 1分钟内 、5分钟内 、 15分钟内的系统负载均值,要理解这三个数值的含义,首先要了解系统的“核数”

​  系统的核数 = CPU1 x CPU1的核数 + CPU2 x CPU2的核数 + CPUn x CPUn的核数 + ……

  更清楚的讲,在Linux系统中输入命令​​grep -c 'model name' /proc/cpuinfo​​,即可得到核数。

  回到负载均值,​​负载均值的饱和值等于系统的核数​​​, 所以,根据load average观察系统负载首先要看系统中共有多少"核",单处理器单核的饱和值为 1,单处理器双核的饱和值为2,双处理器单核的饱和值也为2.
  理解负载均值的最经典的例子是把一个CPU的核当做一座单行单向桥,多核即为多行路单向桥.如图:

Linux 一篇文章带你循序渐进top命令_java_04

假定,目前系统是单核系统,根据上面的描述,它的负载饱和值为1.这种条件下,各种数值的含义如下:

  • 0.00 表示桥上没有任何车流,非常畅通
  • 0.50 表示桥上有最高承载量一半的车流,也比较流畅.
  • 1.00 表示桥上已经达到了最大承载量,如果再有车来,可能就要稍等才能上桥了,这种情况下,车速都会很慢,往往都会造成负载均值继续上升.
  • 1.70 表示桥已经达到最大负载,且还有相对于桥最大负载70%的车辆等待上桥,这个时候的系统,已经要不堪重负了.

在实际应用中,重点关注5分钟,15分钟的负载均值,当达到0.7时,就需要调查原因了。 

​​Linux查看物理CPU个数、核数、逻辑CPU个数​​

# 总核数 = 物理CPU个数 X 每颗物理CPU的核数

# 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数

 

# 查看物理CPU个数

cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l

# 查看每个物理CPU中core的个数(即核数)

cat /proc/cpuinfo| grep "cpu cores"| uniq

# 查看逻辑CPU的个数

cat /proc/cpuinfo| grep "processor"| wc -l

# 查看CPU信息(型号)

cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c

 

1.2 任务信息

Linux 一篇文章带你循序渐进top命令_java_05

第二行显示的是任务或者进程的总结。进程可以处于不同的状态。这里显示了全部进程的数量。除此之外,还有正在运行、睡眠、停止、僵尸进程的数量(僵尸是一种进程的状态)。这些进程概括信息可以用’t’切换显示。

Linux 一篇文章带你循序渐进top命令_数据_06

僵尸进程:表示已经终止,但仍然保留一些信息的进程。其等待父进程调用wait(),就可以从内存中完全移除。 僵尸进程无法使用 ​kill​​ 清理。如果要手动清理僵尸进程,需要找到其父进程,kill掉父进程后,Linux的 ​​init​​ 进程将接管该僵尸进程(linux中所有的子进程都需要有父进程,当父进程被kill后,其所有子进程将过继给init进程),init进程隔一段时间去调用wait(),来清除僵尸进程。 

 

1.3 CPU 状态 

Linux 一篇文章带你循序渐进top命令_linux_07

Linux 一篇文章带你循序渐进top命令_top命令_08

Linux 一篇文章带你循序渐进top命令_top命令_08

下一行显示的是CPU状态。这里显示了不同模式下的所占CPU时间的百分比。这些不同的CPU时间表示:

  • us, user:运行(未调整优先级的) 用户进程的CPU时间
  • sy,system: 运行内核进程的CPU时间
  • ni,niced:运行已调整优先级的用户进程的CPU时间
  • wa,IO wait: 用于等待IO完成的CPU时间
  • hi:处理硬件中断的CPU时间
  • si: 处理软件中断的CPU时间
  • st:这个虚拟机被hypervisor偷去的CPU时间(译注:如果当前处于一个hypervisor下的vm,实际上hypervisor也是要消耗一部分CPU处理时间的)。

可以使用’t’命令切换显示。

1.4 内存使用

Linux 一篇文章带你循序渐进top命令_linux_10

Linux 一篇文章带你循序渐进top命令_linux_11

 

接下来两行显示内存使用率,有点像’free’命令。第一行是物理内存使用,第二行是虚拟内存使用(交换空间)。

物理内存显示如下:全部可用内存、已使用内存、空闲内存、缓冲内存。相似地:交换部分显示的是:全部、已使用、空闲和缓冲交换空间。 

内存显示可以用’m’命令切换。

buff/cache:

buffers 和 cache 都是内存中存放的数据,不同的是,buffers 存放的是准备写入磁盘的数据,而 cache 存放的是从磁盘中读取的数据
在Linux系统中,有一个守护进程(daemon)会定期把buffers中的数据写入的磁盘,也可以使用 sync 命令手动把buffers中的数据写入磁盘。使用buffers可以把分散的 I/O 操作集中起来,减少了磁盘寻道的时间和磁盘碎片。
cache是Linux把读取频率高的数据,放到内存中,减少I/O。Linux中cache没有固定大小,根据使用情况自动增加或删除。

# 手动把buffers写入硬盘并清空cache
[root@k8s-master ~]# free -m
total used free shared buff/cache available
Mem: 1388 945 81 10 361 289
Swap: 0 0 0
[root@k8s-master ~]# sync && echo 3 > /proc/sys/vm/drop_caches
[root@k8s-master ~]# free -m
total used free shared buff/cache available
Mem: 1388 944 163 10 279 291
Swap: 0 0 0

交换区使用情况

Linux 一篇文章带你循序渐进top命令_数据_12

Swap(内存交换区):

  是硬盘上的一块空间。在内存不足的情况下,操作系统把内存中不用的数据存到硬盘的交换区,腾出内存来让别的程序运行。因此,开启swap会一定程度的引起 I/O 性能下降(阿里服务器默认不开)。

  1.5 字段/列

Linux 一篇文章带你循序渐进top命令_数据_13

Linux 一篇文章带你循序渐进top命令_数据_14

 在横向列出的系统属性和状态下面,是以列显示的进程。不同的列代表下面要解释的不同属性。

默认上,top显示这些关于进程的属性:

  • PID  进程ID,进程的唯一标识符
  • USER  进程所有者的实际用户名。
  • PR  进程的调度优先级。这个字段的一些值是’rt’。这意味这这些进程运行在实时态。
  • NI   进程的nice值(优先级)。越小的值意味着越高的优先级。
  • VIRT  进程使用的虚拟内存。
  • RES   驻留内存大小。驻留内存是任务使用的非交换物理内存大小。
  • SHR   SHR是进程使用的共享内存。
  • S 这个是进程的状态。它有以下不同的值:
  1. D – 不可中断的睡眠态。
  2. R – 运行态
  3. S – 睡眠态
  4. T – 被跟踪或已停止
  5. Z – 僵尸态
  • %CPU  自从上一次更新时到现在任务所使用的CPU时间百分比。
  • %MEM   进程使用的可用物理内存百分比。
  • TIME+   任务启动后到现在所使用的全部CPU时间,精确到百分之一秒。
  • COMMAND  运行进程所使用的命令。

还有许多在默认情况下不会显示的输出,它们可以显示进程的页错误、有效组和组ID和其他更多的信息。

 

2. 命令行选项

打开top,可以指定更新的周期。

输入H,打开隐藏的线程;输入1,可以显示单核CPU使用情况。

top -H -b -d 1 -n 200 > top.txt,每个1秒统计一次,共200次,显示线程细节,并保存到top.txt中。

# top -Hp 1235     #该进程下的各个线程运行情况

top - 13:48:21 up 7 days, 5:35, 1 user, load average: 0.05, 0.05, 0.12
Threads: 68 total, 0 running, 68 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.2 us, 0.2 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 12116176 total, 6138384 free, 2316952 used, 3660840 buff/cache
KiB Swap: 6094844 total, 6094844 free, 0 used. 9469988 avail Mem

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1545 root 20 0 5569144 990384 16348 S 0.3 8.2 6:06.52 java
1235 root 20 0 5569144 990384 16348 S 0.0 8.2 0:00.04 java
1520 root 20 0 5569144 990384 16348 S 0.0 8.2 0:02.43 java
1521 root 20 0 5569144 990384 16348 S 0.0 8.2 0:00.41 java
1522 root 20 0 5569144 990384 16348 S 0.0 8.2 0:00.42 java
1523 root 20 0 5569144 990384 16348 S 0.0 8.2 0:00.42 java
1524 root 20 0 5569144 990384 16348 S 0.0 8.2 0:00.42 java
1525 root 20 0 5569144 990384 16348 S 0.0 8.2 6:10.18 java
1526 root 20 0 5569144 990384 16348 S 0.0 8.2 0:00.02 java
1527 root 20 0 5569144 990384 16348 S 0.0 8.2 0:00.05 java
1528 root 20 0 5569144 990384 16348 S 0.0 8.2 0:00.06 java

-p: 监控特定的PID

你可以用-p选项监控指定的PID。PID的值为0将被作为top命令自身的PID。

 

一次线上问题排查模拟

背景:服务在平稳运行一段时间后,CPU突然飙高。

Linux 一篇文章带你循序渐进top命令_数据_15

通过top命令,可以确认下,到底是哪个进程导致CPU飙高了(也许是误报呢?)。

可以看到图中PID是2816的进程,CPU使用率非常高。 

Linux 一篇文章带你循序渐进top命令_数据_16

使用top -Hp 2816来对进程下的线程进行观察。图中可以发现,2825这个线程CPU非常高。 

Linux 一篇文章带你循序渐进top命令_数据_17

这里利用Python非常方便的把十进制的线程ID转化成了16进制,为什么要这么做呢?

因为在接下来的线程DUMP文件中使用的就是16进制的NID。

Linux 一篇文章带你循序渐进top命令_top命令_18

Linux 一篇文章带你循序渐进top命令_top命令_18

Linux 一篇文章带你循序渐进top命令_java_20

在实际中,我们应该利用jstack pid多DUMP几次,因为线程存在状态转换,因此多次DUMP有利于抓取到线程更多的信息。

图中,你可以观察到,一个线程得到了锁,在运行,迟迟没有释放,而另一个线程一直在等待这个锁。至此,就可以到去查看代码去分析为什么锁迟迟不释放的原因了。

举报

相关推荐

0 条评论