tomcat配置調優與安全總結

原創做品,容許轉載,轉載時請務必以超連接形式標明文章 原始出處 、做者信息和本聲明。不然將追究法律責任。 http://vekergu.blog.51cto.com/9966832/1672931

tomcat配置調優與安全總結javascript

    做爲運維,避免不了與tomcat打交道,然而做者發現網絡上關於tomcat配置和調優安全的文章很是散,經過參考各位大神的相關技術文檔,根據做者對tomcat的運維經驗,總結了一些tomcat的基礎運維注意事項,但願對廣大技術兄弟們有些幫助。css

    本篇文章只是對tomcat模板的基礎調優,除了部署tomcat的各系統環境和配置,影響tomcat併發和性能的另外一大重要因素,就是java的代碼工程,而如何在生產中優化java工程,這個就須要運維與開發共同配合,尤爲是運維須要有開發與運維是同一個團隊的意識,只有雙方配合默契才能發揮最大戰力,要知道一我的的力量永遠是有限的,只有團隊合做才能爆發出真正力量!html

     而包含了Java工程的總體優化就設計到總體的架構優化,這個更加是一個細緻而有趣的過程,也是運維通向架構師的一個必經之路!前端

    

1      功能優化

1.1     硬件資源對tomcat的影響

    

    做者實測,在阿里雲的不一樣區域部署相同系統應用配置的tomcat,在壓測時會出現吞吐量差別達到1/4,通過對比發現,兩個區域的cpu頻率2.2GHz和2.6Ghz。系統硬件性能直接影響tomcat的併發量,起決定做用的是CPU和MEM,CPU運行速度提高,會帶來tomcat響應時間的縮短,mem大小決定工程須要內存的大小和工程的併發數量。

1.2     Java虛擬機調優

   

1.2.1     JDK版本選擇

    若是新手請選擇SUN的JVM,在知足項目須要的前提下,儘可能選用版本較高的JVM,通常來講高版本產品在速度和效率上比低版本會有改進。 JDK1.4比JDK1.3性能提升了近10%-20%,JDK1.5比JDK1.4性能提升25%-75%。 所以對性能要求較高的狀況推薦使用 JDK1.6java

    這裏須要補充的是,各位在打算升級JVM時,必定要先讓開發先試用高版本的JVM,調試高版本JVM對工程的影響,通過測試後逐步部署到測試環境,通過必定時間的驗證,發現沒有問題後再謹慎的更換到生產。JVM版本不一致,很容易出現各種異常,對待生產,謹慎永遠是第一原則!nginx

   JVM調優參見:http://vekergu.blog.51cto.com/9966832/1626733web

1.2.2     JDK參數優化

    Tomcat內存優化主要是對 tomcat 啓動參數優化,咱們能夠在 tomcat 的啓動腳本 catalina.sh 中設置 JAVA_OPTS參數。shell

1.   JAVA_OPTS參數說明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
-server 啓用jdk 的 server 版; 
-Xms   java虛擬機初始化時的最小內存; 
-Xmx  java虛擬機可以使用的最大內存; 
-XX:PermSize    內存永久保留區域 
-XX:MaxPermSize   內存最大永久保留區域 
-Xms=-Xmx=服務器內存*70%,如部署tomcat,jboss在同一臺服務器-Xms=-Xmx=服務器內存*80%*1 /4 ,現公司服務器內存通常均可以加到最大4G,因此能夠採起如下配置,把如下參數添加到catalina.sh裏面,
  JAVA_OPTS= '-Xms1024m -Xmx4096m -XX:PermSize=256M -XX:MaxNewSize=256m-XX:MaxPermSize=256m'
  
