Java性能调优

原创
2022/10/13 15:40
阅读数 149

前提是基于docker部署的应用

性能衡量指标

  1. 吞吐量
  2. 响应时间

1. Java侧

  • Javase:

使用工具:

  • arthas

docker exec -it xxx /bin/bash -c "wget https://arthas.aliyun.com/arthas-boot.jar && java -jar arthas-boot.jar"

trace命令使用

trace 类路径 方法名 例如 trace com.xxxImpl toIndex

展示的结果:

更多命令可以参考官网:

https://arthas.aliyun.com/doc/arthas-tutorials.html?language=cn&id=arthas-basics

  • top命令,查找出问题线程步骤如下:

  1. top 命令查看CPU占用100%的进程号(PID)
  2. top -H -n 1 -p PID 然后通过命令查找对应进程下线程的状态
  3. 然后通过 jstack -l PID > ./jstack.log 命令输出进程的线程文件
  4. 查看刚输出的jstack.log文件,查看线程详情。注意这里的线程PID是第二步PID,还要转成16进制
  • vmstat、jps、jstat、jstack等原生工具,图形化jvisual

  • Springcloud压测

1. springcloud-gateway性能压测和参数配置

gateway特性:

  1. 网关线程数的增加,对吞吐量有较大提升;
  2. 网关对CPU要求较高,建议提升CPU性能,但需要权衡单台高配和多台低配的整体性能对比;
  3. 网关对内存、硬盘要求较低;
  4. 在吞吐量追求和CPU负载升高之间,做权衡选择机器配置;

可以提升处理能力的属性配置:

@Configuration
public class ReactNettyConfiguration {
    @Bean
    public ReactorResourceFactory reactorClientResourceFactory() {
        System.setProperty("reactor.netty.ioSelectCount", "1");

        // 这里工作线程数为2-4倍都可以。看具体情况
        int ioWorkerCount = Math.max(Runtime.getRuntime().availableProcessors() * 4, 4);
        System.setProperty("reactor.netty.ioWorkerCount",String.valueOf(ioWorkerCount));
        return new ReactorResourceFactory();
    }
}

2. 单个服务中springboot中tomcat和undertow参数设置参考

# Tomcat
server:
  port: 8080
  servlet:
    context-path: /
  tomcat:
#    max-connections: 500
    uri-encoding: UTF-8
    threads:
      max: 800
      min-spare: 80
    remoteip:
      remote-ip-header: x-forwarded-for
  undertow:
    # 阻塞任务线程池, 当执行类似servlet请求阻塞IO操作, undertow会从这个线程池中取得线程
    # 它的值设置取决于系统线程执行任务的阻塞系数,默认值是IO线程数*8
    # 以下的配置会影响buffer,这些buffer会用于服务器连接的IO操作,有点类似netty的池化内存管理
    # 每块buffer的空间大小,越小的空间被利用越充分,不要设置太大,以免影响其他应用,合适即可
    buffer-size: 1024
    # 每个区分配的buffer数量 , 所以pool的大小是buffer-size * buffers-per-region
    #buffers-per-region: 1024
    # 是否分配的直接内存(NIO直接分配的堆外内存)
    direct-buffers: true
    threads:
      # 默认设置每个CPU核心一个线程 比如 四核的服务器  则配置4
      io: 8
      # 默认值是IO线程数 * 8   高并发的服务可以根据并发情况调大一些
      worker: 256

2. 数据库侧

1. 数据库调优,explain sql

2. 索引创建,推荐使用覆盖索引

展开阅读全文
加载中

作者的其它热门文章

打赏
0
0 收藏
分享
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部