tomcat 8 9 性能 優化 調優 centos 7 linux

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

wget http://mirror.bit.edu.cn/apache/tomcat/tomcat-connectors/native/1.2.16/source/tomcat-native-1.2.16-src.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

# 網絡設備的收發包的隊列大小

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章