tomcat优化设计
来源:互联网 发布:php全栈 编辑:程序博客网 时间:2024/05/19 21:44
性能优化
- 1.屏蔽DNS查询
- Web应用程序可以通过Web容器提供的getRemoteHost()方法获得访问Web应用客户的IP地址和名称,但是这样会消耗Web容器的资源,并且还需要通过IP地址和DNS服务器反查用户的名字。因此当系统上线时,可以将这个属性关闭,从而减少资源消耗,那么Web应用也就只能记录下IP地址。修改的属性是enableLoopups=”false”。
- 2.调整线程数
- Tomcat通过线程池来为用户访问提供响应,对于上线的系统初步估计用户并发数量后,再调整线程池容量。例如,用户并发数量在100左右时,可以设置minProcessors=”100”,maxProcessors=”100”。将最大和最小设置为一样后,线程池不会再释放空闲的线程,当用户访问突然增加时,不需要再消耗系统资源去创建新的线程。
- 3.调整最大连接数
- 这个其实最复杂,即使用户并发量大,但是系统反应速度快,也没必要把这个值设置太高,高了系统需要消耗大量的资源去切换线程,但是如果设置太低也会造成应用无法满足用户并发需要。因此设置这个最好能够结合整个系统的跟踪与调优,使系统达到最好的平稳状态,一般设置为maxProcessors的1.5倍即可。
- 4.调整网络超时
- 主要是HTTP协议也有个连接过程,客户端连接到服务器上后,如果长时间没有得到处理就会被释放。如果服务器处理速度较慢,但是希望每个用户都能得到有效处理,或者网络环境不好,需要保证用户不会因为超时中断,也可以把时间加长。但是一般设置成connectionTimeout=”30000”即可。太长对系统来说价值不大,反而会浪费系统资源在无谓的长连接上。
- 5.压缩管理(如果使用apache/nginx代理,所以tomcat自身不需要进行压缩,会给服务器增加压力)
- tomcat作为一个应用服务器,也是支持 gzip 压缩功能的。我们可以在 server.xml 配置文件中的 Connector 节点中配置如下参数,来实现对指定资源类型进行压缩。
compression="on" # 打开压缩功能 compressionMinSize="50" # 启用压缩的输出内容大小,默认为2KB noCompressionUserAgents="gozilla, traviata" # 对于以下的浏览器,不启用压缩 compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"# 哪些资源类型需要压缩
tomcat的三种运行模式选择
- Bio
- 默认的模式,性能非常低下,没有经过任何优化处理和支持。
- Bio
- 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"/>
- 3.Apr
- 安装起来最困难,但是从操作系统级别来解决异步的IO问题,大幅度的提高性能.。必须要安装apr和native,直接启动就支持apr。
- 安装APR
- 安装起来最困难,但是从操作系统级别来解决异步的IO问题,大幅度的提高性能.。必须要安装apr和native,直接启动就支持apr。
sudo yum -y install apr apr-develtar zxvf tomcat-native.tar.gz //该文件在tomcat的bin目录下面cd tomcat-native-1.1.24-src/jni/native./configure--with-apr=/usr/bin/apr-1-configmakemake install
- 安装成功后还需要对tomcat设置环境变量,方法是在catalina.sh文件中增加一 行:
CATALINA_OPTS="-Djava.library.path=/usr/local/apr/lib"修改8080端对应的protocol="org.apache.coyote.http11.Http11AprProtocol"
Tomcat连接相关参数总结
- 在Tomcat 配置文件 server.xml 中的
maxThreads 客户请求最大线程数minSpareThreads Tomcat初始化时创建的 socket 线程数maxSpareThreads Tomcat连接器的最大空闲 socket 线程数enableLookups 若设为true, 则支持域名解析,可把 ip 地址解析为主机名redirectPort 在需要基于安全通道的场合,把客户请求转发到基于SSL 的 redirectPort端口acceptAccount 监听端口队列最大数,满了之后客户请求会被拒绝(不能小于maxSpareThreads )connectionTimeout 连接超时minProcessors 服务器创建时的最小处理线程数maxProcessors 服务器同时最大处理线程数URIEncoding URL统一编码compression 打开压缩功能 compressionMinSize 启用压缩的输出内容大小,这里面默认为2KBcompressableMimeType 压缩类型connectionTimeout 定义建立客户连接超时的时间. 如果为 -1, 表示不限制建立客户连接的时间
生产配置实例
<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"/>
安全优化
- 1.tomcat影藏版本信息
- Tomcat 安装目录下的lib目录下,名称为 catalina.jar,直接修改catalina.jar中的文件,org/apache/catalina/util/ServerInfo.properties
server.info=Apache Tomcat/7.0.53
- Tomcat 安装目录下的lib目录下,名称为 catalina.jar,直接修改catalina.jar中的文件,org/apache/catalina/util/ServerInfo.properties
- 2.禁用 Tomcat 管理页面
- 我们线上是不使用 Tomcat 默认提供的管理页面的,因此都会在初始化的时候就把这些页面删掉。这些页面是存放在 Tomcat 安装目录下的webapps目录下的。我们只需要删除该目录下的所有文件即可。当然,还有涉及管理页面的2个配置文件host-manager.xml 和 manager.xml 也需要一并删掉。这两个文件存放在 Tomcat 安装目录下的conf/Catalina/localhost目录下。
- 3.用普通用户启动 Tomcat
- 为了进一步安全,我们不建议使用 root 来启动 Tomcat。这边建议使用专用用户 tomcat 或者 nobody 用户来启动 Tomcat。在启动之前,需要对我们的tomcat 安装目录下所有文件的属主和属组都设置为指定用户。
- 4.分离 Tomcat 和项目的用户
- 为了防止 Tomcat 被植入 web shell 程序后,可以修改项目文件。因此我们要将 Tomcat 和项目的属主做分离,这样子,即便被搞,他也无法创建和编辑项目文件。
- 5.关闭war自动部署
- 默认 Tomcat 是开启了对war包的热部署的。为了防止被植入木马等恶意程序,因此我们要关闭自动部署。
修改实例:
- 默认 Tomcat 是开启了对war包的热部署的。为了防止被植入木马等恶意程序,因此我们要关闭自动部署。
<Host name="localhost" appBase="" unpackWARs="false" autoDeploy="false">
- 6.更改关闭 Tomcat 实例的指令
- server.xml中定义了可以直接关闭 Tomcat 实例的管理端口。我们通过 telnet 连接上该端口之后,输入 SHUTDOWN (此为默认关闭指令)即可关闭 Tomcat 实例(注意,此时虽然实例关闭了,但是进程还是存在的)。由于默认关闭Tomcat 的端口和指令都很简单。默认端口为8005,指令为SHUTDOWN 。因此我们需要将关闭指令修改复杂一点。
- 当然,在新版的 Tomcat 中该端口仅监听在127.0.0.1上,因此大家也不必担心。除非黑客登陆到tomcat本机去执行关闭操作。
<Server port="8005"shutdown="9SDfjsd29jf24sdff0LSDdfJKS9DKkjsd">
内核优化
- 在修改内核参数的时候,建议大家逐个设置,然后反复试验,切勿图方便直接拿上就用,一次全部替换。
优化网络参数
修改/etc/sysctl.cnf文件,在最后追加如下内容:
net.core.netdev_max_backlog = 32768net.core.somaxconn = 32768net.core.wmem_default = 8388608net.core.rmem_default = 8388608net.core.rmem_max = 16777216net.core.wmem_max = 16777216net.ipv4.ip_local_port_range = 1024 65000net.ipv4.route.gc_timeout = 100net.ipv4.tcp_fin_timeout = 30net.ipv4.tcp_keepalive_time = 1200net.ipv4.tcp_timestamps = 0net.ipv4.tcp_synack_retries = 2net.ipv4.tcp_syn_retries = 2net.ipv4.tcp_tw_recycle = 1net.ipv4.tcp_tw_reuse = 1net.ipv4.tcp_mem = 94500000 915000000927000000net.ipv4.tcp_max_orphans = 3276800net.ipv4.tcp_max_syn_backlog = 65536
tomcat监控
- 配置tomcat的status状态页
- 步骤1:修改%tomcat安装路径%\conf \tomcat-users文件,配置admin设置权限。在中增加部分内容。具体如下:
<role rolename="manager-gui"/>
<user username="manager"password="1234" roles="manager-gui"/>
- 步骤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:若服务器中存在几个项目,单独对某个项目进行监控,则需要另行增加代码。
- 3.访问地址:curl –user manager:1234 http://you_tomcat_ip:port/manager/status?XML=true
- 步骤1:修改%tomcat安装路径%\conf \tomcat-users文件,配置admin设置权限。在中增加部分内容。具体如下:
- 配置tomcat的status状态页
Free memory: 304.84 MB Total memory: 903.00MB Max memory: 7273.00 MBFree 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 MBMax threads:最大线程数。Current thread count:最近运行的线程数。Max processing time:最大CPU时间。Processing time:CPU消耗总时间Request count:请求总数。Error count:错误的请求数。Bytes received:接收字节数。Bytes sent:发送字节数。
- 2.tomcat监控脚本
#!/bin/bash#auther:gushao#time:2015-5-4#========================DefaultSettings===============================# address of status pageSTATUS_ADDR="http://localhost:8080/manager/status?XML=true"USER="manager"PASS="1234"# sample rate, default: 5secondsSAMPLE_RATE=5# if press "Ctrl+c", stop monitorEXIT_SIGNAL=2# connector to monitorCONNECTOR="http-8080"# result directory to store dataRESULT_DIR="/tmp"# perf data filePERF_DATA="perf_data"# jvm data fileJVM_DATA="jvm_data"# connector data fileCONNECTOR_DATA="connector_data"# thread data fileTHREAD_DATA="thread_data"# request data fileREQUEST_DATA="request_data"# ===========================Output ErrorMessage========================# Show Error Message and exit, get oneparametererrorMsg(){ 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 wantedgetPerfData(){ 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" $PLOTEOF}# ========================Build ReportFunction=========================# include data and chart, give a readablehtml reportbuildReport(){ # 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 functionstopMonitor(){ 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_RATEdone
1 0
- tomcat优化设计
- tomcat 优化
- tomcat优化
- Tomcat优化
- tomcat优化
- Tomcat优化
- Tomcat优化
- tomcat优化
- tomcat优化
- TOMCAT优化
- TOMCAT优化
- Tomcat 优化
- tomcat优化
- tomcat优化
- tomcat优化
- tomcat优化
- Tomcat优化
- Tomcat优化
- mysql 用户权限控制、远程访问控制
- Stackoverflow/dapper的Dapper-Extensions用法(一)
- 混合APP开发环境配置-ionic、cordora
- 你画我猜小游戏的总结
- Java面试题全集(上)
- tomcat优化设计
- 1.2.2一个数可以有多少种用连续素数之和表示
- 每日一题 No.42 最长上升序列(优化)
- 整除取整问题
- 信息安全等级定义
- 程序员的工作感言
- fast-rcnn中编译cudnn出错解决方法
- DapperExtensions 1.5.0
- 和我一起学C++之list<一>