一、性能优化方法论
优化前,先思考以下三个问题?
1、既然要做性能优化,那要怎么判断它是不是有效呢?特别是优化后,到底能提升多少性能呢?---即评估性能优化的效果
2、性能问题通常不是独立的,如果有多个性能问题同时发生,你应该先优化哪一个呢?---确定主要的
3、提升性能的方法并不是唯一的,当有多种方法可以选择时,你会选用哪一种呢?是不是总选那个最大程度提升性能的方法就行了呢?
1、怎么评估性能优化的效果?
三步走理论:先确定量化指标,然后对比优化前后的效果
a、确定性能的量化指标,不要局限在单一维度的指标上,至少从应用程序维度和系统资源维度分析
b、测试优化前的性能指标
c、测试性能优化后的性能指标
2、多个性能问题同时存在,要怎么选择优先级?
“二八原则”:即 80% 的问题都是由 20% 的代码导致的。并不是所有的性能问题都值得优化
核心问题:找出最重要,可以最大程度提升性能的问题开始优化
3、有多种优化方法时,要如何选择?
综合多方面因素
二、CPU优化
1、应用程序优化
思路:排除不必要工作,只留核心逻辑
最常见的引用程序CPU优化方法:
a、排除不必要工作,只留核心逻辑。eg:减少循环次数,减少递归,减少动态内存分配
b、编译器优化,eg:gcc -O2
c、算法优化,使用复杂度更低的算法
d、异步处理,避免程序因为等待某个资源而一直阻塞,从而提升程序的并发处理能力
e、多线程代替多进程,降低上下文切换的成本
f、善用缓存:加快程序的处理速度
2、系统优化
思路:利用CPU缓存本地性,加速缓存访问;控制进程的cpu使用情况,减少进程间的相互影响
最常见的系统CPU优化方法:
a、CPU绑定,把进程绑定到一个或者多个 CPU 上,可以提高 CPU 缓存的命中率,减少跨 CPU 调度带来的上下文切换问题。
b、CPU独占,跟 CPU 绑定类似,进一步将 CPU 分组,并通过 CPU 亲和性机制为其分配进程。这样这些 CPU 就由指定的进程独占,换句话说,不允许其他进程再来使用这些CPU
c、优先级调整,使用 nice 调整进程的优先级,适当降低非核心应用的优先级,增高核心应用的优先级,可以确保核心应用得到优先处理。
d、为进程设置资源限制,使用 Linux cgroups 来设置进程的 CPU 使用上限,可以防止由于某个应用自身的问题,而耗尽系统资源。
e、非统一内存访问(NUMA)优化,NUMA 优化,其实就是让 CPU 尽可能只访问本地内存。在NUMA下,处理器访问它自己的本地存储器的速度比非本地存储器快
f、中断负载均衡,无论是软中断还是硬中断,它们的中断处理程序都可能会耗费大量的CPU。开启 irq balance 服务或者配置 smp_affinity,就可以把中断处理过程自动负载均衡到多个 CPU 上
三、切记过早优化
过早优化是万恶之源
文章出处来源:极客时间《Linux性能优化》
网友评论