1. 程式人生 > 實用技巧 >tomcat 引數調優

tomcat 引數調優

1、檢視linux伺服器環境,cpu數,記憶體數

-bash-4.2$ cat /proc/cpuinfo |grep processor
processor : 0
processor : 1
processor : 2
processor : 3
processor : 4
processor : 5
processor : 6
processor : 7
-bash-4.2$ cat /proc/meminfo | grep MemTotal
MemTotal: 32948192 kB
2、設定tomcat啟動引數

引數說明:

-server

tomcat預設是以一種叫java –client的模式來執行的,server即意味著你的tomcat是以真實的production的模式在執行的,這也就意味著你的tomcat以 server模式執行時將擁有:更大、更高的併發處理能力,更快更強捷的JVM垃圾回收機制,可以獲得更多的負載與吞吐量。

-Xms–Xmx

即JVM記憶體設定了,把Xms與Xmx兩個值設成一樣是最優的做法。如何知道我的JVM能夠使用最大值?在設這個最大記憶體即Xmx值時請先開啟一個命令列,鍵入如下的命令:

qiaohongdeMacBook-Pro:bin hong$ java -Xmx3500m -version
java version "1.8.0_131"
Java(TM) SE Runtime Environment (build 1.8.0_131-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)
看,能夠正常顯示JDK的版本資訊,說明,這個值你能夠用。由於我係統是64位的,沒有記憶體限制,32位最大隻能用2g記憶體(理論值)。

–Xmn

設定年輕代大小為512m。整個堆大小=年輕代大小 + 年老代大小 + 持久代大小。持久代一般固定大小為64m,所以增大年輕代後,將會減小年老代大小。此值對系統性能影響較大,Sun官方推薦配置為整個堆的3/8。

-Xss

是指設定每個執行緒的堆疊大小。這個就要依據你的程式,看一個執行緒 大約需要佔用多少記憶體,可能會有多少執行緒同時執行等。一般不易設定超過1M,要不然容易出現out ofmemory。

-XX:+AggressiveOpts

啟用這個引數,則每當JDK版本升級時,你的JVM都會使用最新加入的優化技術(如果有的話)

-XX:+UseBiasedLocking

啟用一個優化了的執行緒鎖,我們知道在我們的appserver,每個http請求就是一個執行緒,有的請求短有的請求長,就會有請求排隊的現象,甚至還會出現執行緒阻塞,這個優化了的執行緒鎖使得你的appserver內對執行緒處理自動進行最優調配。

-XX:PermSize=128M-XX:MaxPermSize=256M,tomcat8中已經不支援該引數

JVM使用-XX:PermSize設定非堆記憶體初始值,預設是實體記憶體的1/64;

在資料量的很大的檔案匯出時,一定要把這兩個值設定上,否則會出現記憶體溢位的錯誤。

由XX:MaxPermSize設定最大非堆記憶體的大小,預設是實體記憶體的1/4。

那麼,如果是實體記憶體4GB,那麼64分之一就是64MB,這就是PermSize預設值,也就是永生代記憶體初始大小;

四分之一是1024MB,這就是MaxPermSize預設大小。

-XX:+DisableExplicitGC

在 程式程式碼中不允許有顯示的呼叫”System.gc()”。看到過有兩個極品工程中每次在DAO操作結束時手動呼叫System.gc()一下,覺得這樣 做好像能夠解決它們的out ofmemory問題一樣,付出的代價就是系統響應時間嚴重降低,就和我在關於Xms,Xmx裡的解釋的原理一樣,這樣去呼叫GC導致系統的JVM大起大 落,效能不到什麼地方去喲!

-XX:+UseParNewGC

對年輕代採用多執行緒並行回收,這樣收得快。

-XX:+UseConcMarkSweepGC

即CMS gc,這一特性只有jdk1.5即後續版本才具有的功能,它使用的是gc估算觸發和heap佔用觸發。

我們知道頻頻繁的GC會造面JVM的大起大落從而影響到系統的效率,因此使用了CMS GC後可以在GC次數增多的情況下,每次GC的響應時間卻很短,比如說使用了CMS GC後經過jprofiler的觀察,GC被觸發次數非常多,而每次GC耗時僅為幾毫秒。

-XX:MaxTenuringThreshold,範圍0-15

設 置垃圾最大年齡。如果設定為0的話,則年輕代物件不經過Survivor區,直接進入年老代。對於年老代比較多的應用,可以提高效率。如果將此值設定為一 個較大值,則年輕代物件會在Survivor區進行多次複製,這樣可以增加物件再年輕代的存活時間,增加在年輕代即被回收的概率。

這個值的設定是根據本地的jprofiler監控後得到的一個理想的值,不能一概而論原搬照抄。

-XX:+CMSParallelRemarkEnabled

在使用UseParNewGC 的情況下, 儘量減少 mark 的時間

-XX:+UseCMSCompactAtFullCollection

在使用concurrent gc 的情況下, 防止 memoryfragmention, 對live object 進行整理, 使 memory 碎片減少。

-XX:LargePageSizeInBytes

指定 Java heap的分頁頁面大小

-XX:+UseFastAccessorMethods

get,set 方法轉成原生代碼

-XX:+UseCMSInitiatingOccupancyOnly

指示只有在 oldgeneration 在使用了初始化的比例後concurrent collector 啟動收集

-XX:CMSInitiatingOccupancyFraction=70

CMSInitiatingOccupancyFraction,這個引數設定有很大技巧,基本上滿足(Xmx-Xmn)(100- CMSInitiatingOccupancyFraction)/100>=Xmn就 不會出現promotion failed。在我的應用中Xmx是6000,Xmn是512,那麼Xmx-Xmn是5488兆,也就是年老代有5488 兆,CMSInitiatingOccupancyFraction=90說明年老代到90%滿的時候開始執行對年老代的併發垃圾回收(CMS),這時還 剩10%的空間是548810%=548兆,所以即使Xmn(也就是年輕代共512兆)裡所有物件都搬到年老代裡,548兆的空間也足夠了,所以只要滿 足上面的公式,就不會出現垃圾回收時的promotion failed;

因此這個引數的設定必須與Xmn關聯在一起。

-Djava.awt.headless=true

這 個引數一般我們都是放在最後使用的,這全引數的作用是這樣的,有時我們會在我們的J2EE工程中使用一些圖表工具如:jfreechart,用於在web 網頁輸出GIF/JPG等流,在winodws環境下,一般我們的app server在輸出圖形時不會碰到什麼問題,但是在linux/unix環境下經常會碰到一個exception導致你在winodws開發環境下圖片顯 示的好好可是在linux/unix下卻顯示不出來,因此加上這個引數以免避這樣的情況出現。

上述這樣的配置,基本上可以達到:

系統響應時間增快

JVM回收速度增快同時又不影響系統的響應率

JVM記憶體最大化利用

執行緒阻塞情況最小化

3、tomcat容器優化

開啟tomcat安裝目錄\conf\server.xml檔案,定位到這‘<connector port="8080" protocol’一行,它一般都會有一個預設值,這些預設值是遠遠不夠我們的使用的,我們來看經過更改後的這一段的配置:

引數描述:

URIEncoding=”UTF-8”

使得tomcat可以解析含有中文名的檔案的url,真方便,不像apache裡還有搞個mod_encoding,還要手工編譯

maxSpareThreads

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" 壓縮型別
轉載自:https://blog.csdn.net/zqhjm/article/details/80814202