我们回顾了一下常见的CPU性能指标,梳理了核心CPU性能观测工具,总结了CPU性能问题的思路,后来发现CPU的指标往往具有一定的关联性

那么掌握这些常用的瓶颈分析套路就好了

对于性能优化的问题,我们需要看几个问题

既然要做性能优化,那么要怎么判断优化是否有效?

性能问题通常不是独立的,如果有多个性能问题同时发生,优化哪一个呢?

性能的提升手段不是唯一的,有多种方法可选的时候,选用哪一个呢?是不是选择最大程度提升的那个?

如果按照之前的一个案例,将进程的直接IO变为缓存IO,直接提升了iowait的效率,这种案例来校验上述的三个问题

对于这个案例,性能提升很明显,所以第一个问题满足了

然后是没有发现其他的性能问题,直接IO是唯一的性能瓶颈,所以不需要挑选优化对象

改为缓存IO是目前最简单的优化方法,这种优化不会影响到应用的功能

但是实际情况上,性能的评估往往有多重指标,性能问题会有多个同时发生,优化一个指标的性能,会导致其他性能指标的下降

对于性能优化的效果评估,我们需要对系统的性能指标进行量化,而且区分出优化前后的指标,来进行对比呈现

对于这个步骤,称为三步走

1.确定性能的量化指标

2.测试优化前的性能指标

3.测试优化后的性能指标

对于第一步,我们可以量化的指标有很多,比如CPU使用率,应用程序的吞吐量,客户端请求的延迟,都可以评估性能

那么我们要综合多种维度去进行对比,比如应用程序的维度,可以选用吞吐量和请求延迟进行评估应用程序的性能

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

这两个维度选择指标,来确认应用程序和系统资源这两者的关系

比如一个Web应用,我们选择使用ab工具,测试Web应用的并发请求树和响应延迟,然后再利用vmstat pidstat来观察系统和进程的CPU使用率,这样就获得了应用程序和系统资源两个维度的指标数值

然后是多个性能问题同时存在,如何办呢?

性能测试的领域,流传很广的说法是二八原则, 80%的问题由20%的代码导致的,这就需要先找出20%的位置,然后优化那80%的性能,故不是所有的性能问题都值得去优化

所以,如何判断哪个性能问题重要且值得优化,就是我们的核心问题,我们可以先将所有的性能问题列出来,排除掉有因果关联的性能问题,再对之后的性能问题进行优化

通常还需要选择最有必要优化的问题去解决,当然会花费较多的时间

比如系统资源达到了瓶颈,比如CPU使用率达到了100%,那么就有优化系统资源瓶颈的需求

如果产生瓶颈后,用户CPU的使用率升高了10%,系统CPU使用率升高了50%,那么就优化系统CPU的使用

然后是多种优化的方式,如何选择的问题

可能最大提升性能的方式不一定是最好的,可能优化会带来复杂度的提升,降低程序的可维护性,优化一个指标的同事,引发其他指标的一场,典型例子就是网络部分讲到的DPDK Data Plane Development Kit 可以绕开内核网络协议栈,提升网络处理能力

不过需要独占一个CPU去运行,所以CPU核数较少,就不太合适了

然后是CPU优化,我们从应用程序和系统和角度,分别看如何降低CPU使用率,提高CPU的并行处理能力

对于应用程序,我们可以排除所有不必要的工作,只保留最核心的逻辑,减少循环的层次,减少递归,减少动态内存分配等

除此外,应用程序的性能优化包括了很多方法,常见的几种如下

编译器的优化,很多编译器都提供了优化选项,开启其即可得到编码器的优化帮助,提升性能,比如gcc提供了优化选项 -O2,开启后对应用程序的代码进行优化

算法优化,采用更为合适的算法

异步优化,将轮询改为事件通知,避免轮询消耗CPU问题

多线程代替多进程,多线程的上下文切换可以避免切换进程空间

善用缓存,将经常访问的数据或者计算过程中的步骤,放到内存中缓存起来,下次使用直接从内存中读取

对于系统的优化,我们利用CPU缓存的本地性,加快缓存访问,然后是控制进程CPU的使用情况,减少进程上下文切换

CPU的优化有不少,常见的有

CPU绑定,将进程绑定在一个或者多个CPU上,提高CPU的缓存命中率,减少跨CPU调度带来的上下文切换问题

CPU独占,跟CPU绑定类似,将CPU分组,利用亲和机制来分配进程,CPU由指定的进程独占

优先级调整,使用nice调整进程的优先级,从 -20 到 +19,负值越大优先级越高

使用cgroups来为进程设置CPU使用上限,避免某个应用自身的问题,导致耗尽系统资源

NUMA优化,将cpu划分为多个node,每个node都有自己的本地内存空间,让CPU尽可能的访问本地内存

中断负载均衡,开启irqbalance或者配置smp_affinity,将中断处理过程自动负载均衡到多个CPU上

最后千万不要过早的尝试优化, 过早优化是万恶之源,过早的优化会带来复杂性的提升,降低可维护性,一般只有性能不满足或者性能瓶颈出现的时候,再进行性能问题的优化

我们梳理了常见的CPU性能优化思路和优化方法,对于性能问题,不要急于动手,而是先找到重要的问题,然后从应用层面和系统层面进行入手优化

这样就获得最大的性能提升,且不需要优化其他的问题,满足了性能要求

发表评论

邮箱地址不会被公开。 必填项已用*标注