1. 程式人生 > >Tomcat記錄-tomcat常用配置詳解和優化方法

Tomcat記錄-tomcat常用配置詳解和優化方法

convert coder erro user 新生代 數值 classes art down

常用配置詳解

1 目錄結構
/bin:腳本文件目錄。
/common/lib:存放所有web項目都可以訪問的公共jar包(使用Common類加載器加載)。
/conf:存放配置文件,最重要的是server.xml。
/logs:存放日誌文件。
/server/webapps:來管理Tomcat-web服務用的。僅對TOMCAT可見,對所有的WEB APP都不可見(使用Catalina類加載器加載)。
/shared/lib:僅對所有WEB APP可見,對TOMCAT不可見(使用Shared類加載器加載)。
/temp:Tomcat運行時候存放臨時文件用的。
/webapps:web應用發布目錄。
/work:Tomcat把各種由jsp生成的servlet文件放在這個目錄下。刪除後,啟動時會自動創建。



2 配置文件
server.xml:主要的配置文件。
web.xml:缺省的web app配置,WEB-INF/web.xml會覆蓋該配置。
context.xml:不清楚跟server.xml裏面的context是否有關系。

server.xml配置
server標簽
port:指定一個端口,這個端口負責監聽關閉tomcat的請求。
shutdown:指定向端口發送的命令字符串。

service標簽
name:指定service的名字。

Connector(表示客戶端和service之間的連接)標簽

port:指定服務器端要創建的端口號,並在這個端口監聽來自客戶端的請求。
minProcessors:服務器啟動時創建的處理請求的線程數。


maxProcessors:最大可以創建的處理請求的線程數。
enableLookups:如果為true,則可以通過調用request.getRemoteHost()進行DNS查詢來得到遠程客戶端的實際主機名,若為false則不進行DNS查詢,而是返回其ip地址。
redirectPort:指定服務器正在處理http請求時收到了一個SSL傳輸請求後重定向的端口號。
acceptCount:指定當所有可以使用的處理請求的線程數都被使用時,可以放到處理隊列中的請求數,超過這個數的請求將不予處理。
connectionTimeout:指定超時的時間數(以毫秒為單位)。

Engine(表示指定service中的請求處理機,接收和處理來自Connector的請求)標簽

defaultHost:指定缺省的處理請求的主機名,它至少與其中的一個host元素的name屬性值是一樣的。

Context(表示一個web應用程序,通常為WAR文件,關於WAR的具體信息見servlet規範)標簽
docBase:該web應用的文檔基準目錄(Document Base,也稱為Context Root),或者是WAR文件的路徑。可以使用絕對路徑,也可以使用相對於context所屬的Host的appBase路徑。
path:表示此web應用程序的url的前綴,這樣請求的url為http://localhost:8080/path/****。
reloadable:這個屬性非常重要,如果為true,則tomcat會自動檢測應用程序的/WEB-INF/lib和/WEB-INF/classes目錄的變化,自動裝載新的應用程序,我們可以在不重起tomcat的情況下改變應用程序。
useNaming:如果希望Catalina為該web應用使能一個JNDI InitialContext對象,設為true。該InitialialContext符合J2EE平臺的約定,缺省值為true。
workDir:Context提供的臨時目錄的路徑,用於servlet的臨時讀/寫。利用javax.servlet.context.tempdir屬性,servlet可以訪問該目錄。如果沒有指定,使用$CATALINA_HOME/work下一個合適的目錄。
swallowOutput:如果該值為true,System.out和System.err的輸出被重定向到web應用的logger。如果沒有指定,缺省值為false
debug:與這個Engine關聯的Logger記錄的調試信息的詳細程度。數字越大,輸出越詳細。如果沒有指定,缺省為0。

host(表示一個虛擬主機)標簽
name:指定主機名。
appBase:應用程序基本目錄,即存放應用程序的目錄。
unpackWARs:如果為true,則tomcat會自動將WAR文件解壓,否則不解壓,直接從WAR文件中運行應用程序。

