tomcat 8 9 性能 優化 調優 centos 7 linux
2018年06月20日 18:08:47 張震在 閱讀數:767 標籤: tomcatcentos7jvm調優優化 更多
個人分類: tomcat
不要單純爲了調優而去調優,應該有針對性的去發現不足,解決問題,以提高性能。
所以,調優的前提是做好各種監控分析,包括服務器基礎資源使用、各個應用運行狀況、代碼質量、數據庫狀況、等等,根據業務的併發,服務器資源,以及存在的問題,有針對性的去優化。
==========正文==============
性能的提升,主要從以下幾個方面入手:
1,架構調優
負載均衡,高可用,nginx + tomcat 動靜分離,容器化 等, 不具體闡述
2 ,代碼調優
(1),代碼編寫規範。
(2),pmd 、findbug、sonar 等工具,檢測問題,並優化。 不具體闡述。
3,tomcat 相關參數優化,jvm調優。
(1),連接數,線程數,緩存,修改server.xml。
打開被註釋的默認連接池配置
默認配置:
<!--
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
maxThreads="150" minSpareThreads="4"/>
-->
修改實例:
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
maxThreads="150"
minSpareThreads="100"
prestartminSpareThreads="true"
maxQueueSize="100"/>
參數講解:
-
name: 線程名稱
-
namePrefix: 線程前綴
-
maxThreads : 最大併發連接數,不配置時默認200,一般建議設置500~ 800 ,要根據自己的硬件設施條件和實際業務需求而定。
-
minSpareThreads:Tomcat啓動初始化的線程數,默認值25
-
prestartminSpareThreads:在tomcat初始化的時候就初始化minSpareThreads的值, 不設置trueminSpareThreads 的值就沒啥效果了 。
-
maxQueueSize: 最大的等待隊列數,超過則拒絕請求
修改連接配置
默認配置:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
修改配置:
connectionTimeout="20000"
redirectPort="8443"
executor="tomcatThreadPool"
enableLookups="false"
maxIdleTime="60000"
acceptCount="100"
maxPostSize="10485760"
acceptorThreadCount="2"
disableUploadTimeout="true"
URIEncoding="utf-8"
keepAliveTimeout ="6000"
maxKeppAliveRequests="500"
/>
參數講解:
-
port:連接端口。
-
protocol:連接器使用的傳輸方式。
-
executor: 連接器使用的線程池名稱
-
enableLookups:禁用DNS 查詢
-
maxIdleTime:線程空閒時間,超過該時間後,空閒線程會被銷燬,默認值爲6000(1分鐘),單位毫秒。
-
acceptCount:指定當所有可以使用的處理請求的線程數都被使用時,可以放到處理隊列中的請求數,超過這個數的請求將不予處理,默認設置 100 。
-
maxPostSize:限制 以FORM URL 參數方式的POST請求的內容大小,單位字節,默認是 2097152(2兆),10485760 爲 10M。如果要禁用限制,則可以設置爲 -1。
-
acceptorThreadCount: 用於接收連接的線程的數量,默認值是1。一般這個指需要改動的時候是因爲該服務器是一個多核CPU,如果是多核 CPU 一般配置爲 2。
-
disableUploadTimeOut:允許Servlet容器,正在執行使用一個較長的連接超時值,以使Servlet有較長的時間來完成它的執行,默認值爲false
-
keepAliveTimeout - 表示在下次請求過來之前,tomcat保持該連接多久。這就是說假如客戶端不斷有請求過來,且未超過過期時間,則該連接將一直保持。
-
maxKeepAliveRequests -表示該連接最大支持的請求數。超過該請求數的連接也將被關閉(此時就會返回一個Connection: close頭給客戶端)。 (maxKeepAliveRequests="1"代表禁用長連接)(1表示禁用,-1表示不限制個數,默認100個。一般設置在100~200之間)
壓縮會增加Tomcat負擔,最好採用Nginx + Tomcat 或者 Apache + Tomcat 方式,壓縮交由Nginx/Apache 去做。
Tomcat 的壓縮是在客戶端請求服務器對應資源後,從服務器端將資源文件壓縮,再輸出到客戶端,由客戶端的瀏覽器負責解壓縮並瀏覽。相對於普通的 瀏覽過程 HTML、CSS、Javascript和Text,它可以節省40% 左右的流量。更爲重要的是,它可以對動態生成的,包括CGI、PHP、JSP、ASP、Servlet,SHTML等輸出的網頁也能進行壓縮,壓縮效率也很高。
管理AJP端口
AJP是爲 Tomcat 與 HTTP 服務器之間通信而定製的協議,能提供較高的通信速度和效率。如果tomcat前端放的是apache的時候,會使用到AJP這個連接器。 默認是開啓的。如果不使用apache,註釋該連接器。
<!--
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
-->
(2),apr 模式。
(Apache Portable Runtime/Apache可移植運行庫),是Apache HTTP服務器的支持庫。你可以簡單地理解爲,Tomcat將以JNI的形式調用Apache HTTP服務器的核心動態鏈接庫來處理文件讀取或網絡傳輸操作,從操作系統級別解決異步IO問題,從而大大地提高Tomcat對靜態文件的處理性能。
要tomcat支持apr,必須要安裝apr和native,這樣tomcat可以利用apache的apr接口,使用操作系統的部分本地操作,從而提升性能。
https://tomcat.apache.org/native-doc/ (官方文檔)
官方要求:
APR 1.2+ development headers (libapr1-dev package)
OpenSSL 1.0.2+ development headers (libssl-dev package)
JNI headers from Java compatible JDK 1.4+
GNU development environment (gcc, make)
1, 下載
yum install expat-devel gcc make lib* -y
wget http://apache.cs.utah.edu/apr/apr-1.6.3.tar.gz
wget http://apache.cs.utah.edu/apr/apr-util-1.6.1.tar.gz
weget https://www.openssl.org/source/openssl-1.1.1-pre7.tar.gz
2, 編譯 安裝
先編譯安裝 apr
cd /usr/local/src/apr-1.5.2
./configure --prefix=/usr/local/apr
make && make install
安裝 openssl
tar zxvf openssl-1.1.0f.tar.gz
cd openssl-1.1.0f
./config --prefix=/usr/local/openssl
make -j 4 && make install
安裝apr-util
cd /usr/local/src/apr-util-1.5.4
./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
make && make install
安裝 tomcat-native
cd /usr/local/src/tomcat-native-1.2.16-src/native
./configure --with-apr=/usr/local/apr --with-ssl=/usr/local/openssl
make && make install
3,設置 Tomcat 整合 APR
編輯$TOMCAT_HOME/bin/catalina.sh文件,在虛擬機啓動參數JAVA_OPTS中添加java.library.path參數,指定apr庫的路徑
JAVA_OPTS="$JAVA_OPTS -Djava.library.path=/usr/local/apr/lib/"
指定運行模式,將protocol從HTTP/1.1改成org.apache.coyote.http11.Http11AprProtocol
<Connector port="8080" protocol="org.apache.coyote.http11.Http11AprProtocol"
*** />
重啓tomcat
(3),JVM 調優:
這一點需要去了解較多的基礎知識,比如:瞭解堆棧內存,瞭解jvm 垃圾收集器,瞭解jvm 性能監控常用工具,能夠讀懂gc日誌 等。。這裏不詳細解讀。
jdk8 參考JVM 配置:
JDK 1.8中 PermSize 和 MaxPermGen 已經無效。JDK 1.8 中已經不存在永久代的結論 而以 元空間 代替。
修改 catalina.sh (4G 內存機器參考配置):
JAVA_OPTS="-Xms2G -Xmx2G -Xmn512m -XX:MetaspaceSize=512M -XX:MaxMetaspaceSize=512M -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -XX:+HeapDumpOnOutOfMemoryError -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -Xloggc:/appl/gc.log -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly"
參數解釋:
-Xms2G 初始分配的堆內存
-Xmx2G 最大允許分配的堆內存,這兩個配成一樣。
-Xmn512m 年輕代大小
-XX:MetaspaceSize=512M 初始元空間大小,達到該值就會觸發垃圾收集進行類型卸載,同時GC會對該值進行調整:如果釋放了大量的空間,就適當降低該值;如果釋放了很少的空間,那麼在不超過MaxMetaspaceSize時,適當提高該值。
-XX:MaxMetaspaceSize=512M
-XX:+UseConcMarkSweepGC 併發標記清除(CMS)收集器
-XX:+CMSClassUnloadingEnabled
-XX:+HeapDumpOnOutOfMemoryError 表示當JVM發生OOM時,自動生成DUMP文件。
-XX:HeapDumpPath=${目錄}參數表示生成DUMP文件的路徑,也可以指定文件名稱,例如:-XX:HeapDumpPath=${目錄}/java_heapdump.hprof。如果不指定文件名,默認爲:java_<pid><date><time>_heapDump.hprof。
-verbose:gc 輸出GC日誌 , -XX:+PrintGC 與 -verbose:gc 是一樣的,可以認爲-verbose:gc 是 -XX:+PrintGC的別名.
-XX:+PrintGCDetails 打印GC詳細信息
-XX:+PrintGCTimeStamps 打印gc時間戳
-XX:+PrintGCDateStamps
-Xloggc:/appl/gc.log 定義gc日誌目錄
-XX:CMSInitiatingOccupancyFraction=75 是指設定CMS在對內存佔用率達到75%的時候開始GC(因爲CMS會有浮動垃圾,所以一般都較早啓動GC);
-XX:+UseCMSInitiatingOccupancyOnly 只是用設定的回收閾值(上面指定的75%),如果不指定,JVM僅在第一次使用設定值,後續則自動調整
4,數據庫調優
mysql的 架構 、運行參數、分庫分表、sql優化等等。不具體闡述。
5,操作系統調優
硬件: CPU、內存、硬盤、帶寬 。 這個屬於 不差錢 性質的優化。人民幣玩家 不廢話。
系統:內核參數調. (最大 打開文件數、進程數,等)
linux 服務器,centons 7 .
(1),修改 最大打開文件數。 (linux 一切皆文件)
系統級打開最大文件句柄的數量 (一般 不做 調整,除非 併發 特別大 )
阿里雲 默認:
cat /proc/sys/fs/file-max
382457
騰訊雲 默認:
cat /proc/sys/fs/file-max
98544
永久生效的修改方法,修改文件,文件末尾加入配置內容:
# vim /etc/sysctl.conf
fs.file-max = 2000000
然後執行命令,使修改配置立即生效:
# sysctl -p
進程 級別 ,最大打開文件句柄數 設置。 (默認都小於 系統級的 大小)
在/etc/security/limits.conf 最後增加: (參考的 騰訊雲默認 配置)
* soft nproc 100001 #警告設定所有用戶最大打開進程數爲10001
* hard nproc 100001 # 嚴格設定所有用戶最大打開進程數爲100001
* soft nofile 100001 # 警告設定所有用戶最大打開文件數爲100001
* hard nofile 100002 # 嚴格設定所有用戶最大打開文件數爲100002
1soft 表示警告的設定,可以超過這個設定值,但是超過會有警告信息
2 hard 表示嚴格的設定,必定不能超過這個設定的值
修改以後,重新登錄後生效。
對於服務器,一般修改進程級的最大打開文件句柄數即可(系統默認1024,有點小)。一般不需要調整系統級的最大數。
如果出現了達到系統級別最大限制時,也需要同步調整系統級的最大數的。
(2)、TCP 相關參數優化。(參數太多,選取了 常見的幾個)
修改 /etc/sysctl.conf
生效: sysctl -p
net.ipv4.tcp_mem = 196608 262144 393216
#(4G 內存機器 使用,TCP連接最多約使用1.6GB內存 , 393216*4096/1024/1024=1.6G)
#內核分配給TCP連接的內存hh ,單位是Page,1 Page = 4096 Bytes
net.ipv4.tcp_mem = 524288 699050 1048576
#(8G 內存使用,TCP連接最多約使用4GB內存)
#爲每個TCP連接分配的讀、寫緩衝區內存大小,單位是Byte
net.ipv4.tcp_rmem = 4096 8192 4194304
net.ipv4.tcp_wmem = 4096 8192 4194304
# 最小內存 缺省內存 最大內存
# 一般按照缺省值分配,上面的例子就是讀寫均爲8KB,共16KB
#1.6G 內存服務器, TCP內存能容納的連接數,約爲 1600MB/16KB = 100K = 10萬
#4.G TCP內存能容納的連接數,約爲 4000MB/16KB = 250K = 25萬
net.core.somaxconn= 4000
#(端口最大的監聽隊列的長度)
#同時,修改下全局配置
# echo 4000 > /proc/sys/net/core/somaxconn 定義了系統中每一個端口最大的監聽隊列的長度,這是個全局的參數,默認值爲128,
net.ipv4.tcp_syncookies = 1
#表示開啓SYN Cookies。當出現SYN等待隊列溢出時,啓用cookies來處理,可防範少量SYN攻擊,默認爲0,表示關閉;
net.ipv4.tcp_tw_reuse = 1
#表示開啓重用。允許將TIME-WAIT sockets重新用於新的TCP連接,默認爲0,表示關閉;
net.ipv4.tcp_tw_recycle = 1
#表示開啓TCP連接中TIME-WAIT sockets的快速回收,默認爲0,表示關閉;
net.ipv4.tcp_fin_timeout = 30
#修改系統默認的 TIMEOUT 時間。
net.ipv4.tcp_keepalive_time = 1200
#表示當keepalive起用的時候,TCP發送keepalive消息的頻度。缺省是2小時,改爲20分鐘。
net.ipv4.ip_local_port_range = 10000 65000
#表示用於向外連接的端口範圍。缺省情況下很小:32768到61000,改爲10000到65000。
#(注意:這裏不要將最低值設的太低,否則可能會佔用掉正常的端口!)
net.ipv4.tcp_max_syn_backlog = 8192
#表示SYN隊列的長度,默認爲1024,加大隊列長度爲8192,可以容納更多等待連接的網絡連接數。
net.ipv4.tcp_max_tw_buckets = 5000
#表示系統同時保持TIME_WAIT的最大數量,如果超過這個數字,TIME_WAIT將立刻被清除並打印警告信息。默 認爲180000,改爲5000。
net.ipv4.tcp_max_orphans = 65536
#當orphans達到32768個時,會報Out of socket memory,此時佔用內存 32K*64KB=2048MB=2GB
#(每個孤兒socket可佔用多達64KB內存),實際可能小一些
net.ipv4.tcp_orphan_retries = 1
#孤兒socket廢棄前重試的次數,重負載web服務器建議調小,設置較小的數值,可以有效降低orphans的數量
net.ipv4.tcp_retries2
#活動TCP連接重傳次數,超過次數視爲掉線,放棄連接。缺省值:15,建議設爲 2或者3.
net.ipv4.tcp_synack_retries
#TCP三次握手的syn/ack階段,重試次數,缺省5,設爲2-3
net.core.netdev_max_backlog = 2048
# 網絡設備的收發包的隊列大小