你將面臨的tomcat優(yōu)化2-----線程池-IO優(yōu)化

知識(shí)補(bǔ)充:

同步 : 自己親自出馬持銀行卡到銀行取錢(使用同步IO時(shí),Java自己處理IO讀寫)。

異步 : 委托一小弟拿銀行卡到銀行取錢,然后給你(使用異步IO時(shí)肾砂,Java將IO讀寫委托給OS處理,需要將數(shù)據(jù)緩沖區(qū)地址和大小傳給OS(銀行卡和密碼)宏悦,OS需要支持異步IO操作API)镐确。

阻塞 : ATM排隊(duì)取款,你只能等待(使用阻塞IO時(shí)饼煞,Java調(diào)用會(huì)一直阻塞到讀寫完成才返回)源葫。

非阻塞 : 柜臺(tái)取款,取個(gè)號(hào)砖瞧,然后坐在椅子上做其它事息堂,等號(hào)廣播會(huì)通知你辦理,沒(méi)到號(hào)你就不能去块促,你可以不斷問(wèn)大堂經(jīng)理排到了沒(méi)有荣堰,大堂經(jīng)理如果說(shuō)還沒(méi)到你就不能去(使用非阻塞IO時(shí),如果不能讀寫Java調(diào)用會(huì)馬上返回竭翠,當(dāng)IO事件分發(fā)器會(huì)通知可讀寫時(shí)再繼續(xù)進(jìn)行讀寫振坚,不斷循環(huán)直到讀寫完成)。

一.線程池的介紹

線程池作為提高程序處理數(shù)據(jù)能力的一種方案斋扰,應(yīng)用非常廣泛渡八。大量的服務(wù)器都或多或少的使用到了線程池技術(shù)啃洋,不管是哪種語(yǔ)言實(shí)現(xiàn),線程池都有如下的特點(diǎn):

1.線程池一般有三個(gè)重要參數(shù):

最大線程數(shù)呀狼。在程序運(yùn)行的任何時(shí)候,線程數(shù)總數(shù)都不會(huì)超過(guò)這個(gè)數(shù)损离。如果請(qǐng)求數(shù)量超過(guò)最大數(shù)時(shí)哥艇,則會(huì)等待其他線程結(jié)束后再處理。

最大共享線程數(shù)僻澎,即最大空閑線程數(shù)貌踏。如果當(dāng)前的空閑線程數(shù)超過(guò)該值,則多余的線程會(huì)被殺掉窟勃。

最小共享線程數(shù)祖乳,即最小空閑線程數(shù)。如果當(dāng)前的空閑數(shù)小于該值秉氧,則一次性創(chuàng)建這個(gè)數(shù)量的空閑線程眷昆,所以它本身也是一個(gè)創(chuàng)建線程的步長(zhǎng)。?

2.線程池有兩個(gè)概念

Worker線程:工作線程主要是運(yùn)行執(zhí)行代碼汁咏,有兩種狀態(tài):空閑狀態(tài)和運(yùn)行狀態(tài)亚斋。在空閑狀態(tài)時(shí),類似“休眠”攘滩,等待任務(wù)帅刊;處理運(yùn)行狀態(tài)時(shí),表示正在運(yùn)行任務(wù)(Runnable)漂问。

輔助線程:主要負(fù)責(zé)監(jiān)控線程池的狀態(tài):空閑線程是否超過(guò)最大空閑線程數(shù)或者小于最小空閑線程數(shù)等赖瞒。如果不滿足要求,就調(diào)整之蚤假。

二.線程池的原理(類似于操作系統(tǒng)中緩存的概念):

先啟動(dòng)若干數(shù)量的線程栏饮,并讓這些線程都處于睡眠 狀態(tài),當(dāng)客戶端有一個(gè)新請(qǐng)求時(shí)磷仰,就會(huì)喚醒線程池中的某一個(gè)睡眠線程抡爹,讓它來(lái)處理客戶端的這個(gè)請(qǐng)求,當(dāng)處理完這個(gè)請(qǐng)求后芒划,線程又處于睡眠狀態(tài)冬竟。

為什么要搞得這么麻煩,如果每當(dāng)客戶端有新的請(qǐng)求時(shí)民逼,我就創(chuàng)建一個(gè)新的線程不就完了泵殴?這也許是個(gè)不錯(cuò)的方法,因?yàn)樗苁沟媚憔帉懘a相對(duì)容易一些拼苍,但 你卻忽略了一個(gè)重要的問(wèn)題??性能笑诅!高峰期每秒的客戶端請(qǐng)求并發(fā)數(shù)超過(guò)100调缨,如果 為每個(gè)客戶端請(qǐng)求創(chuàng)建一個(gè)新線程的話,那耗費(fèi)的CPU時(shí)間和內(nèi)存將是驚人的吆你,如果采用一個(gè)擁有200個(gè)線程的線程池弦叶,那將會(huì)節(jié)約大量的的系統(tǒng)資源,使得更 多的CPU時(shí)間和內(nèi)存用來(lái)處理實(shí)際的商業(yè)應(yīng)用妇多,而不是頻繁的線程創(chuàng)建與銷毀伤哺。?