Logger(表示日誌,調試和錯誤信息)標簽
className:指定logger使用的類名,此類必須實現org.apache.catalina.Logger接口。
prefix:指定log文件的前綴。
suffix:指定log文件的後綴。
timestamp:如果為true,則log文件名中要加入時間,如下例:localhost_log.2001-10-04.txt。

Realm(表示存放用戶名,密碼及role的數據庫)標簽
className:指定Realm使用的類名,此類必須實現org.apache.catalina.Realm接口。

Valve(功能與Logger差不多,其prefix和suffix屬性解釋和Logger 中的一樣)標簽
className:指定Valve使用的類名,如用org.apache.catalina.valves.AccessLogValve類可以記錄應用程序的訪問信息。
directory:指定log文件存放的位置。
pattern:有兩個值,common方式記錄遠程主機名或ip地址,用戶名,日期,第一行請求的字符串,HTTP響應代碼,發送的字節數。combined方式比common方式記錄的值更多。

3 配置虛擬目錄
1)直接部署到webapps目錄下面訪問。
2)修改conf/server.xml文件。在<Host name="localhost" appBase="webapps" unpackWARs="true" xmlValidation="false" xmlNamespaceAware="false"></host>中加入<Context path="/test" docBase="webdemo" debug="0" reloadable="true" />。docBase目錄默認使用appBase="webapps"這個目錄。也可以是絕對路徑。
配置主目錄,可以將path=""。
3)當項目沒有放在webapps目錄下時,可以在conf/Catalina/localhost新建一個XXX.XML文件。裏面加入<Context docBase="E:webdemo" debug="0" reloadable="true" />。
註意:這裏的path屬性不需要設置,設置了也不會起作用的。
也可以使用該方法建立主目錄指向另一個目錄,例如:<Context docBase="E:webdemo" debug="0" reloadable="true" />命名為ROOT.xml,這樣默認訪問的主目錄就被修改過了。

4 配置連接數
maxThreads:Tomcat使用線程來處理接收的每個請求。這個值表示Tomcat可創建的最大的線程數。
acceptCount:指定當所有可以使用的處理請求的線程數都被使用時,可以放到處理隊列中的請求數,超過這個數的請求將不予處理。
minSpareThreads:Tomcat初始化時創建的線程數。
maxSpareThreads:一旦創建的線程超過這個值,Tomcat就會關閉不再需要的socket線程。
enableLookups:是否反查域名,取值為:true或false。為了提高處理能力,應設置為false
connectionTimeout:網絡連接超時,單位:毫秒。設置為0表示永不超時,這樣設置有隱患的。默認可設置為20000毫秒。

web server允許的最大連接數還受制於操作系統的內核參數設置,通常Windows是2000個左右,Linux是1000個左右。

5 配置內存大小
修改bin/catalina.bat中的set CATALINA_OPTS=-Xms64m -Xmx128m。
Xms指最小內存,Xmx指最大內存。

6 安全配置
1)將<Server port="8005" shutdown="SHUTDOWN">SHUTDOWN修改為其他一些字符串。否則就容易被人給停止掉了。

2)對應tomcat3.1中,屏蔽目錄文件自動列出
修改conf/web.xml中的
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>true</param-value><!-- 改成false -->
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>

3)訪問日誌設置
在server.xml中加入
<Valve className="org.apache.catalina.valves.AccessLogValve"
directory="logs" prefix="localhost_access_log." suffix=".txt"
pattern="common" resolveHosts="false"/>
這樣訪問日誌會記錄到Logs中。

4)修改用戶名、密碼
conf/tomcat-users.xml

5)屏蔽後臺管理入口
方法一:從控制用戶和權限著手。廢掉要管理權限的用戶就可以了。
方法二:將conf/Catalina/localhost/manager.xml改名。

6)配置403,404,500錯誤頁面
默認情況下,報出HTTP錯誤的時候會暴露tomcat版本號。如果不想暴露的話,就需要重新定義錯誤跳轉頁面。
<error-page>
<error-code>401</error-code>
<location>/401.jsp</location>
</error-page>
<error-page>
<error-code>404</error-code>
<location>/404.jsp</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/500.jsp</location>
</error-page>

