操作系统优化篇--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性能优化,主要从两方面着手:

  • 应用程序角度
  • 系统资源角度

应用程序优化:

  1. 编译阶段进行优化:比如C++程序在通过gcc进行编译的时候,提供优化选项-O2,针对应用程序自动进行内存和cpu性能优化
  2. 算法优化:快排、归并代替冒泡、插入
  3. 异步处理:比如golang里面的goroutine
  4. 多线程代替多进程
  5. 善用缓存:将耗时长的操作通过缓存进行,比如通过redis进行耗时长的io操作

系统资源优化:

  1. CPU绑定:进程和CPU绑定,提高缓存命中,减少上下文切换
  2. CPU独占
  3. 优先级调整
  4. 给应用程序设置资源限制:通过cgroups来设置cpu使用上限
  5. NUMA:让cpu尽量使用本地缓存
  6. 开启中断负载均衡:irqbalance,把中断处理自动负载均衡到多个CPU上

 

总则:避免过早优化,性能随着业务时刻在变化,在不断调整中优化适当指标,才是最优状态!

 

posted @ 2021-07-27 07:50  skyflask  阅读(0)  评论(0)    收藏  举报