tomcat配置調優與安全總結

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版本選擇

    若是新手請選擇SUNJVM,在知足項目須要的前提下,儘可能選用版本較高的JVM,通常來講高版本產品在速度和效率上比低版本會有改進。 JDK1.4JDK1.3性能提升了近10%-20%JDK1.5JDK1.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參數說明

-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

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.   XmsXmx廣泛選擇配置相同的大小,實際大小根據實際狀況調整,由小向大增長,不必一開始就增長到很大的內存。

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

3.   UseParallelOldGCPrintGCDateStampsPrintGCDetailsXloggc:/opt/tomcat/log/gc.log設置GClog日誌,這個對分析tomcatJVM內存使用狀況很是有效。

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

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

1.3     tomcat集羣之session共享

1.3.1     基於tomcat集羣的session共享

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

<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     默認主頁

   <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     自定義錯誤頁面

<error-page> 
<error-code>404</error-code> 
<location>/404.htm</location> 
</error-page>


1.4.3     定義會話超時時間

   <session-config>
       <session-timeout>30</session-timeout>
   </session-config>

1.4.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中找到下列代碼,註釋便可

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

1.6     取消默認gc監聽

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

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

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

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

其中:

docBase這個是你代碼的路徑

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

 

舉例:

訪問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     調整最大鏈接數

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

2.4     調整網絡超時

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

2.5     壓縮管理

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

 

  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

 

 <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問題,大幅度的提升性能.。必需要安裝aprnative,直接啓動就支持apr

 

安裝APR

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文件中增長一 行:

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

2.7     Tomcat鏈接相關參數總結

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

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     生產配置實例

<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包的熱部署的。爲了防止被植入***等惡意程序,所以咱們要關閉自動部署。

修改實例:

 
     <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本機去執行關閉操做。

      修改實例:

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

4      內核優化

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

優化網絡參數

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

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     配置tomcatstatus狀態頁

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

 <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:若服務器中存在幾個項目,單獨對某個項目進行監控,則須要另行增長代碼。

 

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監控腳本

 

#!/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
相關文章
相關標籤/搜索