淺談tomcat優化(內存,併發,緩存,安全,網絡,系統等)

一.Tomcat內存優化

  1. Tomcat內存優化主要是對 tomcat 啓動參數優化,咱們能夠在 tomcat 的啓動腳本 catalina.sh 中設置 java_OPTS 參數javascript

  2. JAVA_OPTS參數說明
      -server 啓用jdk 的 server 版
      -Xms java虛擬機初始化時的最小內存
      -Xmx java虛擬機可以使用的最大內存
      -XX: PermSize 內存永久保留區域
      -XX:MaxPermSize 內存最大永久保留區域css

3.配置示例:
JAVA_OPTS=’-Xms1024m -Xmx2048m -XX: PermSize=256M -XX:MaxNewSize=256m -XX:MaxPermSize=256m’
說明:其內存的配置須要根據服務器(或虛擬機)的實際內存來配置html

4.重啓tomcat生效前端


二.Tomcat併發優化

  1. 調整鏈接器connector的併發處理能力:java

        maxThreads :客戶請求最大線程數

      minSpareThreads :Tomcat初始化時建立的 socket 線程數
      maxSpareThreads: Tomcat鏈接器的最大空閒 socket 線程數
      enableLookups :是否反查域名,取值爲: true 或 false 。爲了提升處理能力,應設置爲 false
      redirectPort: 在須要基於安全通道的場合,把客戶請求轉發到基於SSL 的 redirectPort 端口
      acceptAccount: 監聽端口隊列最大數,滿了以後客戶請求會被拒絕(不能小於maxSpareThreads )
      connectionTimeout: 鏈接超時
      minProcessors: 服務器建立時的最小處理線程數
      maxProcessors: 服務器同時最大處理線程數
      URIEncoding: URL統一編碼linux

             其中和最大鏈接數相關的參數爲maxProcessors 和 acceptCount 。若是要加大併發鏈接數,應同時加大這兩個參數。

    二、壓縮優化及參數web

      ●compression="on"   打開壓縮功能

    ●compressionMinSize="2048"啓用壓縮的輸出內容大小,默認爲2KB
    ●noCompressionUserAgents="gozilla,traviata" 對於如下的瀏覽器,不啓用壓縮
    ●compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" 哪些資源類型須要壓縮數據庫

      Tomcat 的壓縮是在客戶端請求服務器對應資源後,從服務器端將資源文件壓縮,再輸出到客戶端,由客戶端的瀏覽器負責解壓縮並瀏覽。相對於普通的瀏覽過程 HTML、CSS、Javascript和Text,它能夠節省40% 左右的流量。更爲重要的是,它能夠對動態生成的,包括CGI、PHP、JSP、ASP、Servlet,SHTML等輸出的網頁也能進行壓縮,壓縮效率也很高。可是, 壓縮會增長 Tomcat 的負擔,所以最好採用Nginx + Tomcat 或者 Apache + Tomcat 方式,將壓縮的任務交由 Nginx/Apache 去作。



3、Tomcat緩存優化

一、tomcat的maxThreads、acceptCount(最大線程數、最大排隊數)
說明:
maxThreads:tomcat起動的最大線程數,即同時處理的任務個數,默認值爲200apache

  acceptCount:當tomcat起動的線程數達到最大時,接受排隊的請求個數,默認值爲100

這兩個值如何起做用,請看下面三種狀況瀏覽器

狀況1:接受一個請求,此時tomcat起動的線程數沒有到達maxThreads,tomcat會起動一個線程來處理此請求。

狀況2:接受一個請求,此時tomcat起動的線程數已經到達maxThreads,tomcat會把此請求放入等待隊列,等待空閒線程。

狀況3:接受一個請求,此時tomcat起動的線程數已經到達maxThreads,等待隊列中的請求個數也達到了acceptCount,此時tomcat會直接拒絕這次請求,返回connection refused

maxThreads如何配置

通常的服務器操做都包括量方面:1計算(主要消耗cpu),2等待(io、數據庫等)

第一種極端狀況,若是咱們的操做是純粹的計算,那麼系統響應時間的主要限制就是cpu的運算能力,此時maxThreads應該儘可能設的小,下降同一時間內爭搶cpu的線程個數,能夠提升計算效率,提升系統的總體處理能力。

第二種極端狀況,若是咱們的操做純粹是IO或者數據庫,那麼響應時間的主要限制就變爲等待外部資源,此時maxThreads應該儘可能設的大,這樣才能提升同時處理請求的個數,從而提升系統總體的處理能力。此狀況下由於tomcat同時處理的請求量會比較大,因此須要關注一下tomcat的虛擬機內存設置和linux的open file限制。

我在測試時遇到一個問題,maxThreads我設置的比較大好比3000,當服務的線程數大到必定程度時,通常是2000出頭,單次請求的響應時間就會急劇的增長,

百思不得其解這是爲何,四處尋求答案無果,最後我總結的緣由多是cpu在線程切換時消耗的時間隨着線程數量的增長愈來愈大,

cpu把大多數時間都用來在這2000多個線程直接切換上了,固然cpu就沒有時間來處理咱們的程序了。

之前一直簡單的認爲多線程=高效率。。其實多線程自己並不能提升cpu效率,線程過多反而會下降cpu效率。

