CPU瓶颈分析的常用指标,怎么定位CPU是否存在瓶颈?

2020-09-10 08:47发布

CPU瓶颈分析的常用指标,怎么定位CPU是否存在瓶颈?

CPU瓶颈分析的常用指标,怎么定位CPU是否存在瓶颈?

2条回答
不吃鱼的猫
2楼 · 2020-09-10 09:22

1. CPU性能指标

前面几篇博客已经讲过CPU相关的知识点,这里先大概总结一下,总括CPU性能指标:

CPU使用率:用户态CPU使用率(user)、低优先级用户态CPU使用率(nice)、系统CPU使用率、等待IO的CPU使用率(iowait)、软中断和硬中断的CPU使用率,还有在虚拟化环境中用到的窃取CPU使用率(steal)和客户CPU使用率(guest)。

平均负载:理想情况下,平均负载等于逻辑CPU个数,这表CPU刚好全部被利用,如果大于,说明平均负载比较重。

进程上下文切换:自愿上下文切换和非自愿上下文切换。过多的上下文切换,会将原本运行进程的CPU时间,消耗在寄存器、内核栈以及虚拟内存等数据的保存和恢复上,缩短进程真正运行时间,成为性能瓶颈。

CPU缓存命中率:CPU缓存速度介于CPU和内存之间,缓存的是热点的内存数据。这些缓存按照大小分为L1、L2 、L3等三级缓存,L1、L2常用在单核中,L3则用在多核中,大小依次增大,性能依次降低(当然比内存还好是好太多)。而它们的命中率,则是衡量CPU缓存复用情况,命中率越高,性能越好。

                                                          

2. 性能工具

活学活用,把性能指标和性能工具联系起来。

第一个维度,从CPU的性能指标出发,当你要查看某个性能指标时,要清楚知道可以使用哪些性能工具。

                                                

第二个维度,从工具出发,如果安装了某个工具,要知道这个工具能提供那些指标。

                                                

如下有展示了三个工具:top、vmstat、pidstat,他们支持的指标比较多。

                                               

这张图列出了三个工具分别提供的CPU性能指标,并用虚线表示关联关系,他们几乎包含了所有CPU性能指标。举几个例子能更容易理解:

第一个例子,pidstat输出的进程用户CPU使用率升高,会导致top输出的用户使用率升高。所以,当发现top输出的用户CPU使用率有问题,可以跟pidstat输出作对比,观察是否某个进程导致,最后再用进程分析工具来分析进程行为。

第二个例子,top输出的平均负载升高,可以跟vmstat输出的运行状态和不可中断状态进程数作对比,观察是那种负载导致的平均负载升高。如果是不可中断进程数增多,就需要做I/O分析,使用对应分析工具;如果是运行状态进程数增多,就要用pidstat和top找出处于运行状态的进程是谁,再用进程分析工具分析。

最后一个例子,当发现top输出的软中断CPU使用率升高,可以查看/proc/softirqs文件中各种类型软中断的变化情况,确定是哪类软中断的问题,比如是NET_RX导致的,可继续用网络分析工具sar、tcpdump分析。

3. CPU性能优化思路

进行性能优化时通常会面临三个问题:

怎么判断它是不是有效?优化后,到底提升多少性能?

性能问题通常不是独立出现,当出现多个问题时,应当先优化哪个?

提升性能方法不唯一,要选哪种,是不是一定选提升最大的那一种?

怎么去思量这几个问题,如何去解决:

第一个问题,确定性能的量化指标,以及优化前后的性能问题的测试对比。性能的量化指标有很多,CPU使用率、应用程序吞吐量、客户端请求的延迟等。秉持的原则就是不要局限于单一维度的指标。以web应用为例:

  • 应用程序维度,可以用吞吐量和请求延迟来评估应用性能。

  • 系统资源维度,可以用CPU使用率来评估系统的CPU使用情况。

之所以选择这两个维度,是因为应用程序和系统资源两者是相辅相成的。好的应用程序是性能优化的最终目的和结果,系统优化总是为应用程序服务的。系统资源的使用情况是影响应用程序性能的根源。

