CPU使用率过高怎么办

  实际上前文中关于CPU使用率过高如何通过各种工具获得相关的热点进程。那么进程有了,那得疑惑到底哪个哪段代码导致了这个进程成为热点呢?如果在调试阶段,可以使用gdb中断运行,但是在生产环境肯定不行。Linux提供了一个工具perf

    

   安装它即可,然后man perf查看其使用说明。

    

   常用的一种,统计分析结果输出到屏幕:perf top

    

     symbol列下即为待选的热点函数。

  第二种常见用法,也就是 perf record perf reportperf top 虽然实时展示了系统的性能信息,但它的缺点是并不保存数据,也就无法用于离线或者后续的分析。而 perf record 则提供了保存数据的功能,保存后的数据,需要perf report 解析展示。有兴趣可以自行实践,此处不再演示。

  找到热点函数了,那就得进行CPU优化了。

  CPU 优化 我们接下来从应用程序和系统的角度,分别来看看 如何才能降低 CPU 使用率,提高 CPU 的并行处理能力。  

  一、应用程序优化

    首先,从应用程序的角度来说,降低 CPU 使用率的最好方法当然是,排除所有不必要的工作,只保留最核心的逻辑。比如减少循环的层次、减少递归、减少动态内存分配等等。

      1、编译器优化:很多编译器都会提供优化选项,适当开启它们,在编译阶段你就可以获得 编译器的帮助,来提升性能。

      2、算法优化:使用复杂度更低的算法,可以显著加快处理速度。

      3、异步处理:使用异步处理,可以避免程序因为等待某个资源而一直阻塞,从而提升程序 的并发处理能力。比如,把轮询替换为事件通知,就可以避免轮询耗费 CPU 的问题。

      4、多线程代替多进程:相对于进程的上下文切换,线程的上下文切换并不切换进程地址空间,因此可以降低上下文切换的成本。

      5、善用缓存:经常访问的数据或者计算过程中的步骤,可以放到内存中缓存起来,这样在 下次用时就能直接从内存中获取,加快程序的处理速度。

  二、系统优化
    从系统的角度来说,优化 CPU 的运行,一方面要充分利用 CPU 缓存的本地性,加速缓存访问;另一方面,就是要控制进程的 CPU 使用情况,减少进程间的相互影响。 具体来说,系统层面的 CPU 优化方法也有不少。
      1、CPU 绑定:把进程绑定到一个或者多个 CPU 上,可以提高 CPU 缓存的命中率,减少跨 CPU 调度带来的上下文切换问题
      2、CPU 独占:跟 CPU 绑定类似,进一步将 CPU 分组,并通过 CPU 亲和性机制为其分配进程。这样,这些 CPU 就由指定的进程独占,换句话说,不允许其他进程再来使用这些 CPU
      3、优先级调整:使用 nice 调整进程的优先级,正值调低优先级,负值调高优先级。
      4、为进程设置资源限制:使用 Linux cgroups 来设置进程的 CPU 使用上限,可以防止由 于某个应用自身的问题,而耗尽系统资源。
      5、中断负载均衡:无论是软中断还是硬中断,它们的中断处理程序都可能会耗费大量的 CPU。开启 irqbalance 服务或者配置 smp_awinity,就可以把中断处理过程自动负载均衡到多个 CPU 上。

  以上关于如何进行CPU性能调优都是方法论,没有具体的案例。以MySQL为例,如果MySQL数据库的服务器CPU非常高如何处理进行实践演示,如下:

    1、判断是否mysqld占用导致服务器CPU很高。可以想通过操作系统命令top观察是不是mysqld,如果不是利用之前介绍过的方法找到热点进程,并进行后续处理。

    2、确定是mysqld造成的,那么继续使用show processlist命令查看里面数据库的会话情况,是不是有非常好资源的SQL在运行。

    3、找到消耗高的SQL,看看这些计划是否准确。使用MySQL提供的explain命令查看Index是否缺失,或者实在是数据量太大造成的。

    一般来说,肯定要kill掉这些线程(同时观察CPU使用率是否下降)等进行相应的调整(如加索引、改写SQL、改内存参数)之后,再重新运行这些SQL。也可能是每个SQL的消耗资源并不多,但是突然之间有大量的会话连接数据库导致CPU飚升,这种情况就需要跟应用一起分析为何连接数据会激增再做出相应的调整——如限制连接数等。

  

posted on 2021-10-06 19:07  池塘里洗澡的鸭子  阅读(1245)  评论(0编辑  收藏  举报