當cpu核心數<線程數時,cpu就須要在多個線程直接來回切換,以保證每一個線程都會得到cpu時間,即一般咱們說的併發執行。

因此maxThreads的配置絕對不是越大越好。

現實應用中,咱們的操做都會包含以上兩種類型(計算、等待),因此maxThreads的配置並無一個最優值,必定要根據具體狀況來配置。

最好的作法是:在不斷測試的基礎上,不斷調整、優化,才能獲得最合理的配置。

acceptCount的配置,我通常是設置的跟maxThreads同樣大,這個值應該是主要根據應用的訪問峯值與平均值來權衡配置的。

若是設的較小,能夠保證接受的請求較快相應,可是超出的請求可能就直接被拒絕

若是設的較大,可能就會出現大量的請求超時的狀況,由於咱們系統的處理能力是必定的。

maxThreads 配置要結合 JVM -Xmx 參數調整,也就是要考慮內存開銷。




4、tomcat的協議類型優化:

一、關閉AJP端口
AJP是爲 Tomcat 與 HTTP 服務器之間通訊而定製的協議,能提供較高的通訊速度和效率。若是tomcat前端放的是apache的時候,會使用到AJP這個鏈接器。若tomcat未與apache配合使用,所以不使用此鏈接器,所以須要註銷掉該鏈接器。
<!-- <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> -->
二、bio模式:
默認的模式,性能很是低下,沒有通過任何優化處理和支持.
三、nio模式:
0一、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)更好的併發運行性能。
0二、如何啓動此模式:
修改server.xml裏的Connector節點,修改protocol爲org.apache.coyote.http11.Http11NioProtocol
四、apr模式:
apr是從操做系統級別解決異步IO問題,大幅度提升服務器的併發處理性能,也是Tomcat生產環境運行的首選方式
目前Tomcat 8.x默認狀況下所有是運行在nio模式下,而apr的本質就是使用jni技術調用操做系統底層的IO接口,因此須要提早安裝所須要的依賴,首先是須要安裝openssl和apr,命令以下:

yum -y install openssl-devel
yum -y install apr-devel

安裝以後,去tomcat官網下載native組件,native能夠當作是tomcat和apr交互的中間環節,下載地址是:http://tomcat.apache.org/download-native.cgi 這裏下載最新的版本1.2.10

  解壓以後上傳至服務器執行解壓並安裝:

tar -xvzf tomcat-native-1.2.10-src.tar.gz -C /usr/local
cd /usr/local/tomcat-native-1.2.10-src/native/
./configure 編譯安裝

而後進入tomcat安裝目錄,編輯配置文件:conf/server.xml

  

  如圖所示,將默認的protocol="HTTP/1.1"修改成protocol="org.apache.coyote.http11.Http11AprProtocol"

  apr引入方法:

  配置tomcat安裝目錄下:bin/catalina.sh文件引入apr,推薦這種方式:

  

  如圖所示在原有變量JAVA_OPTS後面追加對應的配置便可,添加一行新的就能夠:JAVA_OPTS="$JAVA_OPTS -Djava.library.path=/usr/local/apr/lib"

  而後保存並退出




五、系統參數優化:
優化網卡驅動能夠有效提高性能,這個對於集羣環境工做的時候尤其重要。因爲咱們採用了linux服務器,因此優化內核參數也是一個很是重要的工做。給一個參考的優化參數:
0一、 修改/etc/sysctl.cnf文件,在最後追加以下內容:
net.core.netdev_max_backlog = 32768
net.core.somaxconn = 32768
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.ip_local_port_range = 1024 65000 net.ipv4.route.gc_timeout = 100
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 2
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_mem = 94500000 915000000 927000000 net.ipv4.tcp_max_orphans = 3276800 net.ipv4.tcp_max_syn_backlog = 65536

0二、 保存退出,執行sysctl -p生效




  

5、tomcat的安全配置:

一、當Tomcat完成安裝後你首先要作的事情以下:

首次安裝完成後當即刪除webapps下面的全部代碼
rm -rf /srv/apache-tomcat/webapps/*
註釋或刪除 tomcat-users.xml 全部用戶權限,看上去以下:

cat conf/tomcat-users.xml

<?xml version='1.0' encoding='utf-8'?>

<tomcat-users>
</tomcat-users>

二、隱藏tomcat版本
01.首先找到這個jar包,$TOMCAT_HOME/lib/catalina.jar
02.解壓catalina.jar以後按照路徑\org\apache\catalina\util\ServerInfo.properties找到文件
03.打開ServerInfo.properties文件修改以下:把server.number、server.built置空
server.info=Apache Tomcat
server.number=
server.built=
04.從新打成jar包,重啓tomcat。
三、隱藏tomcat 的服務類型
conf/server.xml文件中,爲connector元素添加server="
",注意不是空字符串,是空格組成的長度爲1的字符串,或者輸入其餘的服務類型,這時候,在response header中就沒有server的信息啦!
四、應用程序安全
關閉war自動部署 unpackWARs="false" autoDeploy="false"。防止被植入***等惡意程序
五、修改服務監聽端口
通常公司的 Tomcat 都是放在內網的,所以咱們針對 Tomcat 服務的監聽地址都是內網地址。
修改實例:

<Connector port="8080" address="172.16.100.1" />

相關文章
相關標籤/搜索