tomcat7默認(rèn)參數(shù)?
Socket參數(shù)選項(xiàng):
1、TCP_NODELAY:表示立即發(fā)送數(shù)據(jù)。2、SO_RESUSEADDR:表示允許重用Socket所綁定的本地地址3、SO_TIMEOUT:表示接受數(shù)據(jù)時(shí)的超時(shí)時(shí)間。4、SO_LINGER:表示當(dāng)執(zhí)行close();方法時(shí)候,是否理解關(guān)閉底層的socket。(Reset報(bào)文)setSoLinger(true, 0): 執(zhí)行該方法,那么執(zhí)行Socket的close方法,該方法也會(huì)立即返回,但底層的Socket也會(huì)立即關(guān)閉,所有未發(fā)送完的剩余數(shù)據(jù)被丟棄setSoLinger(true, 3600): 那么執(zhí)行Socket的close方法,該方法不會(huì)立即返回,而進(jìn)入阻塞狀態(tài),同時(shí),底層的Socket也會(huì)嘗試發(fā)送剩余的數(shù)據(jù),只有滿足下面的兩個(gè)條件之一,close方法才會(huì)返回:(1):底層的Socket已經(jīng)發(fā)送完所有的剩余數(shù)據(jù)(2): 盡管底層的Socket還沒(méi)有發(fā)送完所有的剩余數(shù)據(jù),但已經(jīng)阻塞了3600秒,close()方法的阻塞時(shí)間超過(guò)3600秒,也會(huì)返回,剩余未發(fā)送的數(shù)據(jù)被丟棄。net.ipv4.TCP_tw_reuse = 1 表示開(kāi)啟重用。允許將TIME-WAIT sockets重新用于新的TCP連接,默認(rèn)為0,表示關(guān)閉;net.ipv4.tcp_tw_recycle = 1 表示開(kāi)啟TCP連接中TIME-WAIT sockets的快速回收,默認(rèn)為0,表示關(guān)閉。5、SO_SNFBUF:表示發(fā)送數(shù)據(jù)的緩沖大小6、SO_RCVBUF:表示接受數(shù)據(jù)的緩沖區(qū)的大小7、SO_KEEPALIVE:表示長(zhǎng)時(shí)間處于空閑狀態(tài)的SOCEKT,是否自動(dòng)把他/她關(guān)閉8、OOBINLINE:表示是否支持發(fā)送一個(gè)字節(jié)的TCP緊急數(shù)據(jù)默認(rèn)參數(shù)注: Connector 通常在%HOME_TOMCAT%/conf/servser.xml 文件內(nèi)# 正常參數(shù)<Connector port="8080" protocol="HTTP/1.1"
connectIOnTimeout="20000"
redirectPort="8443" />
配置參數(shù)調(diào)試# 優(yōu)化參數(shù)
<Connector port="8080"
protocol="HTTP/1.1"
maxThreads="1000"
minSpareThreads="100"
acceptCount="1000"
maxConnections="1000"
connectionTimeout="20000"
maxHttpHeaderSize="8192"
tcpNoDelay="true"
compression="on"
compressionMinSize="2048"
disableUploadTimeout="true"
redirectPort="8443"
enableLookups="false"
URIEncoding="UTF-8" />
參數(shù)詳解1)port
注:代表Tomcat端口號(hào),默認(rèn)8080。
2)protocol
注:協(xié)議類(lèi)型,可選類(lèi)型有4種,BIO(阻塞型IO),NIO,NIO2和APR。
# BIO
BIO(Blocking I/O) 阻塞式I/O操作,傳統(tǒng)的Java I/O操作(即java.io包及其子包)。Tomcat在默認(rèn)情況下,是以bio模式運(yùn)行的,bio模式是三種運(yùn)行模式中性能最低的一種。BIO配置采用默認(rèn)即可。
BIO更適合處理簡(jiǎn)單流程,如程序處理較快可以立即返回結(jié)果。簡(jiǎn)單項(xiàng)目及應(yīng)用可以采用BIO。
# NIO
NIO(New I/O)是Java SE 1.4及后續(xù)版本提供的一種新的I/O操作方式(即java.nio包及其子包)。Java nio是一個(gè)基于緩沖區(qū)、非阻塞I/O操作的Java API它擁有比傳統(tǒng)I/O操作(bio)更好的并發(fā)運(yùn)行性能。
NIO更適合后臺(tái)需要耗時(shí)完成請(qǐng)求的操作,如程序接到了請(qǐng)求后需要比較耗時(shí)的處理這已請(qǐng)求,所以無(wú)法立即返回結(jié)果,這樣如果采用BIO就會(huì)占用一個(gè)連接,而使用NIO后就可以將此連接轉(zhuǎn)讓給其他請(qǐng)求,直至程序處理完成返回為止。
# APR
APR(apache Portable Runtime/Apache可移植運(yùn)行時(shí)),是Apache HTTP服務(wù)器的支持庫(kù)。你可以簡(jiǎn)單地理解為:Tomcat將以JNI的形式調(diào)用 Apache HTTP服務(wù)器的核心動(dòng)態(tài)鏈接庫(kù)來(lái)處理文件讀取或網(wǎng)絡(luò)傳輸操作,從而大大地提高 Tomcat對(duì)靜態(tài)文件的處理性能。
APR可以大大提升Tomcat對(duì)靜態(tài)文件的處理性能,同時(shí)如果你使用了HTTPS方式傳輸?shù)脑挘部梢蕴嵘齋SL的處理性能。
# 修改方式
//BIO
protocol="HTTP/1.1"
//NIO
protocol="org.apache.coyote.http11.Http11NioProtocol"
//NIO2
protocol="org.apache.coyote.http11.Http11Nio2Protocol"
//APR
protocol="org.apache.coyote.http11.Http11AprProtocol"
3)maxThreads (線程池的大小默認(rèn)200)
注:連接器創(chuàng)建處理請(qǐng)求線程的最大數(shù)目,處理同事請(qǐng)求的最大數(shù)目,默認(rèn)值為200。
如果一個(gè)執(zhí)行器與此連接器關(guān)聯(lián),則忽略此屬性,因?yàn)樵搶傩詫⒈缓雎裕栽撨B接器將使用執(zhí)行器而不是一個(gè)內(nèi)部線程池來(lái)執(zhí)行任務(wù)。maxThreads是一個(gè)重要的配置屬性,maxThreads配置的合理直接影響了Tomcat的相關(guān)性能。maxThreads并不是配置的越大越好,事實(shí)上你即使配置成999999也是沒(méi)有用的,因?yàn)檫@個(gè)最大值是受操作系統(tǒng)及相關(guān)硬件所制約的,并且最大值并不一定是最優(yōu)值,所以我們追尋的應(yīng)該是最優(yōu)值而不是最大值。
QPS(Query Per Second):每秒查詢率QPS是對(duì)一個(gè)特定的查詢服務(wù)器在規(guī)定時(shí)間內(nèi)所處理流量多少的衡量標(biāo)準(zhǔn)。我們常常使用 QPS值來(lái)衡量一個(gè)服務(wù)器的性能。
QPS = 并發(fā)數(shù) / 平均響應(yīng)時(shí)間
并發(fā)數(shù) = QPS * 平均響應(yīng)時(shí)間
一個(gè)系統(tǒng)吞吐量通常由QPS、并發(fā)數(shù)兩個(gè)因素決定,每套系統(tǒng)的這兩個(gè)值都有一個(gè)相對(duì)極限值,在應(yīng)用場(chǎng)景訪問(wèn)壓力下,只要某一項(xiàng)達(dá)到系統(tǒng)最高值,系統(tǒng)的吞吐量就上不去了,如果壓力繼續(xù)增大,系統(tǒng)的吞吐量反而會(huì)下降,原因是系統(tǒng)超負(fù)荷工作,上下文切換、內(nèi)存等等其它消耗導(dǎo)致系統(tǒng)性能下降。所謂吞吐量這里可以理解為每秒能處理請(qǐng)求的次數(shù)。
所以選擇一個(gè)合理的 maxThreads值,其實(shí)并不是那么容易的事。因?yàn)檫^(guò)多的線程只會(huì)造成,更多的內(nèi)存開(kāi)銷(xiāo),更多的CPU開(kāi)銷(xiāo),但是對(duì)提升QPS確毫無(wú)幫助;找到最佳線程數(shù)后通過(guò)簡(jiǎn)單的設(shè)置,可以讓web系統(tǒng)更加穩(wěn)定,得到最高,最穩(wěn)定的QPS輸出。
# 獲取最佳maxThreads的最佳值
(1)通過(guò)線上系統(tǒng)不斷使用和用戶的不斷增長(zhǎng)來(lái)進(jìn)行性能測(cè)試,觀察QPS,響應(yīng)時(shí)間,這種方式會(huì)在爆發(fā)式增長(zhǎng)時(shí)系統(tǒng)崩潰,如雙12等。
(2)根據(jù)公式計(jì)算,服務(wù)器端最佳線程數(shù)量=((線程等待時(shí)間+線程cpu時(shí)間)/線程cpu時(shí)間) * cpu數(shù)量,這種方式有時(shí)會(huì)被誤導(dǎo),因?yàn)槟承┫到y(tǒng)處理環(huán)節(jié)可能會(huì)耗時(shí)比較長(zhǎng),從而影響公式的結(jié)果。
(3)單、多用戶壓力測(cè)試,查看CPU的消耗,然后直接乘以百分比,再進(jìn)行壓測(cè),一般這個(gè)值的附近應(yīng)該就是最佳線程數(shù)量,這種方式理想場(chǎng)景比較適用,實(shí)際情況會(huì)比這個(gè)復(fù)雜的多。
(4)根據(jù)系統(tǒng)的自身情況調(diào)整,如硬件限制,系統(tǒng)限制,程序處理能力限制等。
(5)定期修改為不同的 maxThreads值,看服務(wù)器響應(yīng)結(jié)果及用戶反應(yīng)。
# QPS和線程數(shù)的關(guān)系
(1)在最佳線程數(shù)量之前,QPS和線程是互相遞增的關(guān)系,線程數(shù)量到了最佳線程之后,QPS持平,不在上升,甚至略有下降,同時(shí)相應(yīng)時(shí)間持續(xù)上升。
(2)同一個(gè)系統(tǒng)而言,支持的線程數(shù)越多(最佳線程數(shù)越多而不是配置的線程數(shù)越多),QPS越高。
# QPS和響應(yīng)時(shí)間的關(guān)系
(1)對(duì)于一般的web系統(tǒng),響應(yīng)時(shí)間一般有CPU執(zhí)行時(shí)間+IO等待時(shí)間組成。
(2)CPU的執(zhí)行時(shí)間減少,對(duì)QPS有實(shí)質(zhì)的提升,IO時(shí)間的減少,對(duì)QPS提升不明顯。如果要想明顯提升QPS,優(yōu)化系統(tǒng)的時(shí)候要著重優(yōu)化CPU消耗大戶。
4)minSpareThreads
注:線程的最小運(yùn)行數(shù)目,這些始終保持運(yùn)行。如果未指定,默認(rèn)值為10。
5)acceptCount (默認(rèn)為100,ServerSocket.accept隊(duì)列,backlog:半隊(duì)列的大小)
注:最大隊(duì)列長(zhǎng)度。一般與maxThreads相同,默認(rèn)為100。
當(dāng)所有可能的請(qǐng)求處理線程都在使用時(shí)傳入連接請(qǐng)求的最大隊(duì)列長(zhǎng)度。如果未指定,默認(rèn)值為100。一般是設(shè)置的跟 maxThreads一樣或一半,此值設(shè)置的過(guò)大會(huì)導(dǎo)致排隊(duì)的請(qǐng)求超時(shí)而未被處理。所以這個(gè)值應(yīng)該是主要根據(jù)應(yīng)用的訪問(wèn)峰值與平均值來(lái)權(quán)衡配置。
6)maxConnections (NIO與NIO2的默認(rèn)值為10000,accept的Socket的大小)
注:在任何給定的時(shí)間內(nèi),服務(wù)器將接受和處理的最大連接數(shù)。當(dāng)這個(gè)數(shù)字已經(jīng)達(dá)到時(shí),服務(wù)器將接受但不處理,等待進(jìn)一步連接。NIO與NIO2的默認(rèn)值為10000,APR默認(rèn)值為8192。
7)connectionTimeout (設(shè)置到Socket.setSoTimeout(connectionTimeout ))
注:當(dāng)請(qǐng)求已經(jīng)被接受,但未被處理,也就是等待中的超時(shí)時(shí)間。單位為毫秒,默認(rèn)值為60000。通常情況下設(shè)置為30000。
8)maxHttpHeaderSize
注:請(qǐng)求和響應(yīng)的HTTP頭的最大大小,以字節(jié)為單位指定。如果沒(méi)有指定,這個(gè)屬性被設(shè)置為8192(8 KB)。
9)tcpNoDelay
注:如果為true,服務(wù)器socket會(huì)設(shè)置TCP_NO_DELAY選項(xiàng),在大多數(shù)情況下可以提高性能。缺省情況下設(shè)為true。
10)compression
注:是否啟用gzip壓縮,默認(rèn)為關(guān)閉狀態(tài)。這個(gè)參數(shù)的可接受值為“off”(不使用壓縮),“on”(壓縮文本數(shù)據(jù)),“force”(在所有的情況下強(qiáng)制壓縮)。
11)compressionMinSize
注:如果compression="on",則啟用此項(xiàng)。被壓縮前數(shù)據(jù)的最小值,也就是超過(guò)這個(gè)值后才被壓縮。如果沒(méi)有指定,這個(gè)屬性默認(rèn)為“2048”(2K),單位為byte。
12)disableUploadTimeout
注:這個(gè)標(biāo)志允許servlet Container在一個(gè)servlet執(zhí)行的時(shí)候,使用一個(gè)不同的,更長(zhǎng)的連接超時(shí)。最終的結(jié)果是給servlet更長(zhǎng)的時(shí)間以便完成其執(zhí)行,或者在數(shù)據(jù)上傳的時(shí)候更長(zhǎng)的超時(shí)時(shí)間。如果沒(méi)有指定,設(shè)為false。
13)enableLookups
注:關(guān)閉DNS反向查詢。
14)URIEncoding
注:URL編碼字符集。