隨着電商的發展,高併發的問題已經愈來愈嚴重,在高併發的狀況,無時無刻不考驗着服務器性能的優化,高可用也成爲了一個開發者所必備的知識點,做爲一個程序的開發者,性能的優化一般有三大塊 一、服務器優化 二、數據庫優化 三、JVM優化,那麼接下來我們來研究研究tomcat的優化內容java
tomcat優化分爲三塊: 1. JVM參數優化 2.JVM高併發優化 3.JVM啓動優化
1.當咱們在在linux環境下啓動了tomcat,在屏幕右上角有一個server status,咱們須要在conf/ tomcat-users.xml 下設置登錄的用戶
<role rolename="manager"/>
<role rolename="manager-gui"/>
<role rolename="admin"/>
<role rolename="admin-gui"/>
<user username="tomcat" password="tomcat" roles="admin-gui,admin,manager-gui,manager"/>linux
該信息賦予了tomcat的用戶權限,以及用戶名,密碼
登錄完畢 ,能夠看到JVM佔有狀況(Free memory: 51.70 MB Total memory: 95.75 MB Max memory: 419.50 MB)能夠發現此時JVM所使用到的內容是linux虛擬機中的最大佔有內存1/4 ,年輕代,年老代,永久帶內存空間,爲了讓性能更加優越,除了能夠進行tomcat自身優化,還能夠進行在tomcat上進行JVM的調優,和當前tomcat的啓動模式 web
在tomcat的catalina.sh文件下數據庫
export JAVA_OPTS="-server -Xms1600M -Xmx1600M -Xss512k -XX:+AggressiveOpts -XX:+UseBiasedLocking -XX:PermSize=128M -XX:MaxPermSize=256M -XX:+DisableExplicitGC -XX:MaxTenuringThreshold=31 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -Djava.awt.headless=true"
apache
-server: jdk的server版
只要你的tomcat運行在生產環境中的,這個參數必須添加
由於tomcat默認是以一種叫java -client 的模式來運行的,server即意味着你的tomcat是以真實的production的模式在運行的,這也意味着你的tomcat 會擁有更大,更高的併發處理能力,以及更強更敏捷的JVM垃圾回收機制,能夠得到更多的負載與吞吐量tomcat
-Xms -Xmx :初始堆大小,和最大堆大小
在實際生產過程當中JVM的堆內存必定要一樣大,若是在一個區間,在最小內存時存在內存不足,此時觸發GC,但此時若內存忽然變大,GC將變得沒有意義,因此在實際生產過程當中須要不能將堆內存設置成空間值(默認是堆內存小於40%時,JVM將增大堆到-Xmx最大限制,空餘堆大於70%時,會減小至-xms最小限制)服務器
-Xss512k 調整棧大小,最好不要超過1M 網絡
AggressiveOpts:從單詞上看是積極,生猛,將最新版的JDK優化後的新特性自動注入併發
UseBiasedLocking:啓動了優化的線程鎖,對於高併發訪問很重要,太多請求忙不過來時,它就自動優化,對於各自長短不一的請求,排隊,會自動進行優化
DisableExplicitGC:關閉明顯的GC操做,避免內存的大起大落,忽略手動調用GC,使System.gc() 成爲一個空調用 less
MaxTenuringThreshold: 設置新生代存活的次數
若年老代對象過多,能夠將這個年齡設置爲0 ,但一般不建議
-Djava.awt.headless=true:這個參數都是放在最後的,咱們在J2EE工程中使用一些圖標工具如:jfreechart,在web網頁輸出GIF、JPG流
在window環境下不會有問題,但在生產環境下可能會出現不顯示,此時這個配置能夠解決這個參數
在server.xml中除了能修改端口號和編碼集之外,還能進行一項很是重要的修改,啓動模式!
1.bio 默認的模式,性能很是低下,沒有通過任何優化處理和支持.
2.nio nio(new I/O),是Java SE 1.4及後續版本提供的一種新的I/O操做方式(即java.nio包及其子包)。Java nio是一個基於緩衝區、並能提供非阻塞I/O操做的Java API,所以nio也被當作是non-blocking I/O的縮寫。它擁有比傳統I/O操做(bio)更好的併發運行性能。
3.apr 安裝起來最困難,可是從操做系統級別來解決異步的IO問題,大幅度的提升性能.
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
優化配置1:標準版(親測有效)
<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="600"
minSpareThreads="100"
maxSpareThreads="500"
acceptCount="700"
connectionTimeout="20000"
redirectPort="8843"/>
maxThreads:支持併發訪問線程
minSpareThreads:最小備用線程,初始化默認是10
maxSpareThreads:最大備用線程
URIEncoding:編碼集
enableLookups:當咱們經過調用request.getRemoteHost()進行DNS查詢時,指望返回客戶實際主機名,將此屬性設置爲true ,但一般設置爲false,節約性能
disableUploadTimeout disableUploadTimeout = true
是否須要對tomcat容器單獨的設置上傳時間
connectionTimeout:網絡連接超時,單位毫秒,設置爲-1表示用戶超時
acceptCount:當線程達到了maxThreads後,後續將請求放置到一個等待隊列中,這個acceptCount是這個隊列的大小,若這個隊列也滿了,就直接refuse connection ,默認是100
maxThreads :同時處理線程的能力,默認200 ,建議600-800
minProcessors:在java中線程是程序運行時的路徑,是在一個程序中與其餘控制線程無關的,可以獨立運行的代碼塊,使空閒時間最低,充分利用cpu資源
總結:
相信經過本次學習,同窗們對於tomcat已經有了必定的瞭解,謝謝各位