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

网友投稿 977 2022-11-30

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

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时间表示:

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 availableMem: 1388 945 81 10 361 289Swap: 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 availableMem: 1388 944 163 10 279 291Swap: 0 0 0

交换区使用情况

Swap(内存交换区):

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

1.5 字段/列

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

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

PID  进程ID,进程的唯一标识符USER  进程所有者的实际用户名。PR  进程的调度优先级。这个字段的一些值是’rt’。这意味这这些进程运行在实时态。NI   进程的nice值(优先级)。越小的值意味着越高的优先级。VIRT  进程使用的虚拟内存。RES   驻留内存大小。驻留内存是任务使用的非交换物理内存大小。SHR   SHR是进程使用的共享内存。S 这个是进程的状态。它有以下不同的值:

D – 不可中断的睡眠态。R – 运行态S – 睡眠态T – 被跟踪或已停止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.12Threads: 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 stKiB Mem : 12116176 total, 6138384 free, 2316952 used, 3660840 buff/cacheKiB 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非常高。

这里利用Python非常方便的把十进制的线程ID转化成了16进制,为什么要这么做呢?因为在接下来的线程DUMP文件中使用的就是16进制的NID。

在实际中,我们应该利用jstack pid多DUMP几次,因为线程存在状态转换,因此多次DUMP有利于抓取到线程更多的信息。图中,你可以观察到,一个线程得到了锁,在运行,迟迟没有释放,而另一个线程一直在等待这个锁。至此,就可以到去查看代码去分析为什么锁迟迟不释放的原因了。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Prometheus nginx-vts-exporter 监控 Nginx
下一篇:Spring Cloud中使用Feign,@RequestBody无法继承的解决方案
相关文章

 发表评论

暂时没有评论,来抢沙发吧~