註意:在測試的時候碰到一個奇怪的現象,平時項目裏面的時候測試正常的。可是今天在tomcat目錄裏面新建一個測試目錄測試並不能跳轉到指定錯誤頁面。暫時不知道為什麽。

7 配置Log4j日誌記錄
項目中拋出的異常,拋到tomcat中的異常會被tomcat記錄下來,存放至logs/localhost.yyyy-MM-dd.log文件中。
平時我們在項目中使用的log4j記錄日誌跟tomcat是沒有任何關系的,是獨立的一個程序,記錄的文件是自定義的。
我們可以在tomcat中定義一個log4j的公共日誌處理方式,這樣在項目中就不需要在定義log4j的配置了。
1)將log4j-1.2.15.jar加入到commonlib目錄。
2)將log4j.properties加入到commonclasses目錄。
內容例如:
# Output pattern : date [thread] priority category - message
log4j.rootLogger=DEUBG, stdout, logfile

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n

log4j.appender.logfile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.logfile.File=${catalina.home}/logs/tomcat_app.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n

#3rd party library level
log4j.logger.org.hibernate.cache=ERROR

註意:我們項目中使用e.printStackTrace();輸出的異常會在控制臺輸出來,但是,不會記錄到tomcat日誌中。
而且,也不會記錄到log4j的日誌中。要想記錄到log4j日誌中,必須使用log4j輸出來。
所以,實際上web項目中進行異常處理應該將e.printStackTrace();寫寫法多改成log4j的形式才對!
但是,實際項目中很多項目多偷懶使用了e.printStackTrace();方式輸出異常。當出現異常的時候在控制臺上查看一下就可以了,也不考慮實際運行時候的維護。假如有人不小心關了控制臺,那麽,你不就看不到異常了嗎?
個人介意使用log4j的形式記入web異常!

8 Tomcat5亂碼問題
Tomcat5跟Tomcat4對參數處理是不一樣的,在Tomcat4中get與post的編碼是一樣的,所以只要在過濾器中通過request.setCharacterEncoding()設定一次就可以解決get與set的問題。然而,在Tomcat5中,get與post的處理是分開的,對get請求使用URIEncoding進行處理,對post使用request.setCharacterEncoding()處理。Tomcat5中,在server.xml的Connector元素增加了以下配置參數:
URIEncoding:用來設定通過URI傳遞的

tomcat優化配置參數

優化內存,主要是在bin/catalina.bat/sh 配置文件中進行。linux上,在catalina.sh中添加:

JAVA_OPTS="-server -Xms1G -Xmx2G -Xss256K -Djava.awt.headless=true -Dfile.encoding=utf-8 -XX:MaxPermSize=256m -XX:PermSize=128M -XX:MaxPermSize=256M"

其中:

? -server:啟用jdk的server版本。
? -Xms:虛擬機初始化時的最小堆內存。
? -Xmx:虛擬機可使用的最大堆內存。 #-Xms與-Xmx設成一樣的值,避免JVM因為頻繁的GC導致性能大起大落
? -XX:PermSize:設置非堆內存初始值,默認是物理內存的1/64。
? -XX:MaxNewSize:新生代占整個堆內存的最大值。
? -XX:MaxPermSize:Perm(俗稱方法區)占整個堆內存的最大值,也稱內存最大永久保留區域。

1)錯誤提示:java.lang.OutOfMemoryError:Java heap space

Tomcat默認可以使用的內存為128MB,在較大型的應用項目中,這點內存是不夠的,有可能導致系統無法運行。常見的問題是報Tomcat內存溢出錯誤,Outof Memory(系統內存不足)的異常,從而導致客戶端顯示500錯誤,一般調整Tomcat的-Xms和-Xmx即可解決問題,通常將-Xms和-Xmx設置成一樣,堆的最大值設置為物理可用內存的最大值的80%。

set JAVA_OPTS=-Xms512m-Xmx512m

2)錯誤提示:java.lang.OutOfMemoryError: PermGenspace

