Tomcat优化
一.Tomcat內存優化
- -server 啟用jdk 的 server 版
- -Xms java虛擬機初始化時的最小內存
- -Xmx java虛擬機可使用的最大內存
- -XX: PermSize 內存永久保留區域
- -XX:MaxPermSize 內存最大永久保留區域
3.配置示例: JAVA_OPTS=’-Xms1024m -Xmx2048m -XX: PermSize=256M -XX:MaxNewSize=256m -XX:MaxPermSize=256m’ 說明:其內存的配置需要根據服務器(或虛擬機)的實際內存來配置
4.重啟tomcat生效
二.Tomcat并發優化
1.調整連接器connector的并發處理能力:
- maxThreads :客戶請求最大線程數
- minSpareThreads :Tomcat初始化時創建的 socket 線程數
- maxSpareThreads: Tomcat連接器的最大空閑 socket 線程數
- enableLookups :是否反查域名,取值為: true 或 false 。為了提高處理能力,應設置為 false
- redirectPort: 在需要基于安全通道的場合,把客戶請求轉發到基于SSL 的 redirectPort 端口
- acceptAccount: 監聽端口隊列最大數,滿了之后客戶請求會被拒絕(不能小于maxSpareThreads )
- connectionTimeout: 連接超時
- minProcessors: 服務器創建時的最小處理線程數
- maxProcessors: 服務器同時最大處理線程數
- URIEncoding: URL統一編碼 其中和最大連接數相關的參數為maxProcessors 和 acceptCount 。如果要加大并發連接數,應同時加大這兩個參數。
2.壓縮優化及參數
- 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 去做。
三、Tomcat緩存優化
1、tomcat的maxThreads、acceptCount(最大線程數、最大排隊數) 說明:
- maxThreads:tomcat起動的最大線程數,即同時處理的任務個數,默認值為200
- 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 參數調整,也就是要考慮內存開銷。
四、tomcat的協議類型優化:
1、關閉AJP端口 AJP是為 Tomcat 與 HTTP 服務器之間通信而定制的協議,能提供較高的通信速度和效率。如果tomcat前端放的是apache的時候,會使用到AJP這個連接器。若tomcat未與apache配合使用,因此不使用此連接器,因此需要注銷掉該連接器。 <!-- <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> -->
2、bio模式: 默認的模式,性能非常低下,沒有經過任何優化處理和支持.
3、nio模式:
01、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)更好的并發運行性能。
02、如何啟動此模式: 修改server.xml里的Connector節點,修改protocol為org.apache.coyote.http11.Http11NioProtocol
4、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交互的中間環節
解壓之后上傳至服務器執行解壓并安裝:
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"
?
然后保存并退出
5、系統參數優化: 優化網卡驅動可以有效提升性能,這個對于集群環境工作的時候尤為重要。由于我們采用了linux服務器,所以優化內核參數也是一個非常重要的工作。給一個參考的優化參數: 01、 修改/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
02、 保存退出,執行sysctl -p生效
五、tomcat的安全配置:
1、當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>2、隱藏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。
3、隱藏tomcat 的服務類型 conf/server.xml文件中,為connector元素添加server=" ",注意不是空字符串,是空格組成的長度為1的字符串,或者輸入其他的服務類型,這時候,在response header中就沒有server的信息啦!
4、應用程序安全 關閉war自動部署 unpackWARs="false" autoDeploy="false"。防止被植入木馬等惡意程序
5、修改服務監聽端口 一般公司的 Tomcat 都是放在內網的,因此我們針對 Tomcat 服務的監聽地址都是內網地址。 修改實例:
<Connector port="8080" address="172.16.100.1" />?
總結
- 上一篇: 【深度学习】CNN算法
- 下一篇: 求字符串全排列的递归算法