性能测试-CPU使用率过高问题

一、通过jstack排查


1.通过top命令找到cpu占用高的应用程序进程

top


2.通过top -Hp pid查看该应用中占用CPU高的线程

top -Hp 5649

下图中是线程id


3.通过printf "%x\n" [线程id] 将线程高的线程号转为十六进制。
4.通过jstack过滤该十六进制的关键信息。jstack [进程号]|grep -A 10 [线程的16进制]

如下所示,定位到问题代码行

[root@VM-100-3-centos ~]# printf "%x\n" 6887
1ae7
[root@VM-100-3-centos ~]# jstack 5649 | grep -A 10 1ae7
"http-nio-18001-exec-107" #126 daemon prio=5 os_prio=0 tid=0x00007f48ec069000 nid=0x1ae7 runnable [0x00007f493cba1000]
   java.lang.Thread.State: RUNNABLE
        at com.tony.edu.perf.PostmanApplication.memory(PostmanApplication.java:48)
        at sun.reflect.GeneratedMethodAccessor30.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190)
        at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138)
        at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:105)
        at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:878)
        at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:792)
[root@VM-100-3-centos ~]#

二、通过Arthus(阿尔萨斯)排查

jstack排查,因为占用高的线程可能很快执行完了,手动操作,不容易定位,所以通常使用封装好的脚本或者工具,比如阿里的Arthus(阿尔萨斯)

Artuhs 是阿里巴巴开源的 java 的诊断工具

Arthas 地址:https://github.com/alibaba/arthas

官方文档:arthas

下载地址:Releases · alibaba/arthas · GitHub

1、下载后解压

2、进入解压目录

3、执行 java -jar arthas-boot.jar,启动

wyl@WYLdeMacBook-Air arthas-packaging-3.7.2-bin % pwd
/Users/wyl/Downloads/arthas-packaging-3.7.2-bin
wyl@WYLdeMacBook-Air arthas-packaging-3.7.2-bin % java -jar arthas-boot.jar 
[INFO] JAVA_HOME: /Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home
[INFO] arthas-boot version: 3.7.2
[INFO] Found existing java process, please choose one and input the serial number of the process, eg : 1. Then hit ENTER.
* [1]: 1827 sys_perf_01-0.0.1-SNAPSHOT.jar
  [2]: 1748 jd-gui-1.6.6-min.jar
  [3]: 1917 /Users/wyl/program/apache-jmeter-5.6.3/bin/ApacheJMeter.jar

4、要观察第哪个应用,输入哪个应用前面的序号。

如下示例,输入1

1
[INFO] arthas home: /Users/wyl/Downloads/arthas-packaging-3.7.2-bin
[INFO] Try to attach process 1827
Picked up JAVA_TOOL_OPTIONS: 
[INFO] Attach process 1827 success.
[INFO] arthas-client connect 127.0.0.1 3658
  ,---.  ,------. ,--------.,--.  ,--.  ,---.   ,---.                           
 /  O  \ |  .--. ''--.  .--'|  '--'  | /  O  \ '   .-'                          
|  .-.  ||  '--'.'   |  |   |  .--.  ||  .-.  |`.  `-.                          
|  | |  ||  |\  \    |  |   |  |  |  ||  | |  |.-'    |                         
`--' `--'`--' '--'   `--'   `--'  `--'`--' `--'`-----'                          

wiki       https://arthas.aliyun.com/doc                                        
tutorials  https://arthas.aliyun.com/doc/arthas-tutorials.html                  
version    3.7.2                                                                
main_class org.springframework.boot.loader.JarLauncher                          
pid        1827                                                                 
time       2024-02-29 09:28:09                      

5、dashboard,进入看板,看板会自动刷新

6、ctrl+c,退出看板,输入 thread 57,查看该线程的问题代码行

附录、CPU 占用高的测试代码


