Tomcat 性能優化
硬件資源優化
比如內存,硬盤
架構上的優化
利用緩存和壓縮 在nginx前端
做動靜分離 緩解tomcat壓力
搭建集羣 採用nginx請求分流
JVM參數調優
優化文件: /usr/local/tomcat/bin/catalina.sh
CATALINA_OPTS="
server
Xms6000M
Xmx6000M
Xss512k
XX:NewSize=2250M
XX:MaxNewSize=2250M
XX:PermSize=128M
XX:MaxPermSize=256M
XX:+AggressiveOpts
XX:+UseBiasedLocking
XX:+DisableExplicitGC
XX:+UseParNewGC
XX:+UseConcMarkSweepGC
XX:MaxTenuringThreshold=31
XX:+CMSParallelRemarkEnabled
XX:+UseCMSCompactAtFullCollection
XX:LargePageSizeInBytes=128m
XX:+UseFastAccessorMethods
XX:+UseCMSInitiatingOccupancyOnly
Duser.timezone=Asia/Shanghai
Djava.awt.headless=true"
參數的詳細配置,參考:http://blog.51cto.com/zhongliang/2101918
Tomcat 參數優化
這裏着重講解tomcat參數的優化:server.xml文件,
關閉DNS查詢、配置最大併發等參數。
maxThreads:tomcat起動的最大線程數,即同時處理的任務個數,默認值爲200
acceptCount:當tomcat起動的線程數達到最大時,接受排隊的請求個數,默認值爲100
當然這些值都不是越大越好,需要根據實際情況來設定。可以基於測試的基礎上來不斷的調優分析。
<Connector port="8080"
protocol="org.apache.coyote.http11.Http11NioProtocol"
connectionTimeout="20000" 連接超時
redirectPort="8443"
maxThreads="500" 最大線程 就是最大併發數
minSpareThreads="20" 最小空閒線程數
acceptCount="100" 隊列大小 等待處理的
disableUploadTimeout="true" 類似於Apache中的keeyalive一樣
enableLookups="false" 關閉DNS查詢
URIEncoding="UTF-8" />
maxSpareThreads : 最大空閒線程數
acceptCount是當線程數達到maxThreads後,後續請求會被放入一個等待隊列,這個acceptCount是這個隊列的大小,如果這個隊列也滿了,就直接refuse connection
壓縮compression=”on” compressionMinSize=”2048″ compressableMimeType=”text/html,text/xml,text/javascript,text/css,text/plain”
外部調優
禁用DNS查詢
調整線程數(線程池)
maxThreads="600" 最大線程數
minSpareThreads="100" 初始化時創建的線程數
maxSpareThreads="500" 一旦創建的線程越過這個值,Tomcat就會關閉不再需要的socket線程
acceptCount="700" 指定當所有可以使用的處理請求的線程數都被使用時,可以放到處理隊列中的請求數,超過這個數的請求將不予處理
java工具 監控和管理控制檯
在windows端安裝jdk包,找到以下命令
在c:\ Program Files\jdk\bin\jconsole.exe 監控和管理控制檯
通過IP:端口連接到監控和JAVA控制檯
在c:\ Program Files\jdk\bin\jvisualvm.exe
通過IP:端口連接 管理工具
在tomcat服務器上修改配置文件
catalina.sh中加入配置,放置在#!/bin/bash標籤下
vim /usr/local/tomcat8/bin/catalina.sh
!/bin/bash
CATALINA_OPTS="$CATALINA_OPTS
Djava.rmi.server.hostname=10.204.3.7
Dcom.sun.management.jmxremote
Dcom.sun.management.jmxremote.port=12345
Dcom.sun.management.jmxremote.authenticate=true
Dcom.sun.management.jmxremote.ssl=false
Dcom.sun.management.jmxremote.pwd.file=/usr/local/jdk1.7/jre/lib/management/jmxremote.password"
配置權限文件
cd /usr/local/jdk1.7/jre/lib/management/
cp jmxremote.password.template jmxremote.password
vi jmxremote.password
zhongliang 123456 # 用戶名zhongliang 密碼249765270
chmod 600 jmxremote.password
重啓tomcat服務,開啓監聽端口12345
連接jconsole和jvisualvm
輸入遠程主機:端口 10.204.3.7:12345
選擇文件—》添加JMX..連接—》10.204.3.7:12345
CPU使用情況 堆,垃級回收 抽樣器
實時線程數
注意:在控制檯上執行GC清理的時候,會出現前端斷連
Zabbix監控tomcat
zabbix編譯的時候,指定--enable-java
yum安裝的時候,yum install zabbix-java
vim zabbix_server.conf
JavaGateway=192.168.3.14
JavaGatewayPort=10052
StartJavaPollers=5
第三方工具,cmdline-jmxclient
http://crawler.archive.org/cmdline-jmxclient/
Apache整合tomcat
安裝httpd
安裝tomcat
編譯生成mod_jk。
下載tomcat-connectors-1.2.42-src.tar.gz包
Wget -c https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-connectors/jk/tomcat-connectors-1.2.42-src.tar.gz
tar xzvf tomcat-connectors-1.2.42-src.tar.gz
cd tomcat-connectors-1.2.42/native
./configure --with-apxs=/usr/local/apache2/bin/apxs
make
cp ./apache-2.0/mod_jk.so /usr/local/apache/modules/
配置。
在/usr/local/apache/conf/下面建立兩個配置文件mod_jk.conf和workers.properties。
vi mod_jk.conf#######################
添加以下內容:
指出mod_jk模塊工作所需要的工作文件workers.properties的位置
JkWorkersFile /usr/local/apache/conf/workers.properties
Where to put jk logs
JkLogFile /usr/local/apache/logs/mod_jk.log
Set the jk log level [debug/error/info]
JkLogLevel info
Select the log format
JkLogStampFormat "[%a %b %d %H:%M:%S %Y]"
JkOptions indicate to send SSL KEY SIZE,
JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories
JkRequestLogFormat set the request format
JkRequestLogFormat "%w %V %T"
將所有servlet 和jsp請求通過ajp13的協議送給Tomcat,讓Tomcat來處理
JkMount /servlet/* worker1
JkMount /*.jsp worker1
.
vi workers.properties###########################
添加以下內容:
Defining a worker named worker1 and of type ajp13
worker.list=worker1
Set properties for worker1
worker.worker1.type=ajp13
worker.worker1.host=localhost
worker.worker1.port=8009
worker.worker1.lbfactor=50
worker.worker1.cachesize=10
worker.worker1.cache_timeout=600
worker.worker1.socket_keepalive=1
worker.worker1.socket_timeout=300
.
整合apache和tomcat
Vim httpd.conf#############
DirectoryIndex index.jsp index.html
添加index.jsp
LoadModule jk_module modules/mod_jk.so
加載mod_jk.so模塊
Include /usr/local/apache/conf/mod_jk.conf
引入配置文件
將tomcat和apache的發佈目錄設置成一致。建立站點文件index.jsp
Nginx整合Tomcat 集羣
T_INSTALL_DIR=/usr/local/tomcat
Port=`export 8005+1`
複製多個tomcat到tomcat1 tomcat2 tomcat3
修改對應每個發佈目錄的端口
安裝nginx
tar zxvf nginx-1.7.8.tar.gz //解壓
cd nginx-1.7.8
./configure --with-http_stub_status_module --with-http_ssl_module//啓動server狀態頁和https模塊
make && make install
修改nginx.conf配置文件,添加一個location
location ~ \.(jsp|do)$ {
index index.jsp;
proxy_pass http://192.168.74.129:8081; //來自jsp或者do的後綴的請求交給tomcat處理</span>
proxy_redirect off;
proxy_set_header Host $host; //後端的Web服務器可以通過X-Forwarded-For獲取用戶真實IP
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10m; //允許客戶端請求的最大單文件字節數
client_body_buffer_size 128k; //緩衝區代理緩衝用戶端請求的最大字節數
proxy_connect_timeout 90; //nginx跟後端服務器連接超時時間
proxy_read_timeout 90; //連接成功後,後端服務器響應時間
proxy_buffer_size 4k; //設置代理服務器(nginx)保存用戶頭信息的緩衝區大小
proxy_buffers 6 32k; //proxy_buffers緩衝區,網頁平均在32k以下的話,這樣設置
proxy_busy_buffers_size 64k;//高負荷下緩衝大小(proxy_buffers*2)
proxy_temp_file_write_size 64k; //設定緩存文件夾大小,大於這個值,將從upstream服務器傳
}
Tomcat故障
日誌文件
/usr/local/tomcat/logs/catalina.out
【注】:tomcat查端口時正常,服務正常,但訪問後,服務消失,
問題原因:因爲配置文件不正確,導致報錯,服務自動停止
解決方法:檢查配置文件
例如:配置文件中沒有定義發佈目錄,但是發佈目錄中的ROOT已被刪除,會導致此類問題發生
15.1 cannot execute binary file
/usr/local/tomcat8/bin/catalina.sh: line 433: /usr/local/jdk1.8/bin/java: cannot execute binary file
[root@tomcat01 local]# java --version
bash: /usr/local/jdk1.8/bin/java: cannot execute binary file
原因:軟件版本與系統版本不一致
15.2 insufficient free space available after evicting expired cache entries-consider increasing the maximum size of the cache.
tomcat部署jenkins啓動報錯:
insufficient free space available after evicting expired cache entries-consider increasing the maximum size of the cache.
解決該問題方法,修改tomcat/conf/context.xml文件,增加資源最大可緩存的大小:
<Resources
cachingAllowed="true"
cacheMaxSize="102400"
/>