洞察纵观鸿蒙next版本,如何凭借FinClip加强小程序的跨平台管理,确保企业在数字化转型中的高效运营和数据安全?
977
2022-11-30
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小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~