分佈式架構 Tomcat優化

分佈式架構 Tomcat優化


Tomcat 模式策略
tomcat

Tomcat優化簡介

1.Tomcat默認配置已優化過,主要根據業務場景調整其內存配置,需要JVM基礎,本 文不在闡述,合理分配Tomcat內存,優化 Tomcat啓動設置catalina.sh中的 JAVA_OPTS,常見參數如下

  • -server :啓動JDK的Server版 -Xms:虛擬機初始化最小內存
    -Xmx:虛擬機可使用最大內存(建議物理內存80%)
    -Xmn:新生代內存,一般設置爲Xmx的3、4分之一
    -XX:PermSize:持久帶初始值
    -XX:MaxPermSize:持久帶最大內存(默認32M)
    -XX:MaxNewSize:新生代最大內存(默認16M)
    -Xss1024k 設置線程大小
    -XX:+HeapDumpOnOutOfMemoryError ,系統發生內存溢出,生產dump文件
    -XX:-OmitStackTraceInFastThrow 強制要求JVM始終拋出含堆棧的異常
    -XX:-+DisableExplicitGC 禁止system.gc
    -XX:SurvivorRatio Eden區域和Survivor區域佔比,如等於8,8:1:1

參數說明:

  • 正常情況設置-Xms、-Xmx相等避免每次GC後調整堆大小,因默認空餘堆內存小於40%時,JVM會增大堆直到-Xmx的最大限制,空餘堆內存大於70%時,JVM會減少堆直到-Xms的最小限制
  • 查看堆內存是否生效,jmap -heap tomcat進程號

2.Tomcat本身配置優化,server.xml中配置端口 配置

  • 1.maxConnections 最大連接數,對於BIO模式默認等於maxThreads,對於NIO模式默認10000,對於APR/native 默認是8192
  • 2.maxThreads 最大線程數,即同時處理任務個數,默認是200
  • 3.acceptCount 當處理任務線程數達到最大時,接收隊列請求個數,默認是100
  • 4.maxQueueSize: 最大的等待隊列數,超過則拒絕請求
  • 5.maxHttpHeaderSize:默認4K,http請求響應的Header的最大限制,(Nginx/F5由於Http頭部小而導致出現400問題)
  • 6.maxPostSize:設置由容器解析的URL參數的最大長度,-1(小於0)爲禁用這個屬性,默認爲2097152(2M),0是不限制。nginx-設置client_max_body_size,0不限制,Jetty–》200K
  • 7.compression:啓用gzip壓縮
  • 8.noCompressionUserAgents:排除瀏覽器
  • 9.compressionMinSize:超過這個大小進行壓縮,默認2048(2k)
  • 10.compressableMimeType:需要壓縮的response類型,根據情況設置
  • 11.URIEncoding :Tomcat在解析參數的時候(UTF-8)去解碼,默認ISO-8859-1
  • 12.connectionTimeout 網絡連接超時,單位毫秒,設置-1永不超時

3. 單臺Tomcat優化到瓶頸後,搭建Tomcat集羣,組合提供外界服務

優化說明:

可參考官網 https://tomcat.apache.org/tomcat-8.0-doc/config/http.html#NIO2_specific_configuration

  • 如果要加大併發連接數,應該同時增大maxThreads和acceptCount,建議設置一樣
  • WebServer允許最大連接數還受限於操作系統內核參數,通過 ulimit -a 查看(open files默認1024)
  • protocol 有三種模式BIO/NIO/APR,參考頂部上圖
    BIO 最穩定最老一種連接器,採同步阻塞方式,每個線程綁定每個http請求,直到http請求響應返回,如果http客戶端請求是keep-alive
    連接一直保持直到到達timeout超時,期間不能用於其它請求處理。綜合性能較低
    NIO是java的同步非阻塞I/O技術
    NIO2是java-jdk1.7以後推出異步非阻塞I/O技術
    APR是是C語言編寫的非阻塞I/O,需要安裝apr和native,安裝啓動後支持,大幅度可以提高性能
    安裝如下
    http://apr.apache.org/download.cgi下載
    進入cd apr-1.5.0/
    ./configura --prefix=/usr/local/apr
    make、make install
    安裝apr-iconv
    進入cd apr-iconv-1.5.3/
    ./configura --prefix=/usr/local/apr-iconv --with-apr=/usr/local/apr
    make、make install
    安裝apr-util
    進入cd apr-util-1.5.3/
    ./configura --prefix=/usr/local/apr-util --with-apr=/usr/local/apr --with-iconv=/usr/local/apr-iconv/bin/apriconv
    make、make install
    安裝tomcat-native,tomcat-bin下自帶
    tar zxvf tomcat.native.tar.gz
    cd tomcat-native-1.1.29-src/jni/native
    ./configura --with-apr=/usr/local/apr
    make、make install
    安裝完畢後設置apr環境變量
    進入tomcat-bin,打開catalina.sh 在文件的#!/bin/sh添加內容,不會破壞tomcat其它環境配置,如下:
    LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/apr/lib export LD_LIBRARY_PATH
    設置protocol 爲apr模式後啓動tomcat,可以查看日誌
    init Load APR based Apache Tomcat Native…

筆者本地通過3種模式多次測試,結果如下
./ab -n1000 -c100 http://localhost:8080/demo/query
BRO / NIO / NIO2 /APR
400 450 570 600

擴充Tomcat集羣知識
多個Tomcat之間組合一起,協同完成工作,要做集羣面臨http session等問題,如何在多個Tomcat都有效?
tc1

tc2

  • 使用Tomcat自帶cluster方式,多個tomcat之間實時複製session信息,優點:配置簡單,缺點:併發情況效率低
    利用前端代理服務器某些策略,比如Nginx基於IP的HASH路由策略,保證相同IP從始至終路由到同一個Tomcat上,優點:配置簡單,缺點: 容易造成熱點訪問,存在單點風險。
    多個同個局域網公網IP發起請求可能都會訪問到TC1,一旦TC1掛掉,Session數據會丟失

  • Tomcat的session集中管理,存儲到公有緩存中如:redis,前端利用Nginx做負載均衡,優點:系統可以進行水平擴展,同時可保證較高的性能,目前比較成熟 spring-session運用此原理

筆者推薦使用第二種,穩定性能高

總結:

Tomcat優化,分爲兩方面,jvm參數調優、Tomcat運行模式及參數調優。針對不同系統調整相關參數後需要進行壓力測試,找到穩定峯值平衡點。
筆者建議 優化順序
1.優化單臺
2.單臺瓶頸後,搭建集羣多臺提供外界服務

作者簡介:張程 技術研究

更多文章請關注微信公衆號:zachary分解獅 (frankly0423)

在這裏插入圖片描述

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