CPU超过100%问题排查

本文分享了一台服务器接口访问卡顿甚至不通问题的排查过程。通过jps、top等命令定位到CPU消耗大的线程,发现JVM垃圾清理线程耗资源,Full gc次数多且耗时久。怀疑内存泄漏,dump内存分析后,发现内存设置过小,放大内存设置后问题解决。

出现了一台服务器接口访问太卡,甚至访问不通的问题。

排查了半天终于找出原因,现将过程分享如下:

1、Jps 查询java进程号,Bootstrap为tomcat线程

jps

2、top  查询各个进程cpu使用情况

top

3、top –p 46 查询46号进程单独的cpu使用情况

Shift + H 切换到该进程号内部各个线程的cpu使用情况,且按照CPU使用率逆序排列

4、pid 140 cup消耗大 查看该线程干什么

Printf %x 140   结果是:8c,  加上16进制标记0x,所以结果是:0x8c

使用jstack命令打印线程堆栈信息,找到其中nid=0x8c的线程堆栈。

jstack 46 |grep 0x8c –C30

Jvm的垃圾清理线程,非常耗资源。

查看垃圾清理情况:

jstat -gcutil 46

Full gc次数太多,耗时太长。

首先想到内存泄漏,所以要dump内存。

jmap -histo:live 46 | more

找到一个Entity对象,仔细分析该对象,不过是一个框架对象,会消耗内存,但是不会有内存泄漏这么严重的问题。

再仔细计算一下所占内存大小。

448750816 427M

156797632 149M

91792872  87M

MockEntity所占内存大小,13580840仔细计算 12.95M

排在前面的几个内存加在一起也才1G左右,一个8G内存的dock怎么会被1G内存撑到内存溢出了,首先怀疑的是内存设置过小,

此时通过jinfo pid 查询当前jvm内存设置,

命令为:jinfo 46

总大小设置为:

-Xmx1024M -Xms1024M -Xss512K

将其放大,问题解决。

<think> 我们正在讨论PX30 CPU使用率超过100%的原因和解决方法。根据之前的对话,用户提到了PX30的CPU idle时间,现在转向了使用率超过100%问题。结合提供的引用内容,尤其是引用[4]中关于容器CPU使用率的计算,我们可以推断用户可能是在容器化环境中遇到了PX30 CPU使用率异常高的问题。 引用[1]提到一个Go服务在容器内CPU使用率异常,达到了70%而非预估的20%,这与用户的问题类似。引用[4]详细解释了容器CPU使用率的计算方式,特别指出容器使用率可能超过100%的原因:计算的是所有核心的使用率。引用[5]则提到了服务器负载高、CPU使用率100%的解决办法,包括调优配置参数、索引和SQL等。 因此,我们可以这样分析: 1. 原因:在容器环境中,CPU使用率是按所有核心的使用率计算的,所以可以超过100%(例如,一个4核CPU的使用率达到400%才算是完全利用)。 2. 可能的原因包括:应用程序负载突然增加、资源限制配置不当、程序bug(如死循环)、系统配置问题等。 具体到PX30,这是一款四核ARM Cortex-A35处理器,所以最大使用率可以达到400%。如果看到超过100%的使用率,这其实是正常的,表示使用了超过一个核心。但如果使用率持续异常高(比如接近400%),则说明所有核心都在高负载运行,需要排查。 解决方法: 根据引用[1]和[5],我们可以从应用程序优化、系统调优等方面入手。 下面我们组织回答: </think> ### PX30 CPU使用率超过100%的原因及解决方案 #### 一、根本原因分析 PX30作为四核ARM Cortex-A35处理器,其CPU使用率统计逻辑如下: $$ \text{总使用率} = \sum_{i=0}^{3} \frac{\text{核心}_i\text{工作时间}}{\text{监控周期}} \times 100\% $$ 当四个核心同时满载时,最大使用率可达**400%**。出现显示>100%情况主要有以下原因: 1. **容器化环境统计误差** - 在Kubernetes容器中,`container_cpu_usage_seconds_total`指标统计**所有核心的总使用时间**[^4] - 计算公式: $$ \text{显示使用率} = \frac{\text{container\_cpu\_usage\_seconds\_total}}{\text{container\_spec\_cpu\_period}} \times \text{核心数} \times 100\% $$ 其中`container_spec_cpu_period`默认为100,000µs 2. **瞬时负载冲击** 如引用[1]描述的Go推送服务,消息洪峰期间所有核心被同时唤醒,导致: - 线程切换频率剧增(`pidstat -w`显示>1000次/秒) - 调度延迟造成虚假CPU占用[^1] 3. **资源限制配置不当** ```yaml # Kubernetes错误配置示例 resources: limits: cpu: "0.5" # 仅限制0.5核,但实际负载需要更多核心 ``` 当实际负载超过申请配额时,内核会频繁切换核心执行任务 4. **监控工具误读** 如`top`命令的`%CPU`列显示的是**单核等效值**,200%表示两个核心满载 #### 二、解决方案 1. **精确容器CPU计量** ```promql # 正确计算单容器使用率 sum(rate(container_cpu_usage_seconds_total{container="your-app"}[5m])) / container_spec_cpu_quota{container="your-app"} * 100 ``` *注:避免直接使用`container_spec_cpu_period`[^4]* 2. **负载优化策略** | 优化方向 | 具体措施 | |-------------------|--------------------------------------------------------------------------| | **Go运行时调优** | 设置`GOMAXPROCS=4`匹配核心数,减少协程切换开销[^1] | | **消息队列缓冲** | 引入Redis/Kafka缓冲推送请求,削峰填谷 | | **MySQL优化** | 调整`innodb_thread_concurrency`与核心数匹配,避免锁竞争[^5] | 3. **资源限制调整** ```yaml resources: requests: # 保证最低资源 cpu: "1.5" limits: # 允许突发使用多核 cpu: "3.0" ``` *建议:limits值设为物理核心数的75%(PX30建议3核)* 4. **内核参数调优** ```bash # 降低上下文切换开销 sysctl -w kernel.sched_migration_cost_ns=5000000 sysctl -w kernel.sched_autogroup_enabled=0 ``` #### 三、诊断工具链 ```mermaid graph TD A[发现CPU>100%] --> B{环境类型} B -->|物理机| C[使用pidstat -u 1] B -->|容器| D[检查cgroup stats] C --> E[分析高CPU线程] D --> F[核查docker stats] E --> G[perf record -g] F --> H[检查CPU配额] G --> I[定位热点函数] H --> J[调整cpu.shares] ``` > **关键警示**:当使用率持续>300%时,需检查是否存在**死循环**或**资源泄漏**,可使用`strace -c -p <PID>`跟踪系统调用。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值