#-Xmx6000m                        :設置JVM最大可用內存爲6000MB
#-Xms6000m                        :設置JVM初始可用內存爲6000MB
#-Xmn2g                              :設置年輕代大小爲2G
#-Xss128k                             :設置每一個線程的堆棧大小爲128k
#-XX:NewRatio=4                 :設置年輕代與年老代的比值爲4
#-XX:SurvivorRatio=4            :設置年輕代中Eden區與Survivor區的大小比值爲4
#-XX:PermSize=512m                    :設置堆棧永久區起始大小爲512m
#-XX:MaxPermSize=512m             :設置堆棧永久區最大大小爲512m
#-XX:MaxTenuringThreshold=0     :設置垃圾最大年齡爲0
#-XX:+UseParallelGC                     :選擇垃圾收集器爲並行收集器
#-XX:ParallelGCThreads=8             :配置並行收集器的線程數
#-XX:+UseParallelOldGC                :配置年老代垃圾收集方式爲並行收集
#-XX:+UseAdaptiveSizePolicy     :並行收集器會自動選擇年輕代區大小和相應的Survivor區比例,以達到目標系統規定的最低響應時>間或者收集頻率等,此值建議使用並行收集器時,一直打開。

 

 

1.2.3     生產案例

    根據做者本人的經驗,生產環境須要肯定對JVM的設置,仍是須要根據java的運行狀態,經過監控後,不斷的調試的一個過程,沒有那個配置一上來就能夠適應全部的場景。如下就舉列做者經常使用的一個JVM配置方式:apache

1
2
3
4
5
6
7
8
9
10
11
12
13
14
JAVA_OPTS="
-server 
-Xms1024m
-Xmx1024m
-Xmn384m
-XX:PermSize=64m
-XX:MaxPermSize=128m
-XX:+UseParallelOldGC
-XX:+PrintGCDateStamps
-XX:+PrintGCDetails
-Xloggc: /opt/tomcat/log/gc .log
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath= /opt/tomcat/heap .bin"
說明:

 

1.   Xms與Xmx廣泛選擇配置相同的大小,實際大小根據實際狀況調整,由小向大增長,不必一開始就增長到很大的內存。

2.   XX:PermSize設置堆棧永久區起始大小,XX:MaxPermSize設置堆棧永久區最大大,其實設置比默認值大寫便可,或者默認也能夠。做者這個這兩個值,是由於出現過永久區內存溢出,才進行設定的。

3.   UseParallelOldGC、PrintGCDateStamps、PrintGCDetails、Xloggc:/opt/tomcat/log/gc.log設置GClog日誌,這個對分析tomcat中JVM內存使用狀況很是有效。

4.   XX:+HeapDumpOnOutOfMemoryError、XX:HeapDumpPath=/opt/tomcat/heap.bin"設置內存溢出時,輸出HeapDump,具體如何使用分析HeapDump文件,請參考:http://vekergu.blog.51cto.com/9966832/1619640

5.   做者對JVM參數設置的作法,調整合適的JVM內存大小,開啓GClog和HeapDump便可。

1.3     tomcat集羣之session共享

1.3.1     基於tomcat集羣的session共享

 在{TOMCST_HOME}/conf/server.xml取消下面代碼註釋便可:瀏覽器

1
<ClusterclassName= "org.apache.catalina.ha.tcp.SimpleTcpCluster" />

 

1.3.2     基於memcached存儲session共享

 具體配置方法見:http://vekergu.blog.51cto.com/9966832/1672833

1.4     站點的默認網頁、自定義錯誤頁面、禁止列目錄等功能

    這些功能開發會在工程的WEB-INF目錄下的web.xml中設置,運維瞭解下就好,者遇到相似問題能夠找到解決思路。

1.4.1     默認主頁

1
2
3
4
5
    <welcome- file -list>
        <welcome- file >index.html< /welcome-file >
        <welcome- file >index.htm< /welcome-file >
        <welcome- file >index.jsp< /welcome-file >
    < /welcome-file-list >

1.4.2     自定義錯誤頁面

1
2
3
4
<error-page> 
<error-code> 404 </error-code> 
<location>/ 404 .htm</location> 
</error-page>

 

1.4.3     定義會話超時時間

1
2
3
    <session-config>
        <session-timeout> 30 </session-timeout>
    </session-config>