三.tomcat線程池的配置(使用線程池,用較少的線程處理較多的訪問(wèn)者祖,提高tomcat的處理能力):

1.vim tomcat/conf/server.xml

將注釋的線程池打開(kāi):

<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"

? ? ? ? maxThreads="500" minSpareThreads="5" maxIdleTime="60000" prestartminSpareThreads="true" maxQueueSize="100"?/>

參數(shù)詳情介紹:

name: 線程名稱

namePrefix: 線程前綴

maxThreads : 最大并發(fā)連接數(shù),不配置時(shí)默認(rèn)200,一般建議設(shè)置500~ 800 ,要根據(jù)自己的硬件設(shè)施條件和實(shí)際業(yè)務(wù)需求而定立莉。?

minSpareThreads:Tomcat啟動(dòng)初始化的線程數(shù),默認(rèn)值25

maxSpareThreads:最多備用線程數(shù)七问,一旦創(chuàng)建的線程超過(guò)這個(gè)值蜓耻,Tomcat就會(huì)關(guān)閉不再需要的socket線程

prestartminSpareThreads:在tomcat初始化的時(shí)候就初始化minSpareThreads的值,不設(shè)置為true

maxQueueSize: 最大的等待隊(duì)列數(shù),超過(guò)則拒絕請(qǐng)求

maxIdleTime:默認(rèn)線程最大空閑時(shí)間60秒。?如果一個(gè)線程在60秒以內(nèi)沒(méi)有活躍械巡,則終止運(yùn)行并從線程池中移除刹淌。除非線程池?cái)?shù)量小于或等于minSpareThreads數(shù)量

2.<Connector executor="tomcatThreadPool" port="8080" protocol="HTTP/1.1"

? ? ? ? ? ? ? connectionTimeout="20000"?enableLookups="false"? ??acceptCount="100"? ?maxPostSize="10485760"??compression="on"??compressionMinSize="2048"??

????????noCompressionUserAgents="gozilla, traviata"??

compressableMimeType="text/html,text/xml,text/plain,text/css,text/javascript,application/javascript"??

? ? ? ? ? ? ? redirectPort="8443" />

1)需要添加線程池的名稱-----executor="tomcatThreadPool"

以上線程池配置修改成功,需要重新啟動(dòng)tomcat讥耗。

Tomcat的并發(fā)請(qǐng)求處理數(shù)量=maxThreads + acceptCount

參數(shù)介紹:

executor:線程池的名稱

port:連接端口

protocol:協(xié)議 --->bio,nio,apr(下面會(huì)詳細(xì)介紹)

enableLookups:禁止DNS查詢

acceptCount:指定當(dāng)所有可以使用的處理請(qǐng)求的線程數(shù)都被使用時(shí)芦鳍,可以放到處理隊(duì)列中的請(qǐng)求數(shù),超過(guò)這個(gè)數(shù)的請(qǐng)求將不予處理葛账,默認(rèn)設(shè)置 100?

maxPostSize:限制 以FORM URL 參數(shù)方式的POST請(qǐng)求的內(nèi)容大小柠衅,單位字節(jié),默認(rèn)是 2097152(2兆)籍琳,10485760 為 10M菲宴。?

緩存優(yōu)化:

?compression:壓縮傳輸,壓縮會(huì)增加Tomcat負(fù)擔(dān)趋急,最好采用Nginx + Tomcat 或者 Apache + Tomcat 方式喝峦,壓縮交由Nginx/Apache 去做

compressionMinSize:壓縮的大小

noCompressionUserAgents:不啟用壓縮的瀏覽器 ,gozilla, traviata

compressableMimeType:壓縮文件類型

URIEncoding URL統(tǒng)一編碼

壓縮小計(jì):Tomcat 的壓縮是在客戶端請(qǐng)求服務(wù)器對(duì)應(yīng)資源后呜达,從服務(wù)器端將資源文件壓縮谣蠢,再輸出到客戶端,由客戶端的瀏覽器負(fù)責(zé)解壓縮并瀏覽查近。相對(duì)于普通的 瀏覽過(guò)程 HTML眉踱、CSS、Javascript和Text霜威,它可以節(jié)省40% 左右的流量谈喳。更為重要的是,它可以對(duì)動(dòng)態(tài)生成的戈泼,包括CGI婿禽、PHP赏僧、JSP、ASP扭倾、Servlet,SHTML等輸出的網(wǎng)頁(yè)也能進(jìn)行壓縮淀零,壓縮效率也很高。