第二个问题,在性能测试领域,流传很广的一个说法是“二八原则”,也就是80%的问题是由20%代码导致的。先把所有性能问题分析一遍,找出最重要的、能最大提升性能的问题,从它开始,这样做的好处是,除了能最大提升性能,可能其他问题都不需要优化就能满足需求。就这样按照因果关系,排除掉有因果关系的性能问题后,再对剩下的问题优化。

通常剩下的问题很有可能不止一个,那么就要分别做性能测试,比较不同的优化效果后,选择最能提升性能的那个问题修复。这里推荐两个可以简化这个过程的方法:

第一、如果是系统资源达到了瓶颈,比如CPU使用率达到100%,那么首先优化的,一定是系统资源问题。

第二、针对不同类型的指标,首先优化由瓶颈导致的,性能指标变化幅度最大的问题。比如瓶颈产生后,用户CPU使用率提升10%,系统CPU使用率提升50%,这个时候应该首先优化系统CPU的使用。

第三个问题,一般选择能最大提升性能的方法,但是性能优化不是没有成本。性能优化通常会带来复杂度的提升,降低程序的可维护性,甚至会引发其他性能指标的异常。

清楚了以上三个问题后,接下来从应用程序和系统角度,来谈谈如何降低CPU使用率,提高CPU并行处理能力。

应用程序优化

编译器优化:比如gcc编译器,提供了优化选项-O2,开启后会自动对应用程序代码进行优化。

算法优化:使用复杂度低的算法,可以明显加快处理速度。

异步处理:可以避免程序因等待某个资源而一直阻塞,从而提升程序并发处理能力。比如,事件通知替换掉轮询,可以避免轮询耗费的CPU问题。

多线程代替多进程:可以降低上下文切换成本。

善用缓存:经常访问的数据或者计算过程中的步骤,放到内存中,下次用时直接取,加快处理速度。

系统优化

从系统的角度来说,优化CPU的运行,一方面充分利用CPU缓存的本地性,减速缓存访问;另一方面,控制进程的CPU使用情况,减少进程间的相互影响。

CPU绑定:把进程绑定到一个或多个CPU上,可以提高CPU缓存的命中率,减少跨CPU调度带来的上下文切换问题。

CPU独占:跟绑定类似,进一步将CPU分组,根据CPU亲和性机制为其分配进程,这些CPU由指定进程独占,其他进程不能去使用它。

优先级调整:使用nice调整进程的优先级,适当的调低非核心应用的优先级,增高核心应用的优先级,可以确保核心应用得到优先处理。

为进程设置资源限制:使用Linux cgroups 来设置CPU使用上限,可以防止因某个应用自身的问题,耗尽系统资源。

NUMA(Non-Uniform Memory Access)优化:支持 NUMA 的处理器会被划分为多个node,每个node都有自己的本地内存空间,就是让CPU尽可能只访问本地内存。

中断负载均衡:开启 irqbalance 服务或者配置 smp_affinity,可以把中断处理过程负载均衡到多个CPU。

最后,切忌过早优化。性能优化最好是逐步完善,动态进行,不追求一步到位,而要首先保证能满足当前的性能需求。出现性能问题,先找出最重要的,可以获得最大性能提升的问题,然后再从应用程序和系统两方面入手优化。


天天
3楼 · 2020-09-10 09:32

1、CPU 使用率,这也是实际环境中最常见的一个性能指标

cpu使用率描述了非空闲时间占总cpu时间的百分比,根据cpu上运行任务的不同,又被分为以下几种:

• 用户CPU使用率 - 包括用户态(user)CPU使用率及低优先级用户态(nice)CPU使用率. 此项较高, 通常是有应用程序比较繁忙.

• 系统CPU使用率 - 表示CPU在内核态运行时间的百分比(不含中断). 此项较高说明内核比较繁忙.

• 等待I/O的CPU使用率 - 也叫iowait,表示等待I/O的时间百分比. 此项较高,说明系统与硬件设备的I/O交互时间较长

• 中断CPU使用率 - 又分为软中断和硬中断. 中断CPU使用率较高, 说明系统发生了大量中断

2、平均负载

平均负载是指系统的平均活跃进程数, 反应了系统的综合负载情况