import io.swagger.annotations.Api;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
@Api("- )
public class PostmanApplication {
  public static void main(String[] args) {
    SpringApplication.run(com.tony.edu.perf.PostmanApplication.class, args);
  }
  
  @GetMapping({"/cpu"})
  public ResponseEntity cpu() {
    long count = 1L;
    while (count < 10000000L) {
      count++;
      System.currentTimeMillis();
    } 
    return ResponseEntity.ok(");
  }
  
  @GetMapping({"/memory"})
  public ResponseEntity memory() throws InterruptedException {
    long startTime = System.currentTimeMillis();
    byte[] data = new byte[67108864];
    Thread.sleep(10L);
    return ResponseEntity.ok("+ data.length);
  }
}

启动服务后,访问 http://host:port/cpu,及可以触发

## 场景1  JVM的内存配置太少
## 1. 设置 512MB
java -Xmx512m -jar sys_perf_01-0.0.1-SNAPSHOT.jar 
## 2.  加大一倍内存 1200M
java -Xmx1200m -jar sys_perf_01-0.0.1-SNAPSHOT.jar 


## 场景2 WEB服务器 提供的 线程数 过少
## 1. WEB服务器 提供的 线程数 过少
java -Xmx1200m -jar  -Dserver.tomcat.max-threads=1 sys_perf_01-0.0.1-SNAPSHOT.jar 
## 2. 
java -Xmx1200m -jar  -Dserver.tomcat.max-threads=100 sys_perf_01-0.0.1-SNAPSHOT.jar 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/420026.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

阿里云短信发送

阿里云短信 发送短信验证码是现在日常生活中很常见的事务&#xff0c;但相信很多人都只是接受过验证码&#xff0c;并不知道验证码的生成过程&#xff0c;也不知道如何自己创建一个验证码。会简单介绍如何通过阿里云来创建一个验证码短信。 一、首先打开阿里云官网 官网&…

Intel 芯片 Mac 如何重新安装系统

使用可引导安装器重新安装&#xff08;可用于安装非最新的 Mac OS&#xff0c;系统降级&#xff0c;需要清除所有数据&#xff0c;过程确保连接上网络&#xff0c;虽然这种方式不会下载 Mac OS&#xff0c;但是需要下载固件等信息&#xff09; 插入制作好的可引导安装器&#x…

MYSQL--JDBC*

一.介绍: 1.JDBC是一种用于执行SQL于语句的JAVA API,JDBC是一种使用JAVA访问数据库的执行规范标准,能够为不同的数据库提供统一的访问!由一组使用JAVA语言编写的接口以及类组成的 2.JDBC核心的类以及相关的接口主要有: DriverManager 注册驱动 Connection 使用…

【学习心得】Python调用JS的三种常用方法

在做JS逆向的时候&#xff0c;一种情况是直接用Python代码复现JS代码的功能&#xff0c;达成目的。但很多时候这种方法有明显的缺点&#xff0c;那就是一旦JS代码逻辑发生了更改&#xff0c;你就得重写Python的代码逻辑非常不便。于是第二种情况就出现了&#xff0c;我直接得到…

ccadmin - 可免费试用的 FreeSWITCH web管理后台

ccadmin - FreeSWITCH web管理后台 简介免费测试在线预览功能说明 简介 顶顶通呼叫中心中间件Web后台管理系统简称CCAdmin-Web&#xff0c;用于管理和配置顶顶通呼叫中心中间件。因为顶顶通呼叫中心中间件是基于FreeSWITCH开发的&#xff0c;所以CCAdmin本质上也是一个FreeSWI…

【论文精读】DINOv2

摘要 学习与特定任务无关的预训练表示已经成为自然语言处理的标准&#xff0c;这些表示不进行微调&#xff0c;即可在下游任务上明显优于特定任务模型的性能。其主要得益于使用无监督语言建模目标对大量原始文本进行预训练。 遵循NLP中的这种范式转变&#xff0c;以探索计算机视…

C语言第三十三弹---动态内存管理(上)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 动态内存管理 1、为什么要有动态内存分配 2、malloc和free 2.1、malloc 2.2、free 3、calloc和realloc 3.1、calloc 3.2、realloc 4、常见的动态内存的错…

《Spring Security 简易速速上手小册》第5章 高级认证技术(2024 最新版)

文章目录 5.1 OAuth2 和 OpenID Connect5.1.1 基础知识详解OAuth2OpenID Connect结合 OAuth2 和 OIDC 5.1.2 重点案例&#xff1a;使用 OAuth2 和 OpenID Connect 实现社交登录案例 Demo 5.1.3 拓展案例 1&#xff1a;访问受保护资源案例 Demo测试访问受保护资源 5.1.4 拓展案例…

Redis 【1】—— 安装 与 配置

Redis 【1】—— 安装 与 配置 一、安装 与 配置&#xff08;一&#xff09;使用 yum 安装&#xff08;二&#xff09;创建符号链接1. 软链接2. 相关指令 &#xff08;三&#xff09;修改配置文件&#xff08;四&#xff09;Redis 的启停 一、安装 与 配置 &#xff08;一&…

金融短信群发平台具有那些特点

金融短信群发平台的特点主要包括以下几个方面&#xff1a; 1.高效性&#xff1a;金融短信群发平台能够快速地发送大量的短信&#xff0c;使得金融信息能够迅速传达给目标客户&#xff0c;保证了信息的及时性和有效性。 2.安全性&#xff1a;金融短信群发平台对于信息的安全性非…

MySQL 主从读写分离入门——基本原理以及ProxySQL的简单使用

一、读写分离工作原理 读写分离的工作原理&#xff1a;在大型网站业务中&#xff0c;当单台数据库无法满足并发需求时&#xff0c;通过主从同步方式同步数据。设置一台主服务器负责增、删、改&#xff0c;多台从服务器负责查询&#xff0c;从服务器从主服务器同步数据以保持一…

本届挑战赛冠军方案:基于LLM的多场景智能运维

本文介绍本届挑战赛冠军得主SRE-Copilot团队的参赛方案&#xff1a;基于LLM的多场景智能运维。 基础架构-SRE&#xff0c;负责字节跳动基础架构部门所有组件的SRE工作&#xff0c;沿着成本、稳定性、效率、服务四条主线&#xff0c;致力于打造高扩展、高可用的生产系统。基础架…

2024年【烟花爆竹经营单位安全管理人员】免费试题及烟花爆竹经营单位安全管理人员试题及解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 烟花爆竹经营单位安全管理人员免费试题根据新烟花爆竹经营单位安全管理人员考试大纲要求&#xff0c;安全生产模拟考试一点通将烟花爆竹经营单位安全管理人员模拟考试试题进行汇编&#xff0c;组成一套烟花爆竹经营单…

Linux设置程序任意位置执行(设置环境变量)

问题 直接编译出来的可执行程序在执行时需要写出完整路径比较麻烦&#xff0c;设置环境变量可以实现在任意位置直接运行。 解决 1.打开.bashrc文件 vim ~/.bashrc 2.修改该文件&#xff08;实现将/home/zhangziheng/file/seqrequester/build/bin&#xff0c;路径下的可执…

四、《任务列表案例》后端程序实现和测试

本章概要 准备工作功能实现前后联调 4.1 准备工作 数据库脚本 CREATE TABLE schedule (id INT NOT NULL AUTO_INCREMENT,title VARCHAR(255) NOT NULL,completed BOOLEAN NOT NULL,PRIMARY KEY (id) );INSERT INTO schedule (title, completed) VALUES(学习java, true),(学…

spring cloud 入门

​ 学习目标&#xff1a; 学习spring cloud项目快速搭建方法&#xff0c;学习nacos注册中心使用&#xff0c;实现两个服务间的调用 学习内容&#xff1a; 一、Spring Cloud介绍 Spring 以 Bean&#xff08;对象&#xff09; 为中心&#xff0c;提供 IOC、AOP 等功能。Sprin…

使用链表和数组输出A~Z的ASCII码

输出结果 26个字母以及其对应的ASCII码 一、使用链表创建&#xff0c;注意&#xff1a; 节点需要有next指针初始化时head需要new一下 cur指针代表当前指针&#xff0c;每次不断的New新的节点&#xff0c;pre指针代表当前指针的前一个指针&#xff0c;每次pre的next指针指向cur…

Unity将4个纹理图拼接成1个纹理

需要的效果 最终实现的效果大概如下: 4个贴图上去 这里随便放一个切分的图。 Shader代码如下 直接上代码: // Unity built-in shader source. Copyright (c) 2016 Unity Technologies. MIT license (see license.txt)// Unlit shader. Simplest possible textured shad…

基础小白快速入门Python------>模块的作用和意义

模块&#xff0c; 这个词听起来是如此的高大威猛&#xff0c;以至于萌新小白见了瑟瑟发抖&#xff0c;本草履虫见了都直摇头&#xff0c;好像听上去很难的样子&#xff0c;但是但是&#xff0c;年轻人&#xff0c;请听本少年细细讲述&#xff0c;他只是看起来很难&#xff0c;实…

猫毛过敏养猫人士的必备养猫好物-宠物空气净化器品牌分享

许多猫奴在与猫相处一段时间后突然对猫毛过敏&#xff0c;这真是令人难受。一些人认为对猫咪过敏是因为它们在空气中飘浮的毛发引起的&#xff0c;但实际上大部分人之所以过敏是因为对猫身上一种微小的蛋白质过敏。这种导致过敏的蛋白质附着在猫咪的一些皮屑上。我们都知道猫咪…