性能分析步骤
性能优化工具
1、性能指标
性能指标概念:高并发 => 吞吐 响应快 => 延时
该概念是从应用负载的角度出发:Application ▹Libraries▹System Call▹Linux
Kernel ▹Drive
与之对应的是系统资源视角出发 :Drive▹Linux Kernel ▹System Call ▹Libraries
▹Application
性能指标的评判有以上二种常用的角度
接着六步
1.选择性能指标评估应用和系统的性能
2.为应用和系统设定性能目标
3.进行性能基准测试
4.性能分析定位瓶颈
5.优化系统和应用程序
6.性能监控和告警
六步总结,从正确的角度出发,设定目标(性能优化不是漫无目的的),基准测试
(了解现有系统应用的运行时情况),根据情况分析瓶颈,优化它,设置监控和告警
(其实可以再扩展比如达到一定的负载,采取降级等操作)
2、系统变慢(首先用top或者uptime命令,来了解系统的负载情况)
uptime(依次是过去1分钟、5分钟、15分钟的平均负载)
①平均负载是指单位时间内,系统处于可运行状态和不可中断状态的平均进程数,也就是平
均活跃进程数,平均活跃进程数,直观上的理解就是单位时间内的活跃进程数,但它实际上
是活跃进程数的指数衰减平均值。平均负载不仅包括了正在使用 CPU 的进程,还包括等待
CPU 和等待 I/O 的进程。
1> 可运行状态的进程,是指正在使用CPU或者正在等待CPU的进程,也就是ps命令看到的,处于R
状态(Running 或 Runnable)的进程。
2> 不可中断状态的进程则是正处于内核态关键流程中的进程,并且这些流程是不可打断的,比如最
常见的是等待硬件设备的I/O响应,也就是ps命令中看到的D状态(Uninterruptible Sleep,也称为
Disk Sleep)的进程。不可中断状态实际上是系统对进程和硬件设备的一种保护机制。进程长时间处
于不可中断状态,通常表示系统有 I/O 性能问题。
②一般当平均负载高于 CPU 数量70%的时候,就应该分析排查负载高的问题。
stress 是一个 Linux 系统压力测试工具,用作异常进程模拟平均负载升高的场景。使用的
是 sync() 系统调用 stress的下一代stress-ng
sysstat 包含了常用的 Linux 性能工具,用来监控和分析系统的性能。
mpstat 是一个常用的多核 CPU 性能分析工具
pidstat 是一个常用的进程性能分析工具
③ 平均负载分析:
平均负载高有可能是 CPU 密集型进程导致的;
平均负载高并不一定代表 CPU 使用率高,还有可能是 I/O 更繁忙了;
当发现负载高的时候,可以使用 mpstat、pidstat htop(基于sar)等工具,辅助分析
负载的来源
三、上下文切换(上下文切换是对任务当前运行状态的暂存和恢复)
1、CPU 上下文切换,
就是先把前一个任务的 CPU 上下文(也就是 CPU 寄存器和程序计数器)保存起来,然后加载新任务的上
下文到这些寄存器和程序计数器,最后再跳转到程序计数器所指的新位置,运行新任务,一次系统调用的
过程,其实是发生了两次 CPU 上下文切换
多个进程竞争CPU时,CPU为了保证每个进程能公平被调度运行,采取了处理任务时间分片的机制,轮流
处理多个进程,由于CPU处理速度非常快,在人类的感官上认为是并行处理,实际是"伪"并行,同一时间只有
一个任务在运行处理。
注:每次上下文切换都需要几十纳秒到数微秒的 CPU 时间
2、进程上下文切换,是指从一个进程切换到另一个进程运行。进程是由内核来管理和调度
的,进程的切换只能发生在内核态
注:内核空间(Ring 0)具有最高权限,可以直接访问所有资源;
用户空间(Ring 3)只能访问受限资源,不能直接访问内存等硬件设备,必须通过系统调用陷入到内
核中,才能
访问这些特权资源。
3、线程上下文切换(线程是调度的基本单位,而进程则是资源拥有的基本单位),有两种情况
① 前后两个线程属于不同进程。因为资源不共享,所以切换过程就跟进程上下文切换是一样。
② 前后两个线程属于同一个进程。此时,因为虚拟内存是共享的,所以在切换时,虚拟内存这些资源
就保持不动,只需要切换线程的私有数据、寄存器等不共享的数据。系统调用属于同进程内的CPU上下文
切换
4、中断上下文切换,中断处理会打断进程的正常调度和执行,对同一个 CPU 来说,中断处理比进程拥有
更高的优先级,要消耗CPU,中断是一种异步的事件处理机制,可以提高系统的并发处理能力
注:系统调用过程通常称为特权模式切换,而不是上下文切换
5、什么情况下会触发上下文切换?
系统调用、进程状态转换(运行、就绪、阻塞)、时间片耗尽、系统资源不足、sleep、优先级调整
6、有哪些减少上下文切换的技术用例?
数据库连接池(复用连接)、合理设置应用的最大进程,线程数、直接内存访问DMA、零拷贝技术
7、解决上下文切换次数过多的问题时,
①借助 vmstat 、 pidstat 和 /proc/interrupts 等工具,来辅助排查性能问题的根源。
疑CPU存在瓶颈,可用 sar u 和 sar q 等来查看
怀疑内存存在瓶颈,可用sar B、sar r 和 sar W 等来查看
怀疑I/O存在瓶颈,可用 sar b、sar u 和 sar d 等来查看
②CPU 上下文切换可能是,系统卡慢的罪魁祸首
/proc/interrupts 提供了一个只读的中断使用情况
③中断的变化情况:变化速度最快的是重调度中断(RES)唤醒空闲状态的 CPU 来调度新的任务运行。这
是多处理器系统(SMP)中,调度器用来分散任务到不同 CPU 的机制,通常也被称为处理器间中断
(Inter-Processor Interrupts,IPI)。
8、上下文切换总结:
自愿上下文切换变多了,说明进程都在等待资源,有可能发生了 I/O 等其他问题;
非自愿上下文切换变多了,说明进程都在被强制调度,也就是都在争抢 CPU,说明 CPU 的确成了瓶颈;
中断次数变多了,说明 CPU 被中断处理程序占用,还需要通过查看 /proc/interrupts 文件来分析具体的
中断类型。
四、CPU 使用率升高处理
用户 CPU 和 Nice CPU 高,说明用户态进程占用了较多的 CPU,所以应该着重排查进程的性能问题。
系统 CPU 高,说明内核态占用了较多的 CPU,所以应该着重排查内核线程或者系统调用的性能问题。
I/O 等待 CPU 高,说明等待 I/O 的时间比较长,所以应该着重排查系统存储是不是出现了 I/O 问题。
软中断和硬中断高,说明软中断或硬中断的处理程序占用了较多的 CPU,所以应该着重排查内核中的中断
服务程序。
借助 top、pidstat 等工具,确认引发 CPU 性能问题的来源;再使用 perf 等工具,排查出引起性能问题的
具体函数。
五、某应用CPU使用率居然达到100% 解决方法
用户 CPU 和 Nice CPU 高,说明用户态进程占用了较多的 CPU,所以应该着重排查进程的性能问题。
系统 CPU 高,说明内核态占用了较多的 CPU,所以应该着重排查内核线程或者系统调用的性能问题。
I/O 等待 CPU 高,说明等待 I/O 的时间比较长,所以应该着重排查系统存储是不是出现了 I/O 问题。
软中断和硬中断高,说明软中断或硬中断的处理程序占用了较多的 CPU,所以应该着重排查内核中的中断
服务程序。
碰到 CPU 使用率升高的问题,可以借助 top、pidstat 等工具,确认引发 CPU 性能问题的来源;再使用
perf 等工具,排查出引起性能问题的具体函数。
六、系统CPU使用率居然达到100% 解决方法
① execsnoop 是一个专为短时进程设计的工具。通过 ftrace 实时(动态追踪)监控进程的 exec() 行为,并
输出短时进程的基本信息,包括进程 PID、父进程 PID、命令行参数以及执行的结果。一般用于分析 Linux
内核的运行时行为
②碰到常规问题无法解释的 CPU 使用率情况时,首先要想到有可能是短时应用导致的问题,比如有可能是下
面这两种情况
第一,应用里直接调用了其他二进制程序,这些程序通常运行时间比较短,通过 top 等工具也不容易发
现。
第二,应用本身在不停地崩溃重启,而启动过程的资源初始化,很可能会占用相当多的 CPU。
对于这类进程,可以用 pstree 或者 execsnoop 找到它们的父进程,再从父进程所在的应用入手,排查问
题的根源。
七、
R 是 Running 或 Runnable 的缩写,表示进程在 CPU 的就绪队列中,正在运行或者正在等待运行。
D 是 Disk Sleep 的缩写,也就是不可中断状态睡眠(Uninterruptible Sleep),一般表示进程正在跟硬
件交互,并且交互过程不允许被其他进程或中断打断。
Z 是 Zombie 的缩写,如果你玩过“植物大战僵尸”这款游戏,应该知道它的意思。它表示僵尸进程,也
就是进程实际上已经结束了,但是父进程还没有回收它的资源(比如进程的描述符、PID 等)。
S 是 Interruptible Sleep 的缩写,也就是可中断状态睡眠,表示进程因为等待某个事件而被系统挂起。当
进程等待的事件发生时,它会被唤醒并进入 R 状态。
I 是 Idle 的缩写,也就是空闲状态,用在不可中断睡眠的内核线程上。前面说了,硬件交互导致的不可中
断进程用 D 表示,但对某些内核线程来说,它们有可能实际上并没有任何负载,用 Idle 正是为了区分这种
情况。要注意,D 状态的进程会导致平均负载升高, I 状态的进程却不会。
T 或者 t,是 Stopped 或 Traced 的缩写,表示进程处于暂停或者跟踪状态。向一个进程发送 SIGSTOP
信号,它就会因响应这个信号变成暂停状态(Stopped);再向它发送 SIGCONT 信号,进程又会恢复运
行(如果进程是终端里直接启动的,则需要你用 fg 命令,恢复到前台运行)。
注: kill -Stop、debug调试、收到信号、被ptrace系统调用跟踪时进入该状态
而当你用调试器(如 gdb)调试一个进程时,在使用断点中断进程后,进程就会变成跟踪状态,这其实也
是一种特殊的暂停状态,只不过你可以用调试器来跟踪并按需要控制进程的运行。
X 是 Dead 的缩写,表示进程已经消亡,不会在 top 或者 ps 命令中看到它。
九、软中断
①Linux 将中断处理过程分成了两个阶段,也就是上半部和下半部:
上半部直接处理硬件请求,即硬中断,特点是快速执行,在中断禁止模式下运行,主要处理跟硬件紧密相
关的或时间敏感的工作,/proc/interrupts 提供了硬中断的运行情况
下半部则是由内核触发,即软中断,特点是延迟执行,延迟处理上半部未完成的工作,通常以内核线程的
方式运行,
/proc/softirqs 提供了软中断的运行情况,软中断包括网络收发、定时、调度、RCU锁等各种类型
TIMER(定时中断)、NET_RX(网络接收)、SCHED(内核调度)、RCU(RCU锁)
注:每个 CPU 都对应一个软中断内核线程,名字为 “ksoftirqd/CPU编号”
②如何分析是否是软中断引发的问题:
1.检测是哪个线程占用了cpu: top -H -p XX 1 / pidstat -wut -p XX 1
2.在进程中打印各线程号. 找到是哪个线程.[ 此过程也可以省略 但可以快速定位线程]
3.第一步应该可以判断出来中断数过高. 再使用 cat /proc/softirqs 查看是哪种类型的中断数过高.
4.不知道perf report -g -p XX 是否可以定位到具体的系统调用函数.
5.最终还是要查看源码,定位具体的位置,并加以验证.
十、软中断
软中断CPU使用率(softirq)升高是一种很常见的性能问题。实际生产中,我们遇到的性能瓶颈大多是网
络收发类型的软中断,特别是网络接收的软中断。可以借用 sar、tcpdump 等工具,做进一步分析。
hping3 是一个可以构造 TCP/IP 协议数据包的工具,可以对系统进行安全审计、防火墙测试、 SYN
FLOOD 攻击
十一、快速分析系统cpu瓶颈
cpu性能