GO—CPU占用高问题归类

一、可能原因

硬件问题
  1. 过热:如果服务器散热不佳,导致CPU温度过高,CPU可能会自动降频或过载保护,导致性能降低或利用率上升。

  2. 硬件故障:CPU或其他硬件组件(如内存条)出现故障也可能导致CPU利用率异常。

软件问题

1 大量循环嵌套

可能造成条件不满足死循环;资源占用不释放等。

2 频繁的内存分配和回收

变量或者数据结构使用不当,引起频繁 GC。

3 代码逻辑实现欠优

程序实现存在性能问题,导致瓶颈点很低,如没有合理实现算法和语言特性等。例如逻辑不满足导致死循环,实现效率低下的逻辑等。

4 上下文切换频繁

此类问题除了CPU 过高问题,还会骤降。

5 定时任务

程序或进程的活动水平不稳定。在特定时间段内涉及大量RSA操作、正则过滤、IO操作来执行任务,因此导致CPU使用率升高。当任务完成或者需要更少的CPU资源时,CPU使用率就会下降。

6 CPU 负载不平衡

多核不同核心上的负载可能不均衡。

7 后台进程

后台运行的进程或服务可能占用大量CPU资源。

8 病毒或恶意软件

病毒、木马或其他恶意软件的感染可能会导致CPU利用率急剧上升。

系统配置问题:

  1. 不当的配置:例如,错误的服务器设置或不当的负载均衡可能导致单个CPU负载过高。

  2. 资源竞争:如果服务器上的多个应用程序或服务争抢资源,可能导致CPU利用率上升。

网络问题:

  1. DDoS攻击:分布式拒绝服务攻击可能导致服务器CPU利用率飙升,因为它需要处理大量恶意流量。

  2. Web爬虫:大量的Web爬虫访问也可能导致服务器CPU负载增加。

二、解决办法

1 考虑并发机制

利用协程和通道实现并行计算或者异步处理。

2 避免频繁内存分配

使用sync.Pool或手动维护的内存池等机制来提高程序的性能和稳定性。

3 避免阻塞操作

应尽可能避免使用阻塞操作,例如网络I/O和文件I/O操作等。

4 合理使用调试工具

需要有问题现场。使用pprof和trace等工具可以分析程序的CPU占用情况和对象分配情况等,帮助精确定位性能问题的原因。

5 编程过程中打印必要日志

这种是铁打的静态定位工具,很多线上问题没有现场,靠有效日志能够溯源问题根因。

三 CPU 毛刺

1 耗时毛刺

耗时毛刺会直接影响到我们的服务可用性,分析解决问题通常也是从平响毛刺下手再到代码再到CPU、内存、带宽等最后重回代码来操作的。对于耗时,出现毛刺通常是因为在某一时间间隔内请求处理受到阻塞(包括连接处理的阻塞、连接内处理逻辑的阻塞),其中的主要的原因大概率是上面提到的cpu毛刺。

2 连接处理的阻塞

连接处理的阻塞往往意味着服务处理的极限,因为连接内部整体cpu消耗相对平均,由于cpu资源受限很多连接虽然建立了,但是部分请求迟迟得不到处理致使请求处理存在问题(不响应:502发生)或者处理时间十分长(毛刺产生)。 如果应用如果已经优化到极致了,可以理解为这种情况就是服务器的处理极限了,这时候解决方式只有扩容。如果代码还没有优化,那就先针对各种性能分析的profile优化代码吧,比如减少单个请求中要消耗的CPU、请求处理过程的耗时,针对IO处理的(尽可能不做、合并IO、同步改异步、使用更加高效的API),针对CPU大量消耗的(只能尽可能的不做或者替换代价小的操作方式,何种序列化操作、RSA操作通通干掉)

相关关联:性能分析 -- 各种毛刺

相关推荐
毕设源码-邱学长10 分钟前
【开题答辩全过程】以 基于SpringBoot的专业分流系统为例,包含答辩的问题和答案
java·spring boot·后端
小信啊啊13 分钟前
Go语言映射(Map)
golang·go
小镇学者15 分钟前
【golang】goland使用多版本go sdk的方法
开发语言·后端·golang
JavaEdge在掘金16 分钟前
MyBatis 动态 SQL 为什么这么灵活?背后靠的是 OGNL
后端
Thanwinde21 分钟前
RBAC介绍以及如何设计一个简易且高可用的RBAC1的鉴权系统
后端·架构
麦麦大数据22 分钟前
F060 基于BERTvue+flask电影评论情感分析系统
后端·python·flask·bert·推荐算法·情感分析·电影评论
05大叔27 分钟前
Spring Day03
java·后端·spring
golang学习记1 小时前
[特殊字符] Go Gin 不停机重启指南:让服务在“洗澡搓背”中无缝升级
开发语言·golang·gin
程序员码歌1 小时前
短思考第266天,玩IP路上的几点感悟,这几点很重要!
前端·后端·创业
码农BookSea1 小时前
响应式编程不只有概念!万字长文 + 代码示例,手把手带你玩转 RxJava
后端