理想状态下,平均负载等于逻辑CPU个数, 这表示每个CPU都恰好被充分利用.

3、进程(线程)上下文切换

上下文切换, 本身是保证 Linux 正常运行的一项核心功能

但过多的上下文切换,会将原本运行进程的 CPU 时间,消耗在寄存器,内核栈以及虚拟内存等数据的保存和恢复上,缩短进程真正运行的时间,成为性能瓶颈


相关问题推荐

  • 回答 20
    已采纳

    性能测试是基于功能、接口完整的情况下,对服务端进行压力测试、负载测试、疲劳测试、并发测试,来发现性能瓶颈。一、负载测试。负载测试的目的主要是为了测试软件系统是否达到需求文档设计的目标;例如一款软件在一定时期内,最大支持多少并发用户数,软件请...

  • 什么是基准测试?2020-08-12 15:46
    回答 4

    基准测试基准测试(benchmarking)是一种测量和评估软件性能指标的活动。在某个时候通过基准测试建立一个已知的性能水平(称为基准线),当系统的软硬件环境发生变化之后再进行一次基准测试以确定那些变化对性能的影响,这是基准测试最常见的用途。其他用途包...

  • 回答 5

    一、平均响应时间:在每一个采样时间段,多个并发事务的平均响应时间;二、百分比响应时间:在某次测试中,有百分之y的请求,其响应时间在x秒以内;三、每秒事务数:针对每个选定的事务,在并发场景下,平均每秒服务器能处理完成多少次;四、Throuput:每秒从...

  • 回答 17
    已采纳

    响应时间、并发用户数、TPS、吞吐量、CPU利用率、内存使用率、在线并发用户数等

  • 回答 6

    计算机的性能测试时我们需要关注的指标有: RT:响应时间 TPS:每秒完成事务数CPU性能指标:利用率、负载 Mem:内存性能指标,可用物理内存、虚拟内存使用率 Disk:磁盘性能指标,Disk Time、IO等待 NetWork:网络指标,带宽使用率、任务队列长度TCP连接数,...

  • 回答 13
    已采纳

    性能测试主要包括以上几个方面

  • 回答 9

    在测试前,应该对测试结果有一个初步的估计。比如,性能(IO/CPU)应该是提升,还是降低,大概幅度会有多少。这样当测试结果与预估偏差极远时,很可能测试的过程或者方法是有问题的。1) 如果是已有模块,可以参考改模块历史的测试数据。看变化是否合理。2)...

  • 回答 9

    UI主要是软件的使用和操作,软件测试需要验证程序中的问题,好学不好学还是要看你是不是擅长程序,如果擅长那就好学,如果不擅长那就是UI好学

  • 回答 16

    一般在系统功能稳定没有大的缺陷之后开始执行。但前期准备工作可以从系统需求分析时就开始:性能目标制定、场景获取、环境申请等。

  • 回答 4

    性能测试的目的: 评估系统的能力----测试中得到的负荷和响应时间数据可被用于验证所计划的模型的能力,并帮助作出决策。识别体系中的弱点----受控的负荷被增加到一个极端水平,并突破它,从而修复体系的瓶颈或薄弱的地方。系统调优---重复运行测试,验证调...

  • 回答 4
    已采纳

    LoadRunner 是一种预测系统行为和性能的工业标准级负载测试工具。通过以模拟上千万用户实施并发负载及实时性能监测的方式来确认和查找问题,LoadRunner 能够对整个企业架构进行测试。通过使用LoadRunner , 企业能最大限度地缩短测试时间, 优化性能和加速应...

  • 回答 3

    手工测试者最适合成为领域专家,他们可以把相当复杂的业务逻辑存在最强力的测试工具——大脑里。而且手工测试速度比较慢,测试者就有时间可以观察分析细微的逻辑问题。速度虽然慢些,但是比较容易。...

  • 回答 8

    前言1.需要写明本文当编写的目的,是给那些人看的,能起到怎样的作用。2.本文档中出现的专业术语需要有个解释,非软件测试的人员能看懂。3.参考资料,也是我们编写测试计划的依据,说明你这个测试计划不是凭空而来。4.测试模块的优先级别,可以从这里看出系统...

没有解决我的问题,去提问