PermGenspace的全稱是Permanent Generationspace,是指內存的永久保存區域,這塊內存主要是被JVM存放Class和Meta信息的,Class在被Loader時就會被放到PermGenspace中,它和存放類實例(Instance)的Heap區域不同,GC(Garbage Collection)不會在主程序運行期對PermGenspace進行清理,所以如果你的應用中有很CLASS的話,就很可能出現PermGen space錯誤,這種錯誤常見在web服務器對JSP進行precompile的時候。如果你的WEB APP下都用了大量的第三方jar, 其大小超過了jvm默認的大小(4M)那麽就會產生此錯誤信息了。解決方法:

setJAVA_OPTS=-XX:PermSize=128M

3)在使用-Xms和-Xmx調整tomcat的堆大小時,還需要考慮垃圾回收機制。如果系統花費很多的時間收集垃圾,請減小堆大小。一次完全的垃圾收集應該不超過3-5 秒。如果垃圾收集成為瓶頸,那麽需要指定代的大小,檢查垃圾收集的詳細輸出,研究垃圾收集參數對性能的影響。一般說來,你應該使用物理內存的 80% 作為堆大小。當增加處理器時,記得增加內存,因為分配可以並行進行,而垃圾收集不是並行的。

2、連接數優化:

#優化連接數,主要是在conf/server.xml配置文件中進行修改。

2.1、優化線程數

找到Connector port="8080" protocol="HTTP/1.1",增加maxThreads和acceptCount屬性(使acceptCount大於等於maxThreads),如下:

<Connector port="8080" protocol="HTTP/1.1"connectionTimeout="20000" redirectPort="8443"acceptCount="500" maxThreads="400" />

其中:

? maxThreads:tomcat可用於請求處理的最大線程數,默認是200
? minSpareThreads:tomcat初始線程數,即最小空閑線程數
? maxSpareThreads:tomcat最大空閑線程數,超過的會被關閉
? acceptCount:當所有可以使用的處理請求的線程數都被使用時,可以放到處理隊列中的請求數,超過這個數的請求將不予處理.默認100
2.2、使用線程池

在server.xml中增加executor節點,然後配置connector的executor屬性,如下:

<Executor name="tomcatThreadPool" namePrefix="req-exec-"maxThreads="1000" minSpareThreads="50"maxIdleTime="60000"/>
<Connector port="8080" protocol="HTTP/1.1"executor="tomcatThreadPool"/>

其中:

? namePrefix:線程池中線程的命名前綴
? maxThreads:線程池的最大線程數
? minSpareThreads:線程池的最小空閑線程數
? maxIdleTime:超過最小空閑線程數時,多的線程會等待這個時間長度,然後關閉
? threadPriority:線程優先級

註:當tomcat並發用戶量大的時候,單個jvm進程確實可能打開過多的文件句柄,這時會報java.net.SocketException:Too many open files錯誤。可使用下面步驟檢查:

? ps -ef |grep tomcat 查看tomcat的進程ID,記錄ID號,假設進程ID為10001
? lsof -p 10001|wc -l 查看當前進程id為10001的 文件操作數
? 使用命令:ulimit -a 查看每個用戶允許打開的最大文件數
3、Tomcat Connector三種運行模式(BIO, NIO, APR) 3.1、三種模式比較:

1)BIO:一個線程處理一個請求。缺點:並發量高時,線程數較多,浪費資源。Tomcat7或以下在Linux系統中默認使用這種方式。

2)NIO:利用Java的異步IO處理,可以通過少量的線程處理大量的請求。Tomcat8在Linux系統中默認使用這種方式。Tomcat7必須修改Connector配置來啟動(conf/server.xml配置文件):

<Connector port="8080"protocol="org.apache.coyote.http11.Http11NioProtocol" connectionTimeout="20000"redirectPort="8443"/>

3)APR(Apache Portable Runtime):從操作系統層面解決io阻塞問題。Linux如果安裝了apr和native,Tomcat直接啟動就支持apr。

3.2、apr模式

安裝apr以及tomcat-native

yum -y install apr apr-devel

進入tomcat/bin目錄,比如:

cd /opt/local/tomcat/bin/
tar xzfv tomcat-native.tar.gz
cd tomcat-native-1.1.32-src/jni/native
./configure --with-apr=/usr/bin/apr-1-config
make && make install

#註意最新版本的tomcat自帶tomcat-native.war.gz,不過其版本相對於yum安裝的apr過高,configure的時候會報錯。

