一、应用程序优化

(1)编译器优化。适当开启编译器优化选项,在编译阶段提升性能。gcc提供优化选项-On会自动对应用程序的代码进行优化。
(2)算法优化。使用复杂度更低的算法,可以显著加快处理速度。在数据比较大的情况下,可以用O(nlogn)的排序算法(如快排、归并排序等),代替O(n^2)的排序算法(如冒泡、插入排序等)。
(3)异步处理。使用异步处理,可以避免程序因为等待某个资源而一直阻塞,从而提升程序的并发处理能力。把轮询替换为事件通知,就可以避免轮询耗费CPU的问题。
(4)多线程代替多进程。相对于进程的上下文切换,线程的上下文切换并不切换进程地址空间,因此可以降低上下文切换的成本。
(5)善用缓存。经常访问的数据或者计算过程中的步骤,可以放到内存中缓存起来,在下次用时就能直接从内存中获取,加快程序的处理速度。

二、系统优化

1、CPU绑定

(1)CPU绑定:把进程绑定到一个或者多个CPU上,可以提高CPU缓存的命中率,减少跨CPU调度带来的上下文切换问题。
(2)CPU孤立:将CPU分组,并通过CPU Affinity机制为其分配进程。指定CPU由特定进程独占,不允许其它进程再使用。

2、进程CPU资源限制

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

3、进程优先级调整

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

4、中断负载均衡

无论软中断还是硬中断,中断处理程序都可能会耗费大量CPU资源。开启irqbalance服务或者配置smp_affinity可以把中断处理过程自动负载均衡到多个CPU上。

5、NUMA优化

NUMA架构处理器会被划分为多个node,每个node都有自己的本地内存空间。NUMA优化可以让CPU尽可能只访问本地内存。