四.tomcat3種運(yùn)行模式(即配置文件中的協(xié)議):

1.bio---------配置的內(nèi)容:HTTP/1.1

同步阻塞IO(JAVA BIO):同步并阻塞膛壹,服務(wù)器實(shí)現(xiàn)模式為一個(gè)連接一個(gè)線程(one connection one thread 想想都覺(jué)得恐怖,線程可是非常寶貴的資源)驾中,當(dāng)然可以通過(guò)線程池機(jī)制改善.默認(rèn)模式,性能非常低下恢筝,沒(méi)有經(jīng)過(guò)任何優(yōu)化處理

BIO方式適用于連接數(shù)目比較小且固定的架構(gòu)哀卫,這種方式對(duì)服務(wù)器資源要求比較高巨坊,并發(fā)局限于應(yīng)用中撬槽,JDK1.4以前的唯一選擇,但程序直觀簡(jiǎn)單易理解

2.nio

是Java SE 1.4及后續(xù)版本提供的一種新的I/O操作方式(即java.nio包及其子包)趾撵。Java nio是一個(gè)基于緩沖區(qū)侄柔、并能提供非阻塞I/O操作的Java API,因此nio也被看成是non-blocking I/O的縮寫占调。它擁有比傳統(tǒng)I/O操作(bio)更好的并發(fā)運(yùn)行性能

nio---->org.apache.coyote.http11.Http11NioProtocol

JAVA NIO:又分為同步非阻塞IO,異步阻塞IO 與BIO最大的區(qū)別one request one thread.可以復(fù)用同一個(gè)線程處理多個(gè)connection(多路復(fù)用)

NIO方式適用于連接數(shù)目多且連接比較短(輕操作)的架構(gòu)暂题,比如聊天服務(wù)器,并發(fā)局限于應(yīng)用中究珊,編程比較復(fù)雜薪者,JDK1.4開(kāi)始支持

nio2---->org.apache.coyote.http11.Http11Nio2Protocol

異步非阻塞IO(Java NIO2又叫AIO) 主要與NIO的區(qū)別主要是操作系統(tǒng)的底層區(qū)別.可以做個(gè)比喻:比作快遞,NIO就是網(wǎng)購(gòu)后要自己到官網(wǎng)查下快遞是否已經(jīng)到了(可能是多次)剿涮,然后自己去取快遞言津;AIO就是快遞員送貨上門了(不用關(guān)注快遞進(jìn)度)。

AIO方式使用于連接數(shù)目多且連接比較長(zhǎng)(重操作)的架構(gòu)

3.apr-------->Http11AprProtocol:

?APR是從操作系統(tǒng)級(jí)別來(lái)解決異步的IO問(wèn)題,大幅度的提高性能.

APR(Apache Portable Runtime)是一個(gè)高可移植庫(kù),它是Apache HTTP Server 2.x的核心.能更好地和其它本地web技術(shù)集成取试,總體上讓Java更有效率作為一個(gè)高性能web服務(wù)器平臺(tái)而不是簡(jiǎn)單作為后臺(tái)容器.

在產(chǎn)品環(huán)境中悬槽,特別是直接使用Tomcat做WEB服務(wù)器的時(shí)候,應(yīng)該使用Tomcat Native來(lái)提高其性能.如果不配APR瞬浓,基本上300個(gè)線程狠快就會(huì)用滿初婆,以后的請(qǐng)求就只好等待.但是配上APR之后,并發(fā)的線程數(shù)量明顯下降猿棉,從原來(lái)的300可能會(huì)馬上下降到只有幾十磅叛,新的請(qǐng)求會(huì)毫無(wú)阻塞的進(jìn)來(lái).

在局域網(wǎng)環(huán)境測(cè),就算是400個(gè)并發(fā)萨赁,也是一瞬間就處理/傳輸完畢宪躯,但是在真實(shí)的Internet環(huán)境下,頁(yè)面處理時(shí)間只占0.1%都不到位迂,絕大部分時(shí)間都用來(lái)頁(yè)面?zhèn)鬏?如果不用APR访雪,一個(gè)線程同一時(shí)間只能處理一個(gè)用戶详瑞,勢(shì)必會(huì)造成阻塞。所以生產(chǎn)環(huán)境下用apr是非常必要的.

4.apr連接器的安裝:

軟件安裝:

apr 安裝