解決:yum remove apr apr-devel –y,卸載yum安裝的apr和apr-devel,下載最新版本的apr源碼包,編譯安裝;或者下載低版本的tomcat-native編譯安裝

安裝成功後還需要對tomcat設置環境變量,方法是在catalina.sh文件中增加1行:

CATALINA_OPTS="-Djava.library.path=/usr/local/apr/lib"

#apr下載地址:http://apr.apache.org/download.cgi

#tomcat-native下載地址:http://tomcat.apache.org/download-native.cgi

修改8080端對應的conf/server.xml

protocol="org.apache.coyote.http11.Http11AprProtocol"

<Connector executor="tomcatThreadPool"
port="8080"
protocol="org.apache.coyote.http11.Http11AprProtocol"
connectionTimeout="20000"
enableLookups="false"
redirectPort="8443"
URIEncoding="UTF-8" />

PS:啟動以後查看日誌 顯示如下表示開啟 apr 模式

Sep 19, 2016 3:46:21 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["http-apr-8081"]

tomcat常見面試題

一、Tomcat的缺省是多少,怎麽修改

Tomcat的缺省端口號是8080.修改Tomcat端口號:

1.找到Tomcat目錄下的conf文件夾

2.進入conf文件夾裏面找到server.xml文件

3.打開server.xml文件

4.在server.xml文件裏面找到下列信息

maxThreads=”150″ minSpareThreads=”25″ maxSpareThreads=”75″ enableLookups=”false” redirectPort=”8443″ acceptCount=”100″ connectionTimeout=”20000″ disableUploadTimeout=”true” />

5.把port=”8080″改成port=”8888″,並且保存

6.啟動Tomcat,並且在IE瀏覽器裏面的地址欄輸入http://127.0.0.1:8888/

7、tomcat默認采用的BIO模型,在幾百並發下性能會有很嚴重的下降。tomcat自帶還有NIO的模型,另外也可以調用APR的庫來實現操作系統級別控制。NIO模型是內置的,調用很方便,只需要將上面配置文件中protocol修改成 org.apache.coyote.http11.Http11NioProtocol,重啟即可生效。如下面的參數配置,默認的是HTTP/1.1。

<Connector port=”8080″ protocol=”org.apache.coyote.http11.Http11NioProtocol” connectionTimeout=”20000″ redirectPort=”8443″ maxThreads=”500″ minSpareThreads=”20″ acceptCount=”100″ disableUploadTimeout=”true”

enableLookups=”false” URIEncoding=”UTF-8″ />

二、tomcat 如何優化?

1、優化連接配置.這裏以tomcat7的參數配置為例,需要修改conf/server.xml文件,修改連接數,關閉客戶端dns查詢。

參數解釋:

URIEncoding=”UTF-8″ :使得tomcat可以解析含有中文名的文件的url,真方便,不像apache裏還有搞個mod_encoding,還要手工編譯

maxSpareThreads : 如果空閑狀態的線程數多於設置的數目,則將這些線程中止,減少這個池中的線程總數。

minSpareThreads : 最小備用線程數,tomcat啟動時的初始化的線程數。

enableLookups : 這個功效和Apache中的HostnameLookups一樣,設為關閉。

connectionTimeout : connectionTimeout為網絡連接超時時間毫秒數。

maxThreads : maxThreads Tomcat使用線程來處理接收的每個請求。這個值表示Tomcat可創建的最大的線程數,即最大並發數。

acceptCount : acceptCount是當線程數達到maxThreads後,後續請求會被放入一個等待隊列,這個acceptCount是這個隊列的大小,如果這個隊列也滿了,就直接refuse connection

maxProcessors與minProcessors : 在 Java中線程是程序運行時的路徑,是在一個程序中與其它控制線程無關的、能夠獨立運行的代碼段。它們共享相同的地址空間。多線程幫助程序員寫出CPU最 大利用率的高效程序,使空閑時間保持最低,從而接受更多的請求。

通常Windows是1000個左右,Linux是2000個左右。

useURIValidationHack:

我們來看一下tomcat中的一段源碼:

【security】

