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

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

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

 

1. Top 命令输出


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

图片

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

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

图片

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

这些字段显示:

  • 当前时间

  • 系统已运行的时间

  • 当前登录用户的数量

  • 相应最近5、10和15分钟内的平均负载。

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

 

第一行——基本信息

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的核当做一座单行单向桥,多核即为多行路单向桥.如图:

图片描述


假定,目前系统是单核系统,根据上面的描述,它的负载饱和值为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 任务信息

图片

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

任务信息

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

 

1.3 CPU 状态 

图片

CPU使用情况

CPU使用情况

下一行显示的是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 内存使用

图片

物理内存使用情况

 

接下来两行显示内存使用率,有点像’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

交换区使用情况

交换区使用情况

Swap(内存交换区):

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

  1.5 字段/列

图片

进程详细信息

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

默认上,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突然飙高。

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

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

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

程序员不可不知的Linux性能工具

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

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

程序员不可不知的Linux性能工具

程序员不可不知的Linux性能工具

程序员不可不知的Linux性能工具

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

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值