操作系统优化篇--CPU优化
一、CPU性能相关的重要指标
在CPU性能优化前,需要知道具体优化他的哪些指标,就好比,我们人在做体检时,也是针对某些关键指标进行检测。只有和正常值进行对比之后才知道问题在哪里,然后进行对症下药。同样,只有对比CPU指标之后,才知道他的性能瓶颈在哪。
CPU重要的指标主要有三个:平均负载、使用率、上下文切换。
- 平均负载
 
平均负载是指:单位时间内,CPU上的活跃进程数。而活跃进程数呢,具体是指处于Running和不可中断状态的进程。
平均负载和CPU核数有一定关系。比如,一个8核心的操作系统,当前负载为6,那么只能说明此时CPU的负载为6/8,也就是75%。只有当平均负载到8时,CPU的繁忙程度接近饱和了,也就是100%,当然此时还不能算是繁忙,只能说CPU100%的时间在工作,没有空闲。
- 使用率
 
CPU的使用率,是指单位时间内,CPU花费的处理时间占比。主要有以下几种主要类型:
1、usr,cpu处理用户态的进程所占用时间的百分比,用户态的进程一般是指用户的应用程序;
2、sys,cpu处理内核态的进程所占用时间的百分比,内核态的进程一般是指系统调用(system call)
3、steal、guest。steal是指作为宿主机时,上面运行的virtual machine所占用cpu的时间百分比;guest是指作为宿主机时,所占用cpu的时间百分比。
4、iowait,cpu处理IO操作所占用时间的百分比
5、interrupt 、soft interrupt 。cpu处理硬中断和软中断所占用时间的百分比
上下文切换
第三个重要指标是上下文切换。
什么是上下文切换?我们知道,程序在CPU上运行,是以时间片为单位进行调度,当某个进程的时间片到了,就必须将当前进程挂起,然后加载新的进程到CPU上运行。一个挂起,一个加载的过程,就是一次CPU上下文切换。
这个过程看似简单,其实内部是一个比较复杂的过程。包括:将当前进行的堆栈信息、虚拟内存以及指令寄存器、程序计数器等信息进行缓存到CPU的缓存中,同时加载新的进程的同样信息到CPU中,整个过程需要消耗一定CPU开销,如果上下文切换频繁的话,势必会引起CPU性能问题。
二、CPU故障排查思路
CPU性能定位大概思路:
1、通过top命令查看当前系统整体的CPU使用率和负载情况。同时可以按 “1”查看每个核的CPU使用率情况。负载包括:最近1分钟、最近5分钟、最近15分钟的平均负载情况。
其中,比较关注或者常见的CPU使用率高的指标为:1、usr,也就是用户的应用程序占用cpu多;2、iowait,cpu处理io操作占用的时间比较多
2、知道了操作系统整体情况后,我们肯定希望知道是具体哪个应用程序导致。此时可以通过pidstat -u 3 查看当前系统上进程的CPU使用情况,基本上可以定位到具体哪个程序CPU使用率比较高。
三、CPU性能优化建议
CPU性能优化,主要从两方面着手:
- 应用程序角度
 - 系统资源角度
 
应用程序优化:
- 编译阶段进行优化:比如C++程序在通过gcc进行编译的时候,提供优化选项-O2,针对应用程序自动进行内存和cpu性能优化
 - 算法优化:快排、归并代替冒泡、插入
 - 异步处理:比如golang里面的goroutine
 - 多线程代替多进程
 - 善用缓存:将耗时长的操作通过缓存进行,比如通过redis进行耗时长的io操作
 
系统资源优化:
- CPU绑定:进程和CPU绑定,提高缓存命中,减少上下文切换
 - CPU独占
 - 优先级调整
 - 给应用程序设置资源限制:通过cgroups来设置cpu使用上限
 - NUMA:让cpu尽量使用本地缓存
 - 开启中断负载均衡:irqbalance,把中断处理自动负载均衡到多个CPU上
 
总则:避免过早优化,性能随着业务时刻在变化,在不断调整中优化适当指标,才是最优状态!

                
            
        
浙公网安备 33010602011771号