if (connector.getUseURIValidationHack()) {

String uri = validate(request.getRequestURI());

if (uri == null) {

res.setStatus(400);

res.setMessage(“Invalid URI”);

throw new IOException(“Invalid URI”);

} else {

req.requestURI().setString(uri);

// Redoing the URI decoding

req.decodedURI().duplicate(req.requestURI());

req.getURLDecoder().convert(req.decodedURI(), true);

可以看到如果把useURIValidationHack設成”false”,可以減少它對一些url的不必要的檢查從而減省開銷。

enableLookups=”false” : 為了消除DNS查詢對性能的影響我們可以關閉DNS查詢,方式是修改server.xml文件中的enableLookups參數值。

disableUploadTimeout :類似於Apache中的keeyalive一樣

給Tomcat配置gzip壓縮(HTTP壓縮)功能

compression=”on” compressionMinSize=”2048″ compressableMimeType=”text/html,text/xml,text/javascript,text/css,text/plain”

HTTP 壓縮可以大大提高瀏覽網站的速度,它的原理是,在客戶端請求網頁後,從服務器端將網頁文件壓縮,再下載到客戶端,由客戶端的瀏覽器負責解壓縮並瀏覽。相對於普通的瀏覽過程HTML,CSS,Javascript , Text ,它可以節省40%左右的流量。更為重要的是,它可以對動態生成的,包括CGI、PHP , JSP , ASP , Servlet,SHTML等輸出的網頁也能進行壓縮,壓縮效率驚人。

1)compression=”on” 打開壓縮功能

2)compressionMinSize=”2048″ 啟用壓縮的輸出內容大小,這裏面默認為2KB

3)noCompressionUserAgents=”gozilla, traviata” 對於以下的瀏覽器,不啟用壓縮

4)compressableMimeType=”text/html,text/xml” 壓縮類型

最後不要忘了把8443端口的地方也加上同樣的配置,因為如果我們走https協議的話,我們將會用到8443端口這個段的配置,對吧?{

tomcat設置https端口時,8443和443區別:
1. 8443端口在訪問時需要加端口號,相當於http的8080,不可通過域名直接訪問,需要加上端口號;https://yuming.com:8443。

2. 443端口在訪問時不需要加端口號,相當於http的80,可通過域名直接訪問;例:https://yuming.com。

*問:https使用域名訪問網站,而不顯示端口號?

答:將端口號設置為443,即可通過域名直接訪問網站

<!–enable tomcat ssl–>

<Connector port=”8443″ protocol=”HTTP/1.1″ URIEncoding=”UTF-8″ minSpareThreads=”25″ maxSpareThreads=”75″ enableLookups=”false” disableUploadTimeout=”true” connectionTimeout=”20000″ acceptCount=”300″ maxThreads=”300″ maxProcessors=”1000″ minProcessors=”5″ useURIValidationHack=”false” compression=”on” compressionMinSize=”2048″ compressableMimeType=”text/html,text/xml,text/javascript,text/css,text/plain”

SSLEnabled=”true”scheme=”https” secure=”true”clientAuth=”false” sslProtocol=”TLS”keystoreFile=”d:/tomcat2/conf/shnlap93.jks” keystorePass=”aaaaaa”/>

好了,所有的Tomcat優化的地方都加上了。

2、優化JDK

Tomcat默認可以使用的內存為128MB,Windows下,在文件{tomcat_home}/bin/catalina.bat,Unix下,在文件$CATALINA_HOME/bin/catalina.sh的前面,增加如下設置:

JAVA_OPTS=”‘$JAVA_OPTS” -Xms[初始化內存大小] -Xmx[可以使用的最大內存]

設置環境變量:export JAVA_OPTS=””$JAVA_OPTS” -Xms[初始化內存大小] -Xmx[可以使用的最大內存]”

一般說來,你應該使用物理內存的 80% 作為堆大小。如果本機上有Apache服務器,可以先折算Apache需要的內存,然後修改堆大小。建議設置為70%;建議設置[[初始化內存大小]等於[可以使用的最大內存],這樣可以減少平凡分配堆而降低性能。

本例使用加入環境變量的方式:

# vi /etc/profile

加入:export JAVA_OPTS=””$JAVA_OPTS” -Xms700 —Xmx700

# source /etc/profile

【參數說明】

-Xms 是指設定程序啟動時占用內存大小。一般來講,大點,程序會啟動的 快一點,但是也可能會導致機器暫時間變慢。

-Xmx 是指設定程序運行期間最大可占用的內存大小。如果程序運行需要占 用更多的內存,超出了這個設置值,就會拋出OutOfMemory 異常。

-Xss 是指設定每個線程的堆棧大小。這個就要依據你的程序,看一個線程 大約需要占用多少內存,可能會有多少線程同時運行等。

-XX:PermSize設置非堆內存初始值,默認是物理內存的1/64 。

-XX:MaxPermSize設置最大非堆內存的大小,默認是物理內存的1/4。

三、tomcat 有那幾種Connector 運行模式?

tomcat的運行模式有3種.修改他們的運行模式.3種模式的運行是否成功,可以看他的啟動控制臺,或者啟動日誌.或者登錄他們的默認頁面http://localhost:8080/查看其中的服務器狀態。

1)bio

默認的模式,性能非常低下,沒有經過任何優化處理和支持.

2)nio