1.4.4     禁止列目錄

1
2
3
4
        <init-param>
            <param-name>listings</param-name>
            <param-value> false </param-value>
        </init-param>

1.5     管理AJP端口

    AJP是爲 Tomcat 與 HTTP 服務器之間通訊而定製的協議,能提供較高的通訊速度和效率。若是tomcat前端放的是apache的時候,會使用到AJP這個鏈接器。因爲咱們公司前端是由nginx作的反向代理,所以不使用此鏈接器,所以須要註銷掉該鏈接器。在{TOMCST_HOME}/conf/server.xml中找到下列代碼,註釋便可

1
2
3
          <!--
    <Connector port= "8009"  protocol= "AJP/1.3" redirectPort= "8443"  />
-->

1.6     取消默認gc監聽

    若是開啓了GClog,再開啓GC監聽,會影響GClog輸出,功能重複,能夠選擇取消。

1
2
  <!-- 內存泄露偵測,對於垃圾回收不能處理的對像,它就會作日誌,開啓gcc後,不須要這個功能-->
  <!-- ListenerclassName= "org.apache.catalina.core.JreMemoryLeakPreventionListener" gcDaemonProtection= "false" / -->

 

1.7   自定義tomcat代碼路徑(2015-7-21新增

1
<Context docBase= "/code_path/code_file" path= "/code_file "  reloadable= "false"  />

其中:

docBase這個是你代碼的路徑

path這個是你訪問網站的URL路徑,要區別path的意義,請看下面的舉例

 

舉例:

1
2
3
4
5
訪問www.aaa.com
<Context docBase= "/code_path/code_file" path= " "  reloadable= "false"  />
  
訪問www.aaa.com /code_file
<Context docBase= "/code_path/code_file" path= "/code_file "  reloadable= "fasle"  />

reloadable若是爲true,會自動加載變化的動態文件,看起來挺智能的,可是,tomcat加載變化代碼的時候有可能會出現內存溢出,tomcat服務不正常等異常,建議仍是false掉,更新完代碼腳本重啓tomcat纔是王道。

     此前看到一些文章,在講解自定義tomcat代碼路徑時,reloadable所有是true,可能能多小夥伴都設置爲true,建議對這個參數認真對待,不然一不當心就是一個坑。。。。

 

2      性能優化

2.1     屏蔽DNS查詢

    Web應用程序能夠經過Web容器提供的getRemoteHost()方法得到訪問Web應用客戶的IP地址和名稱,可是這樣會消耗Web容器的資源,而且還須要經過IP地址和DNS服務器反查用戶的名字。所以當系統上線時,能夠將這個屬性關閉,從而減小資源消耗,那麼Web應用也就只能記錄下IP地址。修改的屬性是enableLoopups="false"

2.2     調整線程數

    Tomcat經過線程池來爲用戶訪問提供響應,對於上線的系統初步估計用戶併發數量後,再調整線程池容量。例如,用戶併發數量在100左右時,能夠設置minProcessors="100",maxProcessors="100"。將最大和最小設置爲同樣後,線程池不會再釋放空閒的線程,當用戶訪問忽然增長時,不須要再消耗系統資源去建立新的線程。

2.3     調整最大鏈接數

   這個其實最複雜,即便用戶併發量大,可是系統反應速度快,也不必把這個值設置過高,高了系統須要消耗大量的資源去切換線程,可是若是設置過低也會形成應用沒法知足用戶併發須要。所以設置這個最好可以結合整個系統的跟蹤與調優,使系統達到最好的平穩狀態,通常設置爲maxProcessors的1.5倍便可。

2.4     調整網絡超時

    主要是HTTP協議也有個鏈接過程,客戶端鏈接到服務器上後,若是長時間沒有獲得處理就會被釋放。若是服務器處理速度較慢,可是但願每一個用戶都能獲得有效處理,或者網絡環境很差,須要保證用戶不會由於超時中斷,也能夠把時間加長。可是通常設置成connectionTimeout="30000"便可。太長對系統來講價值不大,反而會浪費系統資源在無謂的長鏈接上。

2.5     壓縮管理

    tomcat做爲一個應用服務器,也是支持 gzip 壓縮功能的。咱們能夠在 server.xml 配置文件中的 Connector 節點中配置以下參數,來實現對指定資源類型進行壓縮。

 

1
2
3
4
   compression= "on"             # 打開壓縮功能
   compressionMinSize= "50"      # 啓用壓縮的輸出內容大小,默認爲2KB
   noCompressionUserAgents= "gozilla, traviata"       # 對於如下的瀏覽器,不啓用壓縮
   compressableMimeType= "text/html,text/xml,text/javascript,text/css,text/plain" # 哪些資源類型須要壓縮

若是使用apache/nginx代理,因此tomcat自身不須要進行壓縮,會給服務器增長壓力

2.6     tomcat的三種運行模式選擇

2.6.1     Bio

默認的模式,性能很是低下,沒有通過任何優化處理和支持。

2.6.2     Nio

利用java的異步io護理技術,no blocking IO技術.

 

想運行在該模式下,直接修改server.xml裏的Connector節點,修改protocol

 

1
2
3
4
5
6
  <Connector port= "80"  protocol= "org.apache.coyote.http11.Http11NioProtocol"
          connectionTimeout= "20000"
          URIEncoding= "UTF-8"
          useBodyEncodingForURI= "true"
          enableLookups= "false"
          redirectPort= "8443" />

啓動後,就能夠生效。

2.6.3     Apr

安裝起來最困難,可是從操做系統級別來解決異步的IO問題,大幅度的提升性能.。必需要安裝apr和native,直接啓動就支持apr

 

安裝APR

1
2
3
4
5
6
sudo  yum -y  install  apr  apr-devel
tar  zxvf tomcat-native. tar .gz  // 該文件在tomcat的bin目錄下面
cd  tomcat-native-1.1.24-src /jni/native
. /configure--with-apr = /usr/bin/apr-1-config
make
make  install

 

安裝完成以後 會出現以下提示信息

Libraries have been installed in:

/usr/local/apr/lib

 

安裝成功後還須要對tomcat設置環境變量,方法是在catalina.sh文件中增長一 行:

1
2
3
CATALINA_OPTS= "-Djava.library.path=/usr/local/apr/lib"
修改8080端對應的
protocol= "org.apache.coyote.http11.Http11AprProtocol"

2.7     Tomcat鏈接相關參數總結

在Tomcat 配置文件 server.xml 中的 <Connector ... /> 配置中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
maxThreads 客戶請求最大線程數
minSpareThreads    Tomcat初始化時建立的 socket 線程數
maxSpareThreads   Tomcat鏈接器的最大空閒 socket 線程數
enableLookups      若設爲 true , 則支持域名解析,可把 ip 地址解析爲主機名
redirectPort        在須要基於安全通道的場合,把客戶請求轉發到基於SSL 的 redirectPort端口
acceptAccount       監聽端口隊列最大數,滿了以後客戶請求會被拒絕(不能小於maxSpareThreads  )
connectionTimeout   鏈接超時
minProcessors         服務器建立時的最小處理線程數
maxProcessors        服務器同時最大處理線程數
URIEncoding    URL統一編碼
compression 打開壓縮功能  
compressionMinSize   啓用壓縮的輸出內容大小,這裏面默認爲2KB
compressableMimeType 壓縮類型
connectionTimeout 定義創建客戶鏈接超時的時間. 若是爲 -1, 表示不限制創建客戶鏈接的時間

 

 

2.8     生產配置實例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<Connector port= "8080"  protocol= "org.apache.coyote.http11.Http11NioProtocol"    #nio  利用java的異步io護理技術,noblocking IO技術.
         URIEncoding= "UTF-8"     #設置編碼
         minSpareThreads= "25"   #Tomcat初始化時建立的 socket線程數
         maxSpareThreads= "75"   #Tomcat鏈接器的最大空閒socket 線程數,一旦建立的線程超過這個值,Tomcat就會關閉再也不須要的socket線程。默認值50
         enableLookups= "false"   #屏蔽DNS查詢
         disableUploadTimeout= "true"   #該標誌位代表當執行servlet時,是否容許servlet容器使用一個不一樣的、更長的鏈接超時。啓用該標誌位將致使在上傳數據時,要麼使用更長的時間完成上傳,要麼出現更長的超時。若是不指定,該屬性爲「false」。       
         connectionTimeout= "20000"    #網絡超時時間
         acceptCount= "300"      #允許的最大鏈接數,通常設置爲maxProcessors的1.5倍便可,滿了以後客戶請求會被拒絕(不能小於maxSpareThreads  )
         maxThreads= "300"      #客戶請求最大線程數,默認值爲「200」
         maxProcessors= "1000"    #最大鏈接線程數,即:併發處理的最大請求數,默認值爲75 ,一旦建立的線程超過這個值,Tomcat就會關閉再也不須要的socket線程
         minProcessors= "5"       #最小空閒鏈接線程數,用於提升系統處理性能,默認值爲10
         useURIValidationHack= "false"
         <!--   前端使用nginx做爲反向代理,不須要啓用tomcat壓縮功能。
         compression= "on"    #打開壓縮功能
         compressionMinSize= "2048"  #啓用壓縮的輸出內容大小,這裏面默認爲2KB
         compressableMimeType= "text/html,text/xml,text/javascript,text/css,text/plain"    #壓縮類型
         -->
         redirectPort= "8443" />

             

3      安全優化

3.1     tomcat影藏版本信息

Tomcat 安裝目錄下的lib目錄下,名稱爲 catalina.jar,直接修改catalina.jar中的文件,org/apache/catalina/util/ServerInfo.properties

server.info=Apache Tomcat/7.0.53

3.2     禁用 Tomcat 管理頁面

    咱們線上是不使用 Tomcat 默認提供的管理頁面的,所以都會在初始化的時候就把這些頁面刪掉。這些頁面是存放在 Tomcat 安裝目錄下的webapps目錄下的。咱們只須要刪除該目錄下的全部文件便可。固然,還有涉及管理頁面的2個配置文件host-manager.xml 和 manager.xml 也須要一併刪掉。這兩個文件存放在 Tomcat 安裝目錄下的conf/Catalina/localhost目錄下。

3.3     用普通用戶啓動 Tomcat

    爲了進一步安全,咱們不建議使用 root 來啓動 Tomcat。這邊建議使用專用用戶 tomcat 或者 nobody 用戶來啓動 Tomcat。在啓動以前,須要對咱們的tomcat 安裝目錄下全部文件的屬主和屬組都設置爲指定用戶。

3.4     分離 Tomcat 和項目的用戶

爲了防止 Tomcat 被植入 web shell 程序後,能夠修改項目文件。所以咱們要將 Tomcat 和項目的屬主作分離,這樣子,即使被搞,他也沒法建立和編輯項目文件。

3.5     關閉war自動部署

默認 Tomcat 是開啓了對war包的熱部署的。爲了防止被植入木馬等惡意程序,所以咱們要關閉自動部署。

修改實例:

1
2
3
  
      <Host name= "localhost"  appBase= ""
            unpackWARs= "false"  autoDeploy= "false" >

3.6     更改關閉 Tomcat 實例的指令

    server.xml中定義了能夠直接關閉 Tomcat 實例的管理端口。咱們經過 telnet 鏈接上該端口以後,輸入 SHUTDOWN (此爲默認關閉指令)便可關閉 Tomcat 實例(注意,此時雖然實例關閉了,可是進程仍是存在的)。因爲默認關閉Tomcat 的端口和指令都很簡單。默認端口爲8005,指令爲SHUTDOWN 。所以咱們須要將關閉指令修改複雜一點。

    固然,在新版的 Tomcat 中該端口僅監聽在127.0.0.1上,所以你們也沒必要擔憂。除非黑客登錄到tomcat本機去執行關閉操做。

      修改實例:

1
<Server port= "8005" shutdown= "9SDfjsd29jf24sdff0LSDdfJKS9DKkjsd" >

4      內核優化

   在修改內核參數的時候,建議你們逐個設置,而後反覆試驗,切勿圖方便直接拿上就用,一次所有替換。

優化網絡參數

修改/etc/sysctl.cnf文件,在最後追加以下內容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
net.core.netdev_max_backlog = 32768
net.core.somaxconn = 32768
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.route.gc_timeout = 100
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 2
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_mem = 94500000 915000000927000000
net.ipv4.tcp_max_orphans = 3276800
net.ipv4.tcp_max_syn_backlog = 65536

 

保存退出,執行sysctl-p生效

內核參數詳細做用,能夠參考:http://blog.chinaunix.net/uid-21505614-id-2181210.html

 

5      tomcat監控

5.1     配置tomcat的status狀態頁

步驟1:修改%tomcat安裝路徑%\conf \tomcat-users文件,配置admin設置權限。在<tomcat-users>中增長部份內容。具體以下:

1
2
  <role rolename= "manager-gui" />
  <user username= "manager" password= "1234"  roles= "manager-gui" />

  注:用戶名:manager,密碼:1234

步驟2:完成後,啓動tomcat,輸入:http://localhost:8080  --(IP,端口號,可遠程訪問)

點擊status,輸入帳號,密碼(manager,1234),進入status,時時刷新頁面,查看當前tomcat狀態。 或者直接訪問:http://localhost:8080/manager/status頁面。

備註1:若但願整個服務器的性能數據以一個單行的xml文件形式表示,則進入以下界面:http://localhost:8080/manager/status?XML=true

備註2:若服務器中存在幾個項目,單獨對某個項目進行監控,則須要另行增長代碼。

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Free memory: 304.84 MB Total memory: 903.00MB Max memory: 7273.00 MB
Free memory:空閒內存大小。
Total memory:總內存大小。
Max memory:最大內存大小。
  
Max threads: 200 Current thread count: 10Current thread busy: 1 Keeped alive sockets count: 1Max processing  time : 187 msProcessing  time : 0.281 s Request count: 32 Error count: 3 Bytes received: 0.00MB Bytes sent: 0.12 MB
Max threads:最大線程數。
Current thread count:最近運行的線程數。
Max processing  time :最大CPU時間。
Processing  time :CPU消耗總時間
Request count:請求總數。
Error count:錯誤的請求數。
Bytes received:接收字節數。
Bytes sent:發送字節數。

 

 

訪問地址:

curl --user manager:1234   http://you_tomcat_ip:port/manager/status?XML=true

 

5.2     tomcat監控腳本

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#!/bin/bash
#auther:gushao
#time:2015-5-4
#========================DefaultSettings===============================
# address of status page
STATUS_ADDR= "http://localhost:8080/manager/status?XML=true"
USER= "manager"
PASS= "1234"
# sample rate, default: 5seconds
SAMPLE_RATE=5
# if press "Ctrl+c", stop monitor
EXIT_SIGNAL=2
# connector to monitor
CONNECTOR= "http-8080"
# result directory to store data
RESULT_DIR= "/tmp"
# perf data file
PERF_DATA= "perf_data"
# jvm data file
JVM_DATA= "jvm_data"
# connector data file
CONNECTOR_DATA= "connector_data"
# thread data file
THREAD_DATA= "thread_data"
# request data file
REQUEST_DATA= "request_data"
  
# ===========================Output ErrorMessage========================
# Show Error Message and exit, get oneparameter
errorMsg()
{
        if  [[ $ # -eq 1 ]]; then
                 echo  "Runtime Error:$1"
                 exit  1
        else
                echo  "Function Error:errorMsg"
                 exit  127
        fi
}
  
# =========================Get DataFunction=============================
# Get performance data, no parameter wanted
getPerfData()
{
        cd  $RESULT_DIR
        wget --http-user= "$USER"  --http-password= "$PASS" "$STATUS_ADDR"  -O  "$PERF_DATA"  || errorMsg  "Failed toget data, please check the connection"
        # JVM data
        sed  's/.*<jvm>//g;s/<\/jvm>.*//g'  $PERF_DATA |  awk  -F \ ' ' {print $2, $4, $6 }' >> $JVM_DATA
        # 'Connector data
        sed  's/.*' $CONNECTOR '.>//g;s/<\/connector>.*//g'  $PERF_DATA>> $CONNECTOR_DATA
        # Thread data
        sed  's/.*<threadInfo//g;s/\/>.*//g'  $CONNECTOR_DATA |  awk  -F\"  '{ print $2, $4, $6 }'  >> $THREAD_DATA
        # " Request data
        sed  's/.*<requestInfo//g;s/\/>.*//g'  $CONNECTOR_DATA |  awk  -F\"  '{ print $2, $4, $6, $8, $10, $12 }'  >> $REQUEST_DATA
  
}
  
# ========================Build ChartFunction==========================
# "according the data, build the chart(use gnuplot)
buildChart()
{   
        TITLE= ""
        OUTPUT= ""
        PLOT= ""
        YRANGE= "[0:]"
        case  "$1"  in
                 "jvm"  )
                 TITLE= "JVM"
                OUTPUT= "jvm_graph.png"
                 PLOT="plot  'jvm_data' using 1 title  'free'  w linespoints, \
                 'jvm_data'  using 2 title 'total'  w linespoints,\
                 'jvm_data'  using 3 title  'max' w linespoints"
                 ;;
  
                 "thread"  )
                 TITLE= "Thread"
                OUTPUT= "thread_graph.png"
                 PLOT="plot  'thread_data' using 1 title  'max threads'  w linespoints,\
                 'thread_data'  using 2 title 'current thread count'  w linespoints,\
                 'thread_data'  using 3 title 'current thread busy'  w linespoints"
                 ;;
  
                 "request"  )
                 TITLE= "Request"
                 YRANGE= "[-1:]"
                OUTPUT= "request_graph.png"
                 PLOT="plot  'request_data' using 1 title  'max time'  w linespoints,\
                 'request_data'  using 2 title 'processing time'  w linespoints,\
                 'request_data'  using 3 title 'request count'  w linespoints,\
                 'request_data'  using 4 title 'error count'  w linespoints,\
                 'request_data'  using 5 title 'bytes received'  w linespoints,\
                 'request_data'  using 6 title 'bytes sent'  w linespoints"
                 ;;
        esac
  
        # build graph
        gnuplot <<EOF
        set  terminal png small size 480,360
        set  title  "$TITLE"
        set  yrange $YRANGE
        set  grid
        set  xlabel  "timeline (s)"
        set  output  "$OUTPUT"
        $PLOT
EOF
}
  
# ========================Build ReportFunction=========================
# include data and chart, give a readablehtml report
buildReport()
{
        # build graph jvm, request,thread
        buildChart  "jvm"  || errorMsg  "Function Error: build jvmgraph"
        buildChart  "thread"  || errorMsg  "Function Error: buildthread graph"
        buildChart  "request"  || errorMsg  "Function Error: buildrequest graph"
        # build html report
}
  
# ========================Stop MonitorFunction
# call buildReport function
stopMonitor()
{
    echo  "Monitor stopped, and we are building the report ..."
    buildReport || errorMsg  "Function Error: buildReport"
    exit
}
  
# =============================MainFunction=============================
trap  "stopMonitor"  $EXIT_SIGNAL
#收到stopMonitor信號,則中斷退出
while  :
do
        getPerfData || errorMsg  "Failed to get performance data"
        sleep  $SAMPLE_RATE
done
相關文章
相關標籤/搜索