2018年06月20日 18:08:47 張震在 閱讀數:767 標籤: tomcatcentos7jvm調優優化 更多前端
我的分類: tomcatjava
不要單純爲了調優而去調優,應該有針對性的去發現不足,解決問題,以提升性能。mysql
因此,調優的前提是作好各類監控分析,包括服務器基礎資源使用、各個應用運行情況、代碼質量、數據庫情況、等等,根據業務的併發,服務器資源,以及存在的問題,有針對性的去優化。linux
==========正文==============nginx
性能的提高,主要從如下幾個方面入手:web
負載均衡,高可用,nginx + tomcat 動靜分離,容器化 等, 不具體闡述sql
(1),代碼編寫規範。數據庫
(2),pmd 、findbug、sonar 等工具,檢測問題,並優化。 不具體闡述。apache
打開被註釋的默認鏈接池配置vim
默認配置:
<!--
<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" />
-->
(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
這一點須要去了解較多的基礎知識,好比:瞭解堆棧內存,瞭解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僅在第一次使用設定值,後續則自動調整
mysql的 架構 、運行參數、分庫分表、sql優化等等。不具體闡述。
硬件: 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
# 網絡設備的收發包的隊列大小