利用java的異步io護理技術,no blocking IO技術.

想運行在該模式下,直接修改server.xml裏的Connector節點,修改protocol為

<Connector port=”80″ protocol=”org.apache.coyote.http11.Http11NioProtocol” connectionTimeout=”20000″ URIEncoding=”UTF-8″ useBodyEncodingForURI=”true” enableLookups=”false” redirectPort=”8443″ />啟動後,就可以生效。

3)apr

安裝起來最困難,但是從操作系統級別來解決異步的IO問題,大幅度的提高性能.

必須要安裝apr和native,直接啟動就支持apr。下面的修改純屬多余,僅供大家擴充知識,但仍然需要安裝apr和native。如nio修改模式,修改protocol為org.apache.coyote.http11.Http11AprProtocol

四、tomcat調優

1. JVM參數調優:-Xms<size> 表示JVM初始化堆的大小,-Xmx<size>表示JVM堆的最大值。這兩個值的大小一般根據需要進行設置。當應用程序需要的內存超出堆的最大值時虛擬機就會提示內存溢出,並且導致應用服務崩潰。因此一般建議堆的最大值設置為可用內存的最大值的80%。在catalina.bat中,設置JAVA_OPTS=‘-Xms256m -Xmx512m‘,表示初始化內存為256MB,可以使用的最大內存為512MB。
2. 禁用DNS查詢
 當web應用程序想要記錄客戶端的信息時,它也會記錄客戶端的IP地址或者通過域名服務器查找機器名轉換為IP地址。DNS查詢需要占用網絡,並且包括可能從很多很遠的服務器或者不起作用的服務器上去獲取對應的IP的過程,這樣會消耗一定的時間。為了消除DNS查詢對性能的影響我們可以關閉DNS查詢,方式是修改server.xml文件中的enableLookups參數值:
Tomcat4
<Connector className="org.apache.coyote.tomcat4.CoyoteConnector" port="80" minProcessors="5" maxProcessors="75" enableLookups="false" redirectPort="8443" acceptCount="100" debug="0" connectionTimeout="20000" useURIValidationHack="false" disableUploadTimeout="true" />

