首页 > 编程语言 >【性能测试】java性能问题排查提效脚本工具

【性能测试】java性能问题排查提效脚本工具

时间:2024-02-22 09:45:50浏览次数:30  
标签:busy java 性能 CPU id 线程 提效 top

本文主要讲述针对cpu高耗和网络IO瓶颈两个场景,使用排查提效脚本工具快速定位分析性能瓶颈

场景一:当服务器CPU高耗原因分析,如何快速定位到占用cpu高的用户线程

  1. top命令找出消耗CPU高的Java进程及其线程id:
    1. 开启线程显示模式(top -H,或是打开top后按H)
    2. 按CPU使用率排序(top缺省是按CPU使用降序,已经合要求;打开top后按P可以显式指定按CPU使用降序)
    3. 记下Java进程id及其CPU高的线程id
  1. 查看消耗CPU高的线程栈:
    1. 用进程id作为参数,jstack出有问题的Java进程
    2. 把上述记录的10进制线程id手动转换成十六进制线程id(可以用printf %x 1234)
    3. 在jstack输出中查找十六进制的线程id(可以用vim的查找功能/0x1234,或是grep 0x1234 -A 20)
  1. 查看对应的线程栈,分析问题

实战案例:

项目部署:jvmpertest + tomcat +jdk1.8

    1、 解压 tomcat的包

    2 、把jvmpertest.war包 放tomcat的webapps

    3、 启动tomcat, 默认端口 8080

    4、 http://serverip:8080/JvmPertest/pertest1 测试接口  

    5 、http://serverip:8080/JvmPertest/PerThreadTest 创建线程

    6 、jmeter编写脚本

分析方法1:

    1 、使用top命令或者jps命令可以或得进程ID 21767

    2 、但是进程只是资源的拥有者,并不是执行者,所以需要找到进程中的线程,使用命令:top -Hp +进程id可以得到进程中的所有线程

top -Hp 21767

 调用接口:http://serverip:8080/JvmPertest/PerThreadTest,发现,我们top命令中 us态,已经达到100%,执行 top -Hp 进程id 找到了新增的线程的id 23054

要把线程id 转换为16进制, 因为,我们要定位线程的问题,这些线程的栈 信息是在内存中,是16进制显示在内存中,命令:printf"%x\n" +线程id

 输入命令jstack 进程id | grep 线程id的16进制  -A20 从前往后显示20行(jstack 21767 |grep 5a0e  -A20 ) 源代码显示现在,我们这个项目导致CPU的us态很高的原因,是 ThreadPerTest.java文件中的第 15行代码

分析方法2(show-busy-java-threads.sh脚本排查):

1、wget --no-check-certificate https://github.com/oldratlee/useful-scripts/archive/release.zip下载
2、unzip release.zip
3、sh show-busy-java-threads.sh 从所有运行的Java进程中找出最消耗CPU的线程(缺省5个),打印出其线程栈(同排除思路)
4、也可以指定进程:show-busy-java-threads -p <指定的Java进程Id>

用法解析:

show-busy-java-threads -p <指定的Java进程Id>

show-busy-java-threads -c <要显示的线程栈数>

show-busy-java-threads <重复执行的间隔秒数> [<重复执行的次数>]

# 多次执行;这2个参数的使用方式类似vmstat命令

show-busy-java-threads -a <运行输出的记录到的文件># 记录到文件以方便回溯查看

show-busy-java-threads -S <存储jstack输出文件的目录># 指定jstack输出文件的存储目录,方便记录以后续分析

 

场景二:怀疑网络连接问题,如何快速分析网络TCP状态

tcp-connection-state-counter脚本,统计各个TCP连接状态的个数。

支持Linux、Mac、Windows(cygwin、MSSYS)。

像Nginx、Apache的机器上需要查看,TCP连接的个数,以判定

连接数、负荷
是否有攻击,查看SYN_RECV数(SYN攻击)
TIME_WAIT数,太多会导致TCP: time wait bucket table overflow。

 示例:

 参考文档:

https://www.cnblogs.com/johnny-chen/p/13359826.html

https://www.cnblogs.com/hailangboke/p/16368945.html#5201810

https://blog.csdn.net/ya_shy/article/details/126073768

 

 

