排查linux服务器cpu过高满载问题(原创)

项目发布到linux服务器, 线上监控cpu出现了占用过高满载情况, 排查流程如下:

1 top命令查看, 是否有java进程占用CPU过高
如图所示 , 进程是3769的java进程cpu飘升到99.7%

在这里插入图片描述
2 通过ps -mp pid -o THREAD,tid,time命令, 查看某个进程下的线程情况, time代表这个线程已运行时间, 如图所示, 线程号3804的线程, cpu占用率很高, 并已经运行了4分56秒
在这里插入图片描述
3 将10进制线程号用计算器, 转16进制 ,3804转化16进制是edc
在这里插入图片描述
4 jstack命令查看进程信息, 找到自己项目中的哪个类, 哪个方法, 哪个行代码出的问题 如下图说示:执行 jstack 3769 , 如下所示
在这里插入图片描述
5 去项目代码中排查有问题的代码, 如下图所示, 问题出在第112行代码, 造成了cpu的满载问题
在这里插入图片描述

<think>好的,我现在需要帮助用户分析服务器CPU使用率过和负载过的原因。根据用户提供的引用内容,他们之前提到了Redis、MySQL的问题,以及可能的死循环导致CPU满载的情况。首先,我得系统地整理可能的原因,并参考之前的案例和解决方案。 首先,用户的问题是关于服务器CPU 100%和负载过的原因分析。我需要从几个主要方面入手,比如进程资源占用、代码逻辑问题、数据库操作、缓存系统问题,以及系统配置等。同时,用户引用的资料里提到了Redis的单核问题、死循环、ES集群写入异常导致的循环,还有MySQL的CPU问题,这些都是需要重点考虑的。 第一步,定位CPU进程。用户提到的引用[3]和[4]中,使用top命令找到占用的进程和线程,然后通过jstack分析线程堆栈。这可能涉及到Java应用的线程问题,比如死循环或者锁竞争。但用户现在的问题可能不仅限于Java,因为PHP和MySQL也是他们关心的点,所以需要扩展考虑不同语言的环境。 第二步,检查代码逻辑。引用[3]中提到ES写入异常后重试导致死循环,这说明代码中的异常处理不当可能导致资源耗尽。类似的情况可能出现在PHP脚本中,比如无限循环、递归调用没有终止条件,或者在错误处理中重复尝试失败的操作。 第三,数据库和缓存的问题。用户之前的讨论涉及MySQL和Redis,特别是Redis单核运行导致另一个CPU空闲,但监控系统显示平均负载正常,这可能让运维人员误以为没问题。需要检查是否有大量的慢查询、未优化的SQL语句,或者缓存系统的频繁访问导致CPU过载。比如,Redis的CPU使用率在单核上达到100%,而另一个核心闲置,这可能被平均负载掩盖,导致问题未被及时发现。 第四,外部服务依赖问题。例如,引用[3]中的ES集群宕机导致应用不断重试,这可能引发应用层的资源耗尽。需要检查是否有外部服务不可用,导致应用进入重试循环,从而占用大量CPU资源。 第五,系统配置和资源限制。比如PHP-FPM的进程数设置过,导致大量进程竞争CPU资源;或者MySQL的配置不合理,如连接数过多,导致上下文切换频繁。此外,系统层面的问题,如僵尸进程、内核bug等也需要考虑。 接下来,我需要结合用户提供的引用内容,特别是引用[1]中提到的Redis单核问题,引用[3]中的死循环案例,引用[5]中的MySQL CPU问题,来构建一个全面的分析框架。同时,用户之前的回答中提到了PHP优化和数据库拆分,可能相关的缓存策略和连接池管理也可能影响CPU使用率。 需要注意的是,用户可能混淆了CPU使用率和负载的概念。CPU使用率指的是CPU时间的占用比例,而负载则反映了系统处理任务的压力,包括运行队列中的进程数和等待I/O的进程数。负载不一定意味着CPU使用率,可能由I/O等待或大量进程排队引起。但用户的情况是两者都,所以需要同时考虑CPU密集型和I/O密集型的问题。 可能的步骤包括: 1. 使用top/htop命令查看整体CPU使用情况和各进程占比。 2. 使用pidstat或perf工具分析具体进程的CPU使用情况。 3. 检查系统日志(如/var/log/messages)和应用程序日志,寻找错误或异常信息。 4. 对数据库进行慢查询分析,优化SQL语句。 5. 检查缓存系统的使用情况,如Redis是否处理大量请求,是否有大键或复杂操作。 6. 分析代码中的潜在问题,如死循环、无限递归、异常处理不当等。 7. 检查系统配置,如PHP-FPM的pm.max_children,MySQL的max_connections等。 在用户提供的引用中,引用[4]提到了将线程号转为16进制并用jstack分析,这可能适用于Java应用,但如果是PHP或MySQL的问题,可能需要不同的工具,比如strace跟踪系统调用,或者gdb调试。不过,PHP作为脚本语言,通常不会导致线程级别的CPU问题,更多是进程级别的。 此外,用户之前提到PHP代码优化和数据库拆分对CC攻击的影响,所以需要考虑是否当前的CPU问题并发请求有关,比如CC攻击导致的资源耗尽。此时,需要结合网络流量分析,查看是否有异常请求模式。 总结起来,用户的问题需要从多个层面分析:系统监控、进程分析、代码审查、数据库和缓存优化、外部服务状态,以及系统配置。结合用户提供的引用内容,重点排查Redis单核瓶颈、代码中的死循环、MySQL慢查询等问题,并确保监控工具能正确反映各核心的使用情况,避免平均负载掩盖单核问题。</think>### 服务器CPU 100%与负载过的系统性分析 --- #### **一、核心原因分类** 根据引用内容及实际运维经验,CPU满载与负载过通常由以下五类问题导致: $$ \text{问题根源} = \text{进程资源占用} + \text{代码逻辑缺陷} + \text{数据库/缓存异常} + \text{外部服务依赖} + \text{系统配置错误} $$ --- ### 二、详细原因解析与排查方法 --- #### **1. 进程级资源占用分析** - **现象特征** 通过`top`命令观察: ```bash top -c # 显示完整命令 ``` - **用户态CPU**:多为应用程序逻辑问题(如引用[3]的死循环) - **系统态CPU**:可能涉及频繁的系统调用或I/O等待 - **线程级定位**(引用[4]方法) ```bash # 1. 找出CPU进程PID pidstat -p <PID> 1 5 # 监控指定进程 # 2. 转换线程ID为16进制 printf "%x\n" <线程ID> # 3. 分析线程堆栈 jstack <PID> | grep -A 20 <16进制线程ID> ``` --- #### **2. 代码逻辑缺陷** - **典型案例**(引用[3]) ```java try { esClient.writeData(); // ES写入失败 } catch (Exception e) { esClient.writeData(); // 异常中递归调用,形成死循环 } ``` - **排查重点**: 1. 日志中是否存在重复错误堆栈 2. 使用`jstack`或`strace`跟踪线程状态 3. 代码审计关注异常处理、递归调用 --- #### **3. 数据库/缓存异常** - **Redis单核瓶颈**(引用[1]) ```bash # 监控Redis单核使用率 mpstat -P ALL 1 # 显示所有CPU核心状态 ``` - **优化方案**: - 多实例部署:启动多个Redis实例绑定不同CPU核心 - Pipeline优化:合并命令减少网络交互次数 - **MySQL慢查询冲击**(引用[5]) ```sql -- 开启慢查询日志 SET GLOBAL slow_query_log = 'ON'; -- 分析慢查询 mysqldumpslow -s t /var/log/mysql-slow.log ``` --- #### **4. 外部服务依赖故障** - **级联故障模型**: ```mermaid graph LR A[ES集群宕机] --> B[应用重试风暴] B --> C[线程池耗尽] C --> D[CPU 100%] ``` - **防御措施**: 1. 熔断机制:Hystrix或Resilience4j实现故障隔离 2. 超时控制:设置合理的RPC调用超时时间 --- #### **5. 系统配置错误** - **PHP-FPM配置不当**: ```ini ; php-fpm.conf错误配置示例 pm.max_children = 500 # 进程数过多导致CPU争抢 ``` - **优化公式**: $$ N_{合理进程数} = \frac{\text{可用内存}}{\text{单进程内存消耗}} \times 0.8 $$ - **连接泄漏问题**: ```bash # 检查TCP连接状态 ss -s | grep ESTAB ``` --- ### 三、排查流程标准化 --- #### **诊断流程图** ```mermaid graph TD A[CPU报警] --> B{使用top定位进程} B -->|用户态| C[分析应用日志/线程堆栈] B -->|系统态| D[检查系统调用/IO等待] C --> E{发现死循环?} E -->|是| F[代码修复+熔断机制] E -->|否| G[检查数据库/缓存] D --> H{存在大量上下文切换?} H -->|是| I[调整进程/线程数] H -->|否| J[检查硬件中断] ``` --- #### **关键指标监控表** | 监控项 | 正常范围 | 危险阈值 | 检查工具 | |----------------|-------------|-------------|--------------| | CPU使用率 | <70% | >90%持续5分钟 | top/vmstat | | 系统负载 | <CPU核心数×0.7 | >CPU核心数×2 | uptime | | 线程状态 | 无BLOCKED | 多线程WAITING | jstack/arthas | | Redis QPS | <5万/核心 | >10万/核心 | redis-cli info| | MySQL活跃连接数 | <max_connections×0.8 | >max_connections×0.95 | SHOW PROCESSLIST | --- ### 四、典型解决方案 --- #### **案例1:Redis单核过载**(引用[1]) - **现象复现**:双核服务器显示平均负载50%,实际单核100% - **解决步骤**: 1. 使用`taskset`绑定Redis到特定核心: ```bash taskset -c 0 redis-server /path/to/redis.conf ``` 2. 部署多实例分担压力 3. 监控工具改用`pidstat -p <PID> -u 1 3`观察单核使用 --- #### **案例2:ES异常导致死循环**(引用[3]) - **防御方案**: ```java // 添加重试计数器 int retryCount = 0; while (retryCount < 3) { try { esClient.writeData(); break; } catch (Exception e) { retryCount++; Thread.sleep(1000 * retryCount); // 指数退避 } } ``` --- ### 五、级分析工具 --- #### **1. FlameGraph火焰图分析** ```bash # 采集性能数据 perf record -F 99 -p <PID> -g -- sleep 30 # 生成火焰图 perf script | FlameGraph/stackcollapse-perf.pl | FlameGraph/flamegraph.pl > output.svg ``` #### **2. 动态追踪工具** ```bash # 跟踪系统调用 strace -ff -p <PID> -o strace.log # 分析文件IO opensnoop -p <PID> ``` --- ### 相关问题 1. 如何通过Linux perf工具定位CPU热点函数? 2. 数据库连接池配置不当会导致哪些CPU问题? 3. 微服务架构下如何设计熔断机制防止级联故障? [^1]: Redis单核性能瓶颈的监控盲区 [^2]: 死循环问题导致CPU满载的代码特征 [^3]: 数据库慢查询与CPU负载的关联分析
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值