我们回顾了一下常见的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性能优化思路和优化方法,对于性能问题,不要急于动手,而是先找到重要的问题,然后从应用层面和系统层面进行入手优化
这样就获得最大的性能提升,且不需要优化其他的问题,满足了性能要求