ITPub博客

首页 > 数据库 > 数据库开发技术 > 压力测试中的CPU急剧升高?这样定位问题一步到位

压力测试中的CPU急剧升高?这样定位问题一步到位

原创 数据库开发技术 作者:IT枫斗者 时间:2024-12-04 21:56:09 0 删除 编辑


背景



在我们的微服务架构中,基金项目的压力测试是确保系统在高并发下稳定性和性能的关键步骤。每次大促前都会进行压力测试,监控系统的性能表现,包括 CPU 使用率、内存、负载(Load)、响应时间(RT)和每秒查询数(QPS)等指标。近期,我们在进行一次大促前的压力测试时,发现某些服务的 CPU 使用率出现异常飙升,导致系统性能瓶颈,影响了用户体验。


1. 问题发现



在大促前的压力测试中,测试人员注意到,当接口的 QPS 达到 500 时,某个服务的 CPU 使用率急剧上升。我们使用 Prometheus 和 Grafana 监控各项指标,发现 Java 应用的 CPU 利用率突然超出了 100%,并且迅速升高到 180%以上。



2. 登录服务器查看 CPU 使用情况


首先,通过 SSH 登录到应用服务器,使用 top 命令来查看 CPU 占用情况,确认是哪一个进程导致了高 CPU 使用:


$ top

输出显示,PID 为 1832 的 Java 进程占用 CPU 达到 181%,这是导致 CPU 使用过高的主要进程。



3. 定位高 CPU 占用的线程


接下来,使用 top 命令配合 -H 参数,查看 PID 为 1832 的 Java 进程的线程信息,定位到最占用 CPU 的线程:


$ top -Hp 1832

在输出中找到线程 ID 为 4721 的线程,该线程的 CPU 使用率高达 160%,确认是问题所在。



4. 获取线程堆栈信息


为了进一步分析,使用 jstack 命令获取该线程的堆栈信息,并将输出保存到 thread_dump.txt 文件:


$ jstack 1832 > thread_dump.txt
然后打开 thread_dump.txt,定位线程 ID 4721 对应的堆栈信息:
"Thread-4721" #4721 prio=5 os_prio=0 tid=0x00007f3e2a080800 nid=0x4e9f runnable [0x00007f3e278fe000]   java.lang.Thread.State: RUNNABLE    at com.example.validator.InputValidator.validate(InputValidator.java:38)    at com.example.service.UserService.validateUserInput(UserService.java:55)    at com.example.controller.UserController.processRequest(UserController.java:82)    ...

从堆栈信息中可以看到,问题发生在 InputValidator.java 文件的第 38 行。这个方法在每次调用时都会创建新的 Validator 实例,导致性能问题。


5. 问题分析



进一步分析代码,发现 InputValidator 类的 validate 方法每次验证用户输入时都会新创建一个 Validator 实例。这意味着在高并发情况下,每次请求都会反复创建和销毁对象,增加了 CPU 负担,导致资源浪费,进而引发 CPU 占用过高的情况。


6. 问题解决



针对这一问题,我们优化了 InputValidator 的实现方式。通过将 Validator 实例的创建移到类的构造函数中,确保 Validator 只会初始化一次,而不是每次请求都重新创建,从而大幅降低了 CPU 的占用。



重构后的代码如下:

public class InputValidator {
private final Validator validator;
public InputValidator() { // 将 Validator 的创建移到构造函数中,只创建一次 this.validator = new Validator(); }
public boolean validate(String input) { // 重复使用已经创建的 Validator 实例 return validator.isValid(input); }}

在 UserService 和 UserController 中,InputValidator 类的调用逻辑保持不变,但每次请求将不再重新创建 Validator 实例,从而避免了不必要的 CPU 负担。



7. 验证解决效果



修复后,再次进行压力测试,确认问题已经解决。在 QPS 达到 500 时,CPU 使用率明显下降,系统稳定运行,性能得到了有效提升。




👋 大家好,我是枫哥,一名Java后端开发者!我热衷于探索新技术,并在我的微信公众号上分享关于Java 生态和后端开发的知识。欢迎关注我的公众号,期待与你一起探讨技术的无穷可能!” 目前专注于Java技术分享,覆盖春招、秋招、社招和跳槽相关内容,并提供一对一带徒学习服务。加入 学徒计划,即可享受内推机会和优质资源,签订协议确保就业无忧。此外,我们还推出了‘Java跳槽网’, 为你的求职之路提供全方位支持,助你快速找到理想工作


END


原文作者:IT枫斗者;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论
大家好,我是枫哥,🌟阿里云技术专家、📝资深面试官、🌹Java跳蚤网课堂创始人。技术交流vx:itfdz666,拥有多年一线研发经验,曾就职过科大讯飞、美团网、平安等公司。看面试实战视频可以关注b站号:IT枫斗者–Java面试。需要看技术文章,可以关注CSDN:IT枫斗者。

注册时间:2020-05-13

  • 博文量
    183
  • 访问量
    81363