Tomcat 配置调优与安全总结

发布于 2024-07-18 19:55:29 字数 19070 浏览 20 评论 0

作为运维,避免不了与 tomcat 打交道,然而作者发现网络上关于 tomcat 配置和调优安全的文章非常散,通过参考各位大神的相关技术文档,根据作者对 tomcat 的运维经验,总结了一些 tomcat 的基础运维注意事项,希望对广大技术兄弟们有些帮助。

本篇文章只是对 tomcat 模板的基础调优,除了部署 tomcat 的各系统环境和配置,影响 tomcat 并发和性能的另一大重要因素,就是 java 的代码工程,而如何在生产中优化 java 工程,这个就需要运维与开发共同配合,尤其是运维需要有开发与运维是同一个团队的意识,只有双方配合默契才能发挥最大战力,要知道一个人的力量永远是有限的,只有团队合作才能爆发出真正力量!

而包含了 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.6。

这里需要补充的是,各位在打算升级 JVM 时,一定要先让开发先试用高版本的 JVM,调试高版本 JVM 对工程的影响,经过测试后逐步部署到测试环境,经过一定时间的验证,发现没有问题后再谨慎的更换到生产。JVM 版本不一致,很容易出现各类异常,对待生产,谨慎永远是第一原则!

JVM 调优参见: http://vekergu.blog.51cto.com/9966832/1626733

1.2.2 JDK 参数优化

Tomcat 内存优化主要是对 tomcat 启动参数优化,我们可以在 tomcat 的启动脚本 catalina.sh 中设置 JAVA_OPTS 参数。

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 配置方式:

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 取消下面代码注释即可:

<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 调整最大连接数

这个其实最复杂,即使用户并发量大,但是系统反应速度快,也没必要把这个值设置太高,高了系统需要消耗大量的资源去切换线程,但是如果设置太低也会造成应用无法满足用户并发需要。因此设置这个最好能够结合整个系统的跟踪与调优,使系统达到最好的平稳状态,一般设置为 maxProcessors 的 1.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 问题,大幅度的提高性能。必须要安装 apr 和 native,直接启动就支持 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.xmlmanager.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 配置 tomcat 的 status 状态页

步骤 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,输入账号,密码( manager1234 ),进入 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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

绿光

暂无简介

0 文章
0 评论
23 人气
更多

推荐作者

謌踐踏愛綪

文章 0 评论 0

开始看清了

文章 0 评论 0

高速公鹿

文章 0 评论 0

alipaysp_PLnULTzf66

文章 0 评论 0

热情消退

文章 0 评论 0

白色月光

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文