Linux操作系统监控分析

时间:2021-11-18 08:47:24

性能分析点:
1、 负载机
2、网络传输
3、硬件
4、应用程序线程池
5、数据库连接池
6、代码业务逻辑
7、数据库sql执行时间
8、jvm(GC)

操作系统硬件:
cpu:计算、逻辑处理;CPU的颗粒数越多,CPU频率越高理论上能干活的效率越高

内存IO:相当于闪存、存贮CPU干活的数据,CPU与内存中有个高速缓存(什么一级缓存,二级缓存);内存越大,cpu能干活的时间越长也就是性能越好,
操作系统里面的虚拟内存(top---swap):从磁盘上虚拟一块地址空间当做内存来使用,效率没有真正内存高,一旦使用到虚拟内存那么操作系统的性能一定特别的慢,压测过程中swap里面的used在增加就说明内存使用不行了

磁盘 :存储最终数据,固态磁盘,分散式读取速率比机械磁盘高,磁盘与内存交互数据的效率越高性能越好
网卡(带宽):

Linux系统下top命令:
一、top命令下按数字键1可展开或收起全部CPU;cpu(s)就是cpu使用率;
什么是CPU使用率?CPU花了多少时间供工作进程干活就是CPU使用率,使用率其实就是时间比;
us:userCPU用户进程所消耗的CPU,用户所起的进程消耗CPU的时间比(例如root用户)
sy:systemCPU系统进程所消耗的CPU,系统内核所消耗的CPU(比如读写磁盘,进程中断上下文切换)
ni:优先级高的进程消耗的CPU,如果ni比较高,说明进程抢占比较频繁导致CPU消耗比较高
id:空闲的CPU,没有干活的CPU时间片占比多少
wa:等待io状态的CPU,等待磁盘io所消耗的CPU
hi:软中断CPU耗时,软件中断,属于内核
si:硬中断CPU耗时,外部硬件信号量造成的中断,属于内核
st:强制页交换所消耗的CPU,属于内核
用户360起了一个Java进程,这个Java进程会读写磁盘,那么这个Java用户读写磁盘消耗的CPU是系统CPU还是用户CPU?(360面试题)应该是system系统CPU,因为在读写磁盘的时候会切换到内核进程,内核去读写磁盘,所以消耗的是systemCPU
如果应用程序比较慢,定位到CPU使用过高,那么接下来怎么办?
首先看是哪个CPU消耗比较高?
1、如果是userCPU消耗比较高,找到消耗userCPU较高的进程,接着分析进程下面那个线程消耗的CPU比较高,找到线程之后然后跟踪线程栈,看线程栈调用什么方法,正在调用的方法就是造成我们CPU消耗高的原因,找到后修改检查这个方法就OK了(自己会修?不会给开发)
光标选中任务列
top命令下shift+p查看使用CPU从高到低排序
top命令下shift+m查看内存从高到低排序
top -H -p PID(进程id)看进程下的线程或者说子进程 ;还是shift+p看消耗CPU最高;看TIME+消耗CPU时间越高也就是消耗CPU高;(分析线程栈后面再补充,可提前看测试那点事公众号)
或者直接top -p PID(进程id)再接着在交互输入区输入H(光标点击pid上面空行即是交互输入区)

2、如实systemCPU消耗比较高,说明用户内核消耗比较高,看ni、st、hi、si这几个属于system的子项;
如实是hi、si中断消耗比较高,说明进程切换比较频繁,需要看进程的hi软中断消耗比较高还是si硬中断消耗比较高,需要减少进程的抢占和切换;如果是st消耗比较高,也就是强制页交换比较高,说明内存肯能不足,需要增加内存或者减少内存的使用,或者让内存提速释放,这个时候要检查内存为什么要进行频繁的页交换,基本上就是要增加内存了;
如果这几个都不高,就是systemCPU比较高,这个时候优先查看一下磁盘,是否磁盘繁忙,磁盘繁忙导致我们进程来回在内核里面进行切换,导致我们内核消耗CPU比较高;

二、top命令下load average(负载的意思简写avg)指的是正在耗费CPU的进程和正在等待
IO的进程之和
什么叫负载?:运维、dba用来衡量操作系统的好坏,负载高就说明系统有问题,反之负载低就说明系统没有什么问题;
load average负载指的是操作系统正在运行的CPU的进程,正在耗费CPU的进程加上正在等待IO的进程之和;
load average后面的三个值表示系统过去1分钟、5分钟、15分钟系统的平均负载;
load average负载跟CPU使用率的关系:
首先load average负载小于多少认为是OK的?负载小于CPU平均颗粒数认为负载是OK的;例如2核CPU,那么CPU负载小于2认为是OK的;要看CPU颗粒数,小于CPU颗粒数的平均长度(就是16核小于16,8核小于8,4核小于4...)
例如2核cup:
如果2核平均CPU使用率到了百分之九十多,负载一定会很高吗?(360面试题)
不一定;因为有消耗CPU的进程和等待IO的进程;如果消耗CPU的进程就那么一个进程消耗了百分之九十多,没有等待IO的进程,那么负载就是1,2核CPU负载是1没问题;反过来CPU使用率很低百分之十几,等待IO的进程多,那么负载就很高了;跟CPU的使用率有关系,一般来说CPU使用率高负载就高,但是不是绝对的;

三、top命令下tasks(进程)
进程几个常见状态:
running : 进程开始都是假的running状态,还没有拿到cup;拿到CPU了就是真running状态了
中断不可恢复: 去磁盘拿数据叫中断不可恢复,时间很快、可预期可控制的、不可干预状态就是 中断不可恢复
中断可恢复 : 时间不可预估叫中断可恢复
休眠
stop

a b c 三个进程 开始running
a拿到cup----running(真)---中断不可恢复(等待io)---中断等io-----------running(真)
b-------------running(假)--------running(真)--------中断可恢复-------中断可恢复
c-------------running(假)--------running(假)----------running(真)-----等待running(假)
进程中断导致CPU中断,CPU中断产生CPU的上下文切换
CPU中断:指CPU开始给某个进程干活,突然这个进程不能继续使用这个CPU,CPU给下个进程了叫CPU中断,CPU中断同时会产生CPU上下文切换,什么叫上下文切换(我现在干活干到了那里,等我回来接着干)中断要保存上下文的变量,所以要消耗系统CPU的;等待磁盘io基本不消耗系统cpu

Linux系统下vmstat命令: vmstat 2 3 (每隔2秒打印一次总共打印3次)
1、vmstat命令下procs进程;
procs进程快还是线程快?进程是程序的运行单位,一个程序至少要有一个进程,程序是以进程存在的;进程是程序运行的最小单位,线程是进程的最小单位,一个进程下必须有一个线程;
进程模式和线程模式?一个进程下只有一个线程就是进程模式;一个进程下有多个线程就是线程模式;进程模式一个线程独享资源,所以进程模式快;
那么线程的好处在哪里?多线程能支持大并发,因为一个进程下的所有线程都共享这个进程的资源,所以能支持大并发;
进程安全还是线程安全?当然是进程安全了,线程不安全,一个线程奔溃可能导致一个进程下的所有线程都奔溃;
r:正在消耗CPU的进程,正在消耗CPU的进程和正在等待io的进程;看负载的时候习惯性的看一下进程情况怎么样
b:

Linux系统下iostat命令: iostat -x 看磁盘
1、iostat命令下Device设备;
vda:设备a
vdb:设备b
rrqm/s:每秒读磁盘扇区的大小
wrqm/s:每秒写磁盘扇区的大小
r/s:每秒读磁盘次数
w/s:每秒写磁盘次数
rsec/s:每秒读磁盘字节数
wsec/s:每秒写磁盘字节数
avgrq-sz:平均每次设备io操作的数据大小(扇区)
avgqu-sz:磁盘排队的队列长度,越大说明队列等待时间越长
await:服务时间和等待时间之和
r_await:读磁盘等待的时间
w_await:写磁盘等待的时间
svctm:service time 服务时间,磁盘真正处理的时间(单次磁盘操作服务时间应该是在5毫秒以下,并且指的是机械硬盘,如果是固态硬盘还快,5毫秒以上要注意)
%util:空闲的

通过磁盘队列(别0.2以上)和磁盘等待时间基本上就可以判断磁盘是否繁忙,磁盘等待时间超过十毫秒就说明有排队了;

Linux系统下nmon命令看磁盘: 没有按照要先安装,安装好了去安装目录下打开(find / -name "*nmon*" #查找安装路径)./nmon... 即可打开;或者把nmon添加到环境变量,在任何目录下敲nmon都能打开;
nmon -fT -s 2 -c 100 (s多少秒取一次结果 c取多少次,可以得到很全面的性能报告,还可以实现操作系统无人值守的监控)
按d查看磁盘,busy超过百分之二十说明磁盘繁忙;
Linux系统下sar -d命令看磁盘,和iostat -x效果一样
system系统CPU使用过高的话,如果不是中断造成CPU使用过高的话,看看是否使用繁忙导致的(可以用isstat -x sar -d nmon查看),如果都不高用strace命令(没有则yum一个);用于跟踪系统内核调用的一个命令;
strace -c -f -p (pid) 敲完命令回车后不会自动停止,需要手动停止Ctrl+c;
%time:CPU调用比
seconds:CPU耗时
usecs/call:主动调用多少次
calls:被动调用多少次
errors:发生的错误多少次
syscall:内核,那个内核调的
如果现在CPU使用过高,并且知道进程,只能分析到那个内核调用次数最多,导致系统systemCPU使用过高;后面就没法分析了,得了解是什么东西什么时间调用了这个内核(懵逼。。。)

四、top命令下Men(物理内存)Swap(虚拟内存)
total:总的内存
used:已经使用的内存
free:剩余的内存
buffers:高速缓存,缓存的是数据,磁盘到内存
cached:高速缓冲,缓冲的是文件,内存到磁盘
如果是Java系统,看内存使用情况,只看有没有使用虚拟内存(对Java来说内存没有使用率一说,只会有GC这么一说);GC:垃圾回收,只要不频繁的进行垃圾回收就行;为什么Java应用程序没有内存使用率一说?因为Java程序启动的时候会配一个最大物理内存和最小物理内存(一般最小最大配的一样大);对于非Java应用程序存在内存使用率一说,内存使用率=已使用的内存used/总内存total;一般不超过百分之八十就行,并且确认那百分之八十的内存使用率是某一个进程占用的;

 

五、监控分析总结

top看load average负载使用情况,结合负载和CPU使用情况;
如果userCPU高查进程---查线程---查线程栈---找调用方法
systemCPU高看st(强制页交换)造成的还是hi、si中断造成的;如果是中断造成的,减少中断;st造成的可能是内存不足,如果都不是看磁盘繁忙程度iostat -x看一下avggu-sz队列长不长,await减去svctm时间之差大不大;或者sar -d同理(看avggu-sz,await,svctm);或者nmon看磁盘busy繁忙程度,打开nmon报表diskbusy持续大于20说明磁盘繁忙;
CPU分析: sar -u看CPU结合sar -q 看队列;或者vmstat看队列;
内存分析:top看内存;或者是free -m看内存 ;Java程序没有内存使用率之说,可以忽略(只看GC以及有没有使用虚拟内存)其他的不超过百分之八十;
网络分析:netstat -i看有没有RX-DRP/RX-ERR/RX-OVR不管是丢了报还是错误偏差,这些没问题就没问题;
磁盘分析:磁盘看繁忙程度iostat -x看一下avggu-sz队列长不长,await减去svctm时间之差大不大;或者sar -d同理(看avggu-sz,await,svctm);或者nmon看磁盘busy繁忙程度,打开nmon报表diskbusy持续大于20说明磁盘繁忙;
基于以上监控项有很多监控工具和命令,灵活采用就行;
典型工具:spotlight on nuix