您好,登錄后才能下訂單哦!
這篇文章主要講解了“java服務(wù)器容器調(diào)優(yōu)的方法是什么”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“java服務(wù)器容器調(diào)優(yōu)的方法是什么”吧!
在項(xiàng)目進(jìn)行發(fā)布之前,需要對(duì)項(xiàng)目進(jìn)行壓力測(cè)試,可以檢測(cè)出項(xiàng)目的性能問(wèn)題,比如說(shuō):項(xiàng)目響應(yīng)時(shí)間較慢,項(xiàng)目每次能解決的請(qǐng)求數(shù)較少,項(xiàng)目的瓶頸,項(xiàng)目查詢數(shù)據(jù)時(shí)間較慢等問(wèn)題,檢測(cè)出來(lái)之后,就需要調(diào)優(yōu),意思就是說(shuō)你的項(xiàng)目接口如果響應(yīng)時(shí)間超過(guò)了十秒,還不做出一系列措施,那么這個(gè)項(xiàng)目就是有問(wèn)題的,性能調(diào)優(yōu)的目的就是為了使得項(xiàng)目更優(yōu)化,RT(運(yùn)行響應(yīng)時(shí)間)跟小,TPS(吞吐量-》每秒從數(shù)據(jù)庫(kù)接收的請(qǐng)求量)更大等等。
一般在企業(yè)中呢會(huì)使用JMeter或者K8s,部分企業(yè)會(huì)搭建自己的壓測(cè)平臺(tái),在項(xiàng)目寫好之后對(duì)項(xiàng)目進(jìn)行壓測(cè),在定項(xiàng)目的時(shí)候會(huì)對(duì)項(xiàng)目的響應(yīng)時(shí)間做要求,對(duì)項(xiàng)目的請(qǐng)求數(shù)據(jù)做一個(gè)大概的判斷,開(kāi)發(fā)人員就要根據(jù)這些要求編寫接口,如果接口響應(yīng)時(shí)間超過(guò)了既定數(shù)據(jù),項(xiàng)目支撐不了這么大的請(qǐng)求,就需要對(duì)項(xiàng)目以及項(xiàng)目接口進(jìn)行數(shù)據(jù)庫(kù)、容器、緩存等方面的調(diào)優(yōu)。
maxThreads最大線程數(shù):衡量web服務(wù)器,同時(shí)處理任務(wù)的數(shù)量
accept-count最大等待數(shù):隊(duì)列最大能接受的等待數(shù)量。超過(guò)拒絕請(qǐng)求。
Max Connections最大鏈接數(shù):同一時(shí)間最大的連接數(shù)量。
當(dāng)鏈接數(shù)量最大的時(shí)候還會(huì)繼續(xù)請(qǐng)求,進(jìn)入等待,超過(guò)最大等待就會(huì)拒絕。
SpringBoot中的最大線程數(shù)是200,在很多情況下最大線程數(shù)200是不夠的,一般而言1cpu2G的服務(wù)器配置設(shè)置為200,4cpu8G的服務(wù)器配置設(shè)置為800,可以大大提高TPS,降低RT。
修改配置文件application.yml
# Tomcat的 maxConnections、maxThreads、acceptCount三大配置, #分別表示最大連接數(shù),最大線程數(shù)、最大的等待數(shù),可以通過(guò)application.yml配置文件來(lái)改變這個(gè)三個(gè)值,一個(gè)標(biāo) #準(zhǔn)的示例如下: server.tomcat.uri-encoding: UTF-8 # 思考問(wèn)題:一臺(tái)服務(wù)器配置多少線程合適? server.tomcat.accept-count: 1000 # 等待隊(duì)列最多允許1000個(gè)請(qǐng)求在隊(duì)列中等待 server.tomcat.max-connections: 20000 # 最大允許20000個(gè)鏈接被建立 ## 最大工作線程數(shù),默認(rèn)200, 4核8g內(nèi)存,線程數(shù)經(jīng)驗(yàn)值800 server.tomcat.threads.max: 800 # 并發(fā)處理創(chuàng)建的最大的線程數(shù)量 server.tomcat.threads.min-spare: 100 # 最大空閑連接數(shù),防止突發(fā)流量
修改配置要確認(rèn)生效。
可使用SpringBoot中的配置,剛剛的配置文件中再加上
# 暴露所有的監(jiān)控點(diǎn) management.endpoints.web.exposure.include: '*' # 定義Actuator訪問(wèn)路徑 management.endpoints.web.base-path: /actuator # 開(kāi)啟endpoint 關(guān)閉服務(wù)功能 management.endpoint.shutdown.enabled: true
檢測(cè)配置生效:ip:端口/actuator
搜索tomcat
網(wǎng)絡(luò)io即系統(tǒng)文件讀寫io,系統(tǒng)里邊使用的是NIO(高性能,同步,非阻塞),其實(shí)已經(jīng)默認(rèn)嵌入NIO2(超高性能,異步,非阻塞)但是需要調(diào)用NIO2的api就可以,但是這部分呢是根據(jù)系統(tǒng)來(lái)的,AIO(NIO2)取決于操作系統(tǒng),比如linux就支持AIO
其實(shí)AIO就是NIO的一個(gè)優(yōu)化,增強(qiáng)對(duì)文件處理和文件系統(tǒng)特性的支持。系統(tǒng)使用AIO之后,響應(yīng)時(shí)間會(huì)降低且穩(wěn)定。
直接放進(jìn)項(xiàng)目代碼里邊java類,生成一個(gè)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(); //等待隊(duì)列最多允許1000個(gè)線程在隊(duì)列中等待 nio2Protocol.setAcceptCount(1000); // 設(shè)置最大線程數(shù) nio2Protocol.setMaxThreads(1000); // 設(shè)置最大連接數(shù) nio2Protocol.setMaxConnections(20000); //定制化keepalivetimeout,設(shè)置30秒內(nèi)沒(méi)有請(qǐng)求則服務(wù)端自動(dòng)斷開(kāi)keepalive鏈接 nio2Protocol.setKeepAliveTimeout(30000); //當(dāng)客戶端發(fā)送超過(guò)10000個(gè)請(qǐng)求則自動(dòng)斷開(kāi)keepalive鏈接 nio2Protocol.setMaxKeepAliveRequests(10000); // 請(qǐng)求方式 connector.setScheme("http"); connector.setPort(9003); //自定義的端口,與源端口9001可以共用,知識(shí)改了連接器而已 connector.setRedirectPort(8443); return connector; } }
檢測(cè)配置生效:ip:9003/調(diào)用接口
說(shuō)明:tomcat還有一種模式叫apr,自動(dòng)開(kāi)啟aio,上邊用的是另一種方式,但是一般不會(huì)通過(guò)這個(gè)來(lái)調(diào)優(yōu),這部分只是做一個(gè)初步了解,因?yàn)椴皇撬邢到y(tǒng)都支持AIO
眾所周知,SpringBoot中已經(jīng)嵌入了Tomcat,但是其實(shí)SpringBoot內(nèi)嵌了三種服務(wù)器:Tomcat(成熟、穩(wěn)定、高性能服務(wù)器),apache開(kāi)發(fā)、Jetty(輕量級(jí),快速靈活)、Undertwo(高性能,靈活性高)。
在 Spring Boot 中,默認(rèn)使用的是 Tomcat 作為內(nèi)置的 Web 服務(wù)器,也可以在配置文件中進(jìn)行相應(yīng)的配置,選擇使用 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
導(dǎo)入其他容器的starter
<!--導(dǎo)入undertow容器依賴--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-undertow</artifactId> </dependency>
配置
# 設(shè)置IO線程數(shù), 它主要執(zhí)行非阻塞的任務(wù),它們會(huì)負(fù)責(zé)多個(gè)連接 server.undertow.threads.io: 800 # 阻塞任務(wù)線程池, 當(dāng)執(zhí)行類似servlet請(qǐng)求阻塞IO操作, undertow會(huì)從這個(gè)線程池中取得線程 # 默認(rèn)值是IO線程數(shù)*8 server.undertow.threads.worker: 8000 # 以下的配置會(huì)影響buffer,這些buffer會(huì)用于服務(wù)器連接的IO操作,有點(diǎn)類似netty的池化內(nèi)存管理 # 每塊buffer的空間大小越小,空間就被利用的越充分,不要設(shè)置太大,以免影響其他應(yīng)用,合適即可 server.undertow.buffer-size: 1024 # 每個(gè)區(qū)分配的buffer數(shù)量 , 所以pool的大小是buffer-size * buffers-per-region # 是否分配的直接內(nèi)存(NIO直接分配的堆外內(nèi)存) server.undertow.direct-buffers: true
感謝各位的閱讀,以上就是“java服務(wù)器容器調(diào)優(yōu)的方法是什么”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)java服務(wù)器容器調(diào)優(yōu)的方法是什么這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。