Tomcat5
<Connector port="80" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" redirectPort="8443" acceptCount="100" debug="0" connectionTimeout="20000" disableUploadTimeout="true"/>
3. 調整線程數
通過應用程序的連接器(Connector)進行性能控制的的參數是創建的處理請求的線程數。Tomcat使用線程池加速響應速度來處理請求。在Java中線程是程序運行時的路徑,是在一個程序中與其它控制線程無關的、能夠獨立運行的代碼段。它們共享相同的地址空間。多線程幫助程序員寫出CPU最大利用率的高效程序,使空閑時間保持最低,從而接受更多的請求。
Tomcat4中可以通過修改minProcessors和maxProcessors的值來控制線程數。這些值在安裝後就已經設定為默認值並且是足夠使用的,但是隨著站點的擴容而改大這些值。minProcessors服務器啟動時創建的處理請求的線程數應該足夠處理一個小量的負載。也就是說,如果一天內每秒僅發生5次單擊事件,並且每個請求任務處理需要1秒鐘,那麽預先設置線程數為5就足夠了。但在你的站點訪問量較大時就需要設置更大的線程數,指定為參數maxProcessors的值。maxProcessors的值也是有上限的,應防止流量不可控制(或者惡意的服務攻擊),從而導致超出了虛擬機使用內存的大小。如果要加大並發連接數,應同時加大這兩個參數。web server允許的最大連接數還受制於操作系統的內核參數設置,通常Windows是2000個左右,Linux是1000個左右。
在Tomcat5對這些參數進行了調整,請看下面屬性:
maxThreads Tomcat使用線程來處理接收的每個請求。這個值表示Tomcat可創建的最大的線程數。
acceptCount 指定當所有可以使用的處理請求的線程數都被使用時,可以放到處理隊列中的請求數,超過這個數的請求將不予處理。
connnectionTimeout 網絡連接超時,單位:毫秒。設置為0表示永不超時,這樣設置有隱患的。通常可設置為30000毫秒。
minSpareThreads Tomcat初始化時創建的線程數。
maxSpareThreads 一旦創建的線程超過這個值,Tomcat就會關閉不再需要的socket線程。
最好的方式是多設置幾次並且進行測試,觀察響應時間和內存使用情況。在不同的機器、操作系統或虛擬機組合的情況下可能會不同,而且並不是所有人的web站點的流量都是一樣的,因此沒有一刀切的方案來確定線程數的值。

Tomcat作為Web服務器,它的處理性能直接關系到用戶體驗,下面是幾種常見的優化措施:

一、掉對web.xml的監視,把jsp提前編輯成Servlet。有富余物理內存的情況,加大tomcat使用的jvm的內存

二、服務器資源
  服務器所能提供CPU、內存、硬盤的性能對處理能力有決定性影響。
  (1) 對於高並發情況下會有大量的運算,那麽CPU的速度會直接影響到處理速度。
  (2) 內存在大量數據處理的情況下,將會有較大的內存容量需求,可以用-Xmx -Xms -XX:MaxPermSize等參數對內存不同功能塊進行劃分。我們之前就遇到過內存分配不足,導致虛擬機一直處於full GC,從而導致處理能力嚴重下降。
  (3) 硬盤主要問題就是讀寫性能,當大量文件進行讀寫時,磁盤極容易成為性能瓶頸。最好的辦法還是利用下面提到的緩存。

三、利用緩存和壓縮
  對於靜態頁面最好是能夠緩存起來,這樣就不必每次從磁盤上讀。這裏我們采用了Nginx作為緩存服務器,將圖片、css、js文件都進行了緩存,有效的減少了後端tomcat的訪問。
  另外,為了能加快網絡傳輸速度,開啟gzip壓縮也是必不可少的。但考慮到tomcat已經需要處理很多東西了,所以把這個壓縮的工作就交給前端的Nginx來完成。
  除了文本可以用gzip壓縮,其實很多圖片也可以用圖像處理工具預先進行壓縮,找到一個平衡點可以讓畫質損失很小而文件可以減小很多。曾經我就見過一個圖片從300多kb壓縮到幾十kb,自己幾乎看不出來區別。

四、采用集群
  單個服務器性能總是有限的,最好的辦法自然是實現橫向擴展,那麽組建tomcat集群是有效提升性能的手段。我們還是采用了Nginx來作為請求分流的服務器,後端多個tomcat共享session來協同工作。

五、 優化tomcat參數
  這裏以tomcat7的參數配置為例,需要修改conf/server.xml文件,主要是優化連接配置,關閉客戶端dns查詢。

<Connector port="8080"
protocol="org.apache.coyote.http11.Http11NioProtocol"
connectionTimeout="20000"
redirectPort="8443"
maxThreads="500"
minSpareThreads="20"
acceptCount="100"
disableUploadTimeout="true"
enableLookups="false"
URIEncoding="UTF-8" />

Tomcat記錄-tomcat常用配置詳解和優化方法