性能调优之java服务器容器调优详解

 更新时间:2023年04月20日 09:14:12   作者:Recently祝祝  
这篇文章主要介绍了java服务器容器调优,如果接口响应时间超过了既定数据,项目支撑不了这么大的请求,就需要对项目以及项目接口进行数据库、容器、缓存等方面的调优,文章中有详细的代码示例,需要的朋友可以参考一下

1.为什么要进行项目性能调优

在项目进行发布之前,需要对项目进行压力测试,可以检测出项目的性能问题,比如说:项目响应时间较慢,项目每次能解决的请求数较少,项目的瓶颈,项目查询数据时间较慢等问题,检测出来之后,就需要调优,意思就是说你的项目接口如果响应时间超过了十秒,还不做出一系列措施,那么这个项目就是有问题的,性能调优的目的就是为了使得项目更优化,RT(运行响应时间)跟小,TPS(吞吐量-》每秒从数据库接收的请求量)更大等等。

一般在企业中呢会使用JMeter或者K8s,部分企业会搭建自己的压测平台,在项目写好之后对项目进行压测,在定项目的时候会对项目的响应时间做要求,对项目的请求数据做一个大概的判断,开发人员就要根据这些要求编写接口,如果接口响应时间超过了既定数据,项目支撑不了这么大的请求,就需要对项目以及项目接口进行数据库、容器、缓存等方面的调优。

2.服务容器的性能调优

2.1对SpringBoot中切入式的Tomcat调优:优化最大线程数

调优说明:

maxThreads最大线程数:衡量web服务器,同时处理任务的数量

accept-count最大等待数:队列最大能接受的等待数量。超过拒绝请求。

Max Connections最大链接数:同一时间最大的连接数量。

链接数量最大的时候还会继续请求,进入等待,超过最大等待就会拒绝。

SpringBoot中的最大线程数是200,在很多情况下最大线程数200是不够的,一般而言1cpu2G的服务器配置设置为200,4cpu8G的服务器配置设置为800,可以大大提高TPS,降低RT

调优设置

修改配置文件application.yml

# Tomcat的 maxConnections、maxThreads、acceptCount三大配置,
#分别表示最大连接数,最大线程数、最大的等待数,可以通过application.yml配置文件来改变这个三个值,一个标
#准的示例如下:
server.tomcat.uri-encoding: UTF-8
# 思考问题:一台服务器配置多少线程合适?
server.tomcat.accept-count: 1000 # 等待队列最多允许1000个请求在队列中等待
server.tomcat.max-connections: 20000 # 最大允许20000个链接被建立
## 最大工作线程数,默认200, 4核8g内存,线程数经验值800
server.tomcat.threads.max: 800 # 并发处理创建的最大的线程数量
server.tomcat.threads.min-spare: 100 # 最大空闲连接数,防止突发流量

修改配置要确认生效。

可使用SpringBoot中的配置,刚刚的配置文件中再加上

# 暴露所有的监控点
management.endpoints.web.exposure.include: '*'
# 定义Actuator访问路径
management.endpoints.web.base-path: /actuator
# 开启endpoint 关闭服务功能
management.endpoint.shutdown.enabled: true
  • 检测配置生效:ip:端口/actuator
  • 搜索tomcat

2.2网络IO模型调优

网络io即系统文件读写io,系统里边使用的是NIO(高性能,同步,非阻塞),其实已经默认嵌入NIO2(超高性能,异步,非阻塞)但是需要调用NIO2的api就可以,但是这部分呢是根据系统来的,AIO(NIO2)取决于操作系统,比如linux就支持AIO

其实AIO就是NIO的一个优化,增强对文件处理和文件系统特性的支持。系统使用AIO之后,响应时间会降低且稳定。

调优设置

直接放进项目代码里边java类,生成一个java配置类

@Configuration
    public class TomcatConfig {
        //自定义SpringBoot嵌入式Tomcat
        @Bean
        public TomcatServletWebServerFactory servletContainer() {
            TomcatServletWebServerFactory tomcat = new
                TomcatServletWebServerFactory() {};
            tomcat.addAdditionalTomcatConnectors(http11Nio2Connector());
            return tomcat;
        }
        //配置连接器nio2
        public Connector http11Nio2Connector() {
            Connector connector=new
                Connector("org.apache.coyote.http11.Http11Nio2Protocol");
            Http11Nio2Protocol nio2Protocol = (Http11Nio2Protocol)
                                               connector.getProtocolHandler();
            //等待队列最多允许1000个线程在队列中等待
            nio2Protocol.setAcceptCount(1000);
            // 设置最大线程数
            nio2Protocol.setMaxThreads(1000);
            // 设置最大连接数
            nio2Protocol.setMaxConnections(20000);
            //定制化keepalivetimeout,设置30秒内没有请求则服务端自动断开keepalive链接
            nio2Protocol.setKeepAliveTimeout(30000);
            //当客户端发送超过10000个请求则自动断开keepalive链接
            nio2Protocol.setMaxKeepAliveRequests(10000);
            // 请求方式
            connector.setScheme("http");
            connector.setPort(9003); //自定义的端口,与源端口9001可以共用,知识改了连接器而已
            connector.setRedirectPort(8443);
            return connector;
        }
    }
  • 检测配置生效:ip:9003/调用接口