tar zxf apr-1.5.2.tar.gz -C /usr/local/src/

cd /usr/local/src/apr-1.5.2/

./configure --prefix=/usr/local/apr && make && make install

apr-utils 安裝

tar zxf apr-util-1.5.4.tar.gz -C /usr/local/src/

cd /usr/local/src/apr-util-1.5.4/

./configure --with-apr=/usr/local/apr/ --prefix=/usr/local/apr-utils && make && make install

tomcat-native安裝

cd /usr/local/apache-tomcat-7.0.65/bin/

tar zxf tomcat-native.tar.gz

cd tomcat-native-1.1.33-src/jni/native

./configure --with-apr=/usr/local/apr --with-java-home=/usr/local/java/ && make && make install

安裝完后記得在 /etc/profile 的JAVA變量后面多加一條APR的環(huán)境變量:

export? PATH=$PATH:/usr/loacl/apr/lib

配置修改:

<Connector executor="tomcatThreadPool" port="8080" protocol="org.apache.coyote.http11.Http11AprProtocol"

? ? ? ? ? ? ? connectionTimeout="20000"? ?redirectPort="8443" />

5.連接器的比較

連接器的比較
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末臣缀,一起剝皮案震驚了整個(gè)濱河市坝橡,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌精置,老刑警劉巖计寇,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異脂倦,居然都是意外死亡番宁,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門赖阻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)蝶押,“玉大人,你說(shuō)我怎么就攤上這事火欧∑宓纾” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵苇侵,是天一觀的道長(zhǎng)赶盔。 經(jīng)常有香客問(wèn)我,道長(zhǎng)榆浓,這世上最難降的妖魔是什么于未? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮陡鹃,結(jié)果婚禮上烘浦,老公的妹妹穿的比我還像新娘。我一直安慰自己杉适,他們只是感情好谎倔,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著猿推,像睡著了一般片习。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蹬叭,一...
    開(kāi)封第一講書(shū)人閱讀 49,079評(píng)論 1 285
  • 那天藕咏,我揣著相機(jī)與錄音,去河邊找鬼秽五。 笑死孽查,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的坦喘。 我是一名探鬼主播盲再,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼西设,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了答朋?” 一聲冷哼從身側(cè)響起贷揽,我...
    開(kāi)封第一講書(shū)人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎梦碗,沒(méi)想到半個(gè)月后禽绪,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡洪规,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年印屁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片斩例。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡雄人,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出樱拴,到底是詐尸還是另有隱情柠衍,我是刑警寧澤洋满,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布晶乔,位于F島的核電站,受9級(jí)特大地震影響牺勾,放射性物質(zhì)發(fā)生泄漏正罢。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一驻民、第九天 我趴在偏房一處隱蔽的房頂上張望翻具。 院中可真熱鬧,春花似錦回还、人聲如沸裆泳。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)工禾。三九已至,卻和暖如春蝗柔,著一層夾襖步出監(jiān)牢的瞬間闻葵,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工癣丧, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留槽畔,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓胁编,卻偏偏與公主長(zhǎng)得像厢钧,于是被迫代替她去往敵國(guó)和親鳞尔。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)自:http://www.cnblogs.com/kismetv/p/7806063.html 前言 在使用to...
    賴小賴gogogo閱讀 806評(píng)論 0 2
  • 前言 在使用tomcat時(shí)早直,經(jīng)常會(huì)遇到連接數(shù)铅檩、線程數(shù)之類的配置問(wèn)題,要真正理解這些概念莽鸿,必須先了解Tomcat的連...
    shaolin79閱讀 769評(píng)論 0 0
  • 小學(xué)的時(shí)候?qū)W過(guò)一篇課文昧旨,題目是《狼來(lái)了》,當(dāng)時(shí)還小不懂得這篇課文到底是什么意思祥得,只是覺(jué)得那個(gè)調(diào)皮的小男孩挺可憐的兔沃,...
    今天安好閱讀 1,559評(píng)論 0 0
  • 每個(gè)人都經(jīng)歷過(guò)刻骨銘心的愛(ài)情。同樣也經(jīng)歷過(guò)撕心裂肺的分離级及。我沒(méi)什么文化寫不出什么好的文章乒疏。我從小學(xué)寫作文就跑題。一...
    肚臍兒眼閱讀 339評(píng)論 0 0
  • 文/數(shù)數(shù)饮焦。 對(duì)于梅蘭芳先生的故事怕吴,以前知道得模棱兩可。只是知道他是很高的京劇藝術(shù)家县踢,舞臺(tái)上男扮女裝演出转绷,僅此而已。...
    數(shù)數(shù)0閱讀 251評(píng)論 0 0