当前位置:

首页 > 编程开发 > Java 服务器容器的优化方法是什么?

Java 服务器容器的优化方法是什么?

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

本文目录

    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

    
      org.springframework.boot
      spring-boot-starter-web
      
        
          org.springframework.boot
          spring-boot-starter-tomcat
        
      
    

    导入其他容器的starter

    
    
      org.springframework.boot
      spring-boot-starter-undertow
    
    • 配置

    # 设置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
    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发 Java 服务器
    相关文章 更多
    Java单元测试入门:使用JUnit 5编写第一个测试用例
    Java单元测试入门:使用JUnit 5编写第一个测试用例

    面向初学者的JUnit 5实用入门指南。从测试概念、Maven依赖配置,到手把手编写首个单元测试用例及断言验证,助你掌握Java单元测试的核心流程。

    Java变量未初始化报错解析:局部变量与成员变量默认值差异
    Java变量未初始化报错解析:局部变量与成员变量默认值差异

    深入解析Java中局部变量未初始化编译报错与成员变量自动赋予默认值的机制差异,涵盖JVM内存分配、编译期确定性赋值检查与实际排查修复方案。

    Java获取当前时间并格式化输出:DateTimeFormatter与SimpleDateFormat
    Java获取当前时间并格式化输出:DateTimeFormatter与SimpleDateFormat

    详细讲解在Java中获取当前系统时间并进行格式化输出的两种核心方案:基于Java 8全新日期时间API的DateTimeFormatter与传统遗留的SimpleDateFormat,包含完整代码示例、线程安全机制对比及生产选型建议。

    Java中final与static final常量的定义及初始化规则
    Java中final与static final常量的定义及初始化规则

    深入解析Java中final变量与static final常量的定义、内存语义、初始化时机及合法赋值路径,涵盖编译期常量优化与实战避坑指南。

    Java抽象方法与接口方法的区别及选型建议
    Java抽象方法与接口方法的区别及选型建议

    深入对比Java中抽象类抽象方法与接口方法的语法演进、设计意图及运行期差异,并提供清晰的架构选型决策流程与实战范例。

    Java实现HTTP请求与JSON解析的完整代码示例
    Java实现HTTP请求与JSON解析的完整代码示例

    本文提供Java标准库HttpClient发起HTTP GET/POST请求并结合Jackson进行JSON数据反序列化与序列化的完整代码示例与工程实践指南。

    Java递归出现StackOverflowError的原因分析及栈空间优化方案
    Java递归出现StackOverflowError的原因分析及栈空间优化方案

    详细分析Java递归调用出现StackOverflowError的原因,结合代码说明线程栈、栈帧和递归深度之间的关系,并介绍终止条件排查、迭代改写、减少栈帧开销以及通过-Xss调整JVM栈空间的方法。

    Java空指针异常(NPE)的代码排查与修复实例
    Java空指针异常(NPE)的代码排查与修复实例

    针对Java中常见的NullPointerException(NPE),本文从堆栈日志定位、典型代码触发场景、具体修复代码对比到防御体系进行系统讲解,提供实用且易上手的排查与修复方案。

    selenium上传文件教程本地文件路径设置方法
    selenium上传文件教程本地文件路径设置方法

    深入解析Selenium处理文件上传的技术细节,涵盖标准HTML控件的路径直接注入法与非标准控件的系统级模拟方案,提供Windows与Linux环境下的路径设置最佳实践及常见异常排查。

    大数据开发语言选型:Java对比Scala与Python的优缺点及适用场景
    大数据开发语言选型:Java对比Scala与Python的优缺点及适用场景

    针对大数据工程场景,系统对比Java、Scala与Python在执行性能、生态结合、开发效率和维护成本上的核心差异,给出清晰的架构选型依据与落地方案。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。