说明:tomcat还有一种模式叫apr,自动开启aio,上边用的是另一种方式,但是一般不会通过这个来调优,这部分只是做一个初步了解,因为不是所有系统都支持AIO

2.3容器优化Tomcat升级Undertow

众所周知,SpringBoot中已经嵌入了Tomcat,但是其实SpringBoot内嵌了三种服务器:Tomcat(成熟、稳定、高性能服务器),apache开发、Jetty(轻量级,快速灵活)、Undertwo(高性能,灵活性高)。

在 Spring Boot 中,默认使用的是 Tomcat 作为内置的 Web 服务器,也可以在配置文件中进行相应的配置,选择使用 Jetty 或 Undertow。

配置操作过程:

  • 在spring-boot-starter-web排除tomcat
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
  <exclusions>
    <exclusion>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-tomcat</artifactId>
    </exclusion>
  </exclusions>
</dependency

导入其他容器的starter

<!--导入undertow容器依赖-->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-undertow</artifactId>
</dependency>
  • 配置
# 设置IO线程数, 它主要执行非阻塞的任务,它们会负责多个连接
server.undertow.threads.io: 800
# 阻塞任务线程池, 当执行类似servlet请求阻塞IO操作, undertow会从这个线程池中取得线程
# 默认值是IO线程数*8
server.undertow.threads.worker: 8000
# 以下的配置会影响buffer,这些buffer会用于服务器连接的IO操作,有点类似netty的池化内存管理
# 每块buffer的空间大小越小,空间就被利用的越充分,不要设置太大,以免影响其他应用,合适即可
server.undertow.buffer-size: 1024
# 每个区分配的buffer数量 , 所以pool的大小是buffer-size * buffers-per-region
# 是否分配的直接内存(NIO直接分配的堆外内存)
server.undertow.direct-buffers: true

3.本章总结

到此这篇关于性能调优之java服务器容器调优详解的文章就介绍到这了,更多相关java服务器容器调优内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot 如何将项目打包成 jar 包

    SpringBoot 如何将项目打包成 jar 包

    这篇文章主要介绍了SpringBoot如何将项目打包成jar包,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-08-08
  • maven多个仓库查询的优先级顺序案例讲解

    maven多个仓库查询的优先级顺序案例讲解

    这篇文章主要介绍了maven多个仓库查询的优先级顺序,考虑到我们常用的配置文件是conf/settings.xml和工程里面的pom.xml文件,我们针对这两个文件的结合来分析仓库的使用顺序,需要的朋友可以参考下
    2023-04-04
  • Java日期毫秒值和常见日期时间格式相互转换方法

    Java日期毫秒值和常见日期时间格式相互转换方法

    这篇文章主要给大家介绍了关于Java日期毫秒值和常见日期时间格式相互转换的相关资料,在Java的日常开发中,会随时遇到需要对时间处理的情况,文中给出了详细的示例代码,需要的朋友可以参考下
    2023-07-07
  • 详解maven的setting配置文件中mirror和repository的区别

    详解maven的setting配置文件中mirror和repository的区别

    这篇文章主要介绍了详解maven的setting配置文件中mirror和repository的区别,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-12-12
  • 从Android源码剖析Intent查询匹配的实现

    从Android源码剖析Intent查询匹配的实现

    这篇文章主要介绍了从Android源码剖析Intent查询匹配的实现,Intent部分的源码为Java代码,需要的朋友可以参考下
    2015-07-07
  • SpringBoot中使用Filter和Interceptor的示例代码

    SpringBoot中使用Filter和Interceptor的示例代码

    这篇文章主要介绍了SpringBoot中使用Filter和Interceptor的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-06-06
  • 关于java.lang.NumberFormatException: null的问题及解决

    关于java.lang.NumberFormatException: null的问题及解决

    这篇文章主要介绍了关于java.lang.NumberFormatException: null的问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • ScrollView中嵌入ListView只显示一条的解决办法

    ScrollView中嵌入ListView只显示一条的解决办法

    在ScrollView添加一个ListView会导致listview控件显示不全,通常只会显示一条,究竟是什么原因呢?下面脚本之家小编给大家介绍ScrollView中嵌入ListView只显示一条的解决办法,感兴趣的朋友一起学习吧
    2016-05-05
  • SpringBoot发送html邮箱验证码功能

    SpringBoot发送html邮箱验证码功能

    这篇文章主要介绍了SpringBoot发送html邮箱验证码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-12-12
  • 关于Spring的统一功能处理(拦截器)实现

    关于Spring的统一功能处理(拦截器)实现

    这篇文章主要介绍了关于Spring的统一功能处理(拦截器)实现,每个方法中都要单独写用户登录验证的方法,即使封装成公共方法,也一样要传参调用和在方法中进行判断,需要的朋友可以参考下
    2023-05-05

最新评论