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操作通通干掉)

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

相关推荐
hummhumm28 分钟前
第 22 章 - Go语言 测试与基准测试
java·大数据·开发语言·前端·python·golang·log4j
hummhumm1 小时前
第 28 章 - Go语言 Web 开发入门
java·开发语言·前端·python·sql·golang·前端框架
代码吐槽菌1 小时前
基于SSM的毕业论文管理系统【附源码】
java·开发语言·数据库·后端·ssm
豌豆花下猫2 小时前
Python 潮流周刊#78:async/await 是糟糕的设计(摘要)
后端·python·ai
YMWM_2 小时前
第一章 Go语言简介
开发语言·后端·golang
码蜂窝编程官方2 小时前
【含开题报告+文档+PPT+源码】基于SpringBoot+Vue的虎鲸旅游攻略网的设计与实现
java·vue.js·spring boot·后端·spring·旅游
hummhumm2 小时前
第 25 章 - Golang 项目结构
java·开发语言·前端·后端·python·elasticsearch·golang
J老熊2 小时前
JavaFX:简介、使用场景、常见问题及对比其他框架分析
java·开发语言·后端·面试·系统架构·软件工程
AuroraI'ncoding3 小时前
时间请求参数、响应
java·后端·spring
好奇的菜鸟3 小时前
Go语言中的引用类型:指针与传递机制
开发语言·后端·golang