标签:busy,java,性能,CPU,id,线程,提效,top
From: https://www.cnblogs.com/xfbk/p/18022536

相关文章

  • 【性能测试】Redis监控利器---Redis State
    一、本地运行监控神器(以Windows为例)1、安装Jruby,官网地址:http://jruby.org/2、官网下载最新的RedisStatejar包,官网下载地址:https://github.com/junegunn/redis-stat/releases3、启动RedisState进行监控(1)启动命令redis-stat[HOST[:PORT][/PASS]...][INTERVAL[COUN......
  • 面试官不按套路出牌,上来就让聊一聊Java中的迭代器(Iterator ),夺命连环问,怎么办?
    写在开头某大厂的面试现场,一位目光深邃,头顶稀疏的中年面试官坐在椅子上,这时候的我走了进来。面试官:“小伙子,学过Java中容器和数据结构了吧?”我:“嗯,学了”面试官:“ok,那你来聊一聊Java中的迭代器(Iterator),要说清楚他们的应用场景哈”我:“哦,好滴”内心独白:“这面试官不按套路......
  • idea的Java项目打成jar包并服务器部署运行
    idea的Java项目打成jar包并服务器部署运行文章目录一、idea对Java项目打jar包二、上传jar包到服务器运行一、idea对Java项目打jar包1.File—>ProjectStructure---->Artifacts2.点击+号选择JAR,再选择第二个3.出现这个框,第一个Module是你最后jar包的名字,第二个是Ma......
  • 华为云GaussDB支撑农行超级网银业务,性能和稳定性备受认可
    数据库作为数据驱动业务创新和智慧银行建设的关键基础设施,在银行数字化变革中具有举足轻重的作用。在金融科技发展和国家政策引领下,银行纷纷加快推进数字化转型时代,正在经历一场以科技引领、数据赋能、数字经营为目标的智慧银行数字化变革。数据库作为数据驱动业务创新和智慧银......
  • JavaScript 的新数组分组方法
    对数组中的项目进行分组,你可能已经做过很多次了。每次都会手动编写一个分组函数,或者使用lodash的groupBy函数。好消息是,JavaScript现在有了分组方法,所以你再也不必这样做了。Object.groupBy和Map.groupBy这两个新方法将使分组变得更简单,并节省我们的时间或依赖性。以前......
  • hash表与java集合框架
       1.对象被new出来后,会通过哈希函数Hash(key)建立关键字key与存储地址Addr的关系,Addr=Hash(Key),这个Addr又称HashCode。即:每个对象有唯一的HashCode。-另外:底层对对象进行hash时因为hash表长度有限所以存储可能会有冲突,为了解决冲突而在顺序表的某个存储地址上加......
  • 深入剖析 Java 类属性与类方法的应用
    Java类属性Java类属性,也称为字段,是类中的变量。它们用于存储与类相关的数据。创建类属性在类定义中声明属性:publicclassMain{intx;//属性Stringname;//属性}访问类属性使用点语法访问对象的属性:MainmyObj=newMain();myObj.x=5;//设置属性值Sy......
  • Java虚拟机小记
    目录运行时数据区域Java堆对象创建对象的内存布局对象的访问定位句柄直接指针GC判断对象是否已死引用计数算法可达性分析算法引用的类别垃圾收集算法分代收集理论标记清除算法标记复制算法标记整理算法实现细节并发的可达性分析垃圾收集器serial收集器ParNew收集器ParallelScaven......
  • rt-thread 性能测试
      在实时操作系统中,线程调度花费的时间是一个值得关注的影响系统实时性的因素,尤其是在系统需要处理紧急的任务时,线程调度的时间更是不能忽略。我采用了一种测量GPIO输出正脉冲宽度的方法,测量出了RT-Thread系统线程调度所需的时间。  实验中,我使用了GD32F103系列单片机,单片......
  • idea创建spring项目的时候只有java 21和17
    1.问题我们在用IDEA创建一个spring项目时,发现java版本只能选用java21,java17,导致我们的jdk版本无法选择jdk1.8(我最常用的版本)2.解决参考:idea创建项目的时候只有java21和17原因是spring2在23年11月24日停止维护了,所以通过spring来创建,没有spring2,只有spring3+,最低jdk版本也是1......