首頁  >  文章  >  Java  >  java伺服器容器調優的方法是什麼

java伺服器容器調優的方法是什麼

WBOY
WBOY轉載
2023-05-11 23:37:041066瀏覽

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

以上是java伺服器容器調優的方法是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除