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

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

2018年06月20日 18:08:47 張震在 閱讀數:767 標籤: tomcatcentos7jvm調優優化 更多前端

我的分類: tomcatjava

不要單純爲了調優而去調優,應該有針對性的去發現不足,解決問題,以提升性能。mysql

因此,調優的前提是作好各類監控分析,包括服務器基礎資源使用、各個應用運行情況、代碼質量、數據庫情況、等等,根據業務的併發,服務器資源,以及存在的問題,有針對性的去優化。linux

==========正文==============nginx

性能的提高,主要從如下幾個方面入手:web

1,架構調優

負載均衡,高可用,nginx + tomcat  動靜分離,容器化 等, 不具體闡述sql

2 ,代碼調優

(1),代碼編寫規範。數據庫

(2),pmd 、findbug、sonar 等工具,檢測問題,並優化。 不具體闡述。apache

3,tomcat 相關參數優化,jvm調優。

(1),鏈接數,線程數,緩存,修改server.xml。

打開被註釋的默認鏈接池配置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" />

-->

(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

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

相關文章
相關標籤/搜索