一,CPU基本知识
测试中CPU诊断是重要的性能指标, CPU是代码打交道最多的硬件之一,要想一个CPU工作就需要提供一些指令和数据,一般放在内存中,其中指令一般都是由代码编译而来,数据也是代码中需用到的,如int、char,程序需要执行的部分先装载进内存,系统会给程序分配cpu时间,cpu从内存中取出相应指令进行解码执行,以此类推直到程序退出
二,CPU运行状态
三,Linux的触发手段
从用户空间到内核空间有两种触发手段:
1.系统调用: 用户空间的应用程序,通过系统调用,进入内核空间。这个时候用户空间的进程要传递很多变量、参数的值给内核,内核态运行的时候也要保存用户进程的一些寄存器值、变量等。所谓的“进程上下文”,可以看作是用户进程传递给内核的这些参数以及内核要保存的那一整套的变量和寄存器值和当时的环境等。
2.中断: 硬件通过触发信号,导致内核调用中断处理程序,进入内核空间。例如网卡发送一个数据包或硬盘驱动器提供一次 IO 请求等。这个过程中,硬件的一些变量和参数也要传递给内核,内核通过这些参数进行中断处理。所谓的“中断上下文”,其实也可以看作就是硬件传递过来的这些参数和内核需要保存的一些其他环境(主要是当前被打断执行的进程环境)。
四,CPU指标查看相关指令
Linux中CPU信息储藏在/proc/cpuinfo (cat /proc/cpuinfo)
查看cpu核数的指令:
方法一:1,物理CPU数统计 :cat /proc/cpuinfo/ | grep ’‘physical id’‘ | sort| uniq |wc -l
2,核心数CPU数统计 :cat /proc/cpuinfo/ | grep ’‘core id’‘ | sort| uniq |wc -l
3,总逻辑CPU数统计 :cat /proc/cpuinfo/ | grep ’‘processor’‘ | sort| uniq |wc -l
方法二:top命令
方法三:lscpu
五,CPU重要指标
1,占用率
2,CPU队列
3,中断
4,上下文切换
5.1 占用率
使用率的标准:50 70 90 (50 %以下不用关注 70%要告警 90%cpu需要优化)
单核:
1、CPU使用率70%
2、CPU空闲率:1-70%=30%
四核:
1、总CPU400%:400*70%=280%
2、总空闲率:400%-280%=120%
性能监控中,测试需要关注至少要100%的空闲时间 计算触发告警的数值: 以4核为例:400% - 100% = 300%, 则告警使用率:300/400 = 75%
5.2 队列
当CPU过载的时候,超过负载的时候,就会调度期跟不上系统要求,队列就会排队,那需要在Linux中查看队列信息来帮助分析
如何判断系统队列情况:
系统负载<=CPU总核数,表示系统不忙
CPU总核数<=系统负载<=CPU总核数*3,不确定,需要结合其他资源来分析
系统负载>=CPU总核数*3,表示系统忙(系统队列会很多) 系统负载是通过运行状态+阻塞状态的进程计算出来的
top命令查看系统负载
5.3 中断
当鼠标进行点击,磁盘设备完成读写,都会通过中断通知CPU外部完成了,其中分为硬中断和软中断两种;
硬中断:可直接中断CPU(中断数是记录在/proc/interrupts) 软中断:主要处理网络包
cpu信息中有hi和si,cpu花了大量时间处理硬中断则hi较高, 如果处理网络包多则si占比较高
id :cpu的空闲率,如果过小说明cpu有瓶颈
如何找中断源:
中断源分析:
si :常见的软件中断一般都是和网络有关。从网卡到IP层的数据报文收发都是si处理的,长时间写日志也可能产生软件中断。
hi:使用率过高时,表示当前硬件中断占用很大的百分比。一般硬件中断我们可以分析文件/proc/interrupts、/proc/irq/pid/smp_affinity、服务irqbalance是否配置,以及CPU的频率设置,通过这些可以帮系统打散优化系统的硬件中断。
5.4 上下文切换
1,上下文:储存CPU正在执行的指令位置,下一条指令位置
2,上下文切换:保存上一个任务的上下文到内核,加载新任务的上下文,运行新任务,新任务运行完了之后呢,再次调度上一个任务,这样任务就是看起来持续进行
Linux中查看上下文命令:
vmstat命令 : cs数据表示上下文,in表示中断
六、性能分析
发现在CPU有问题后下一步该怎么分析?
1,用top找到最耗CPU PID (通过找到大量消耗进程的PID,找到下面的线程TID)
2,用top-Hp PID 找到最耗CPU TID
3,PID十进制转换为十六进制
4,(Java中用于分析进程的)jstack 进程 | grep -A10 -B10 线程 通过jd-gui 反编译工具,查看class文件,直接拖入class文件就可以了