【Tomcat解析优化】恢弘志士之气,不宜妄自菲薄。这篇文章主要讲述Tomcat解析优化相关的知识,希望能为你提供帮助。
一、Tomcat解析、优化
一、java的组成部分
1、简述Java组成部分
- bin:tomcat的脚本文件,catalina.sh
- conf:tomcat的配置文件
- lib:存放的是tomcat自带的jar(java程序,class文件) jar存放的地方(jdk安装目录下lib、jre\\lib、tomcat安装目录下lib、开发人员编写的应用程序下lib) 注意:jar版本冲突
- logs:存放tomcat日志,catalina.out日志(日志级别)
- tmp:tomcat临时目录
- webapps:存放tomcat自带的应用
- work:存放了tomcat运行时,web应用jsp页面转变为,java程序,和class的目录
- server.xml:tomcat核心配置文件;定义tomcat提供服务的很多组件、这些组件属性的设定
- context.xml:每个webapp都有自己本身的配置,WBE-INF目录,
- web.xml:每个web应用被tomcat加载(jvm加载)时的参数配置
- tomcat-users.xml:用户认证账号配置文件
- logging.properties:日志相关的配置文件
- catalina.properties:java属性的配置文件,用于定于用于设定类加载器路径,以及一些jvm性能调整的相关参数
- catalina.policy:安全运行策略
port:监听tomcat管理端口
shutdown:传递什么信号可以关闭tomcat实例
服务类组件:service 将连接器和引擎关联起来
tomcat运行在java,系统级服务
容器类组件:Engine(web server),Host,Context
连接器组件(Connector):使用java虚拟机向linux内核发起端口注册(绑定)请求,监听端口,接收用户请求
connectionTimeout:连接超时时长,单位是毫秒
keepAliveTimeout:长连接保持时长,15秒单位是毫秒
maxSpareThreads:最大空闲线程
minSpareThreads:最小空闲线程
maxConnections:tomcat最多能并发处理的请求
acceptCount:每个tomcat线程,接收请求队列的长度,2
MaxThreads:tomcat启动最大线程数
被嵌套类组件:valve(过滤器),realm(安全域)
*/
< Server> 代表一个tomcat实例(tomcat进程)
< Service> :
< Connector> :代表和客户程序实际交互的组件,负责接收客户请求,以及向客户返回相应结果
< engine:处理在同一个< Service> 中所有Connector组件接收的客户请求
< Host> :虚拟主机
< Context> :web应用
/*
< Server>
< Service>
< engine>
< /engine>
< Connector>
< /Connector>
< /Service>
< /Server>
二、部署环境
下载所需的JDK和Jmeter
1、Linux上安装JDK8和jmeter5.0
cd /opt/soft
#上传所需安装包 apache-jmeter-5.0.zipjdk-8u192-linux-x64.tar
tar -xf jdk-8u192-linux-x64.tar
ln -s jdk1.8.0_192/ /opt/soft/java
unzip apache-jmeter-5.0.zip
#创建环境变量
#编辑/etc/profile
export JAVA_HOME=/usr/java/jdk1.8.0_192
export CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib
#jmeter
export JMETER=/opt/ytd_soft/apache-jmeter-5.0
export CLASSPATH=$JMETER/lib/ext/ApacheJMeter_core.jar:$JMETER/lib/jorphan.jar:$CLASSPATH
export PATH=$JMETER/bin/:$PATH
#生效配置文件
source /etc/profile
#验证
java -version
jmeter--version
2、安装Linux图形化包Linux环境若没有安装图形化包会报下面的错误
# jmeter
================================================================================
Dont use GUI mode for load testing !, only for Test creation and Test debugging.
For load testing, use NON GUI Mode:
jmeter -n -t [jmx file] -l [results file] -e -o [Path to web report folder]
& increase Java Heap to meet your test requirements:
Modify current env variable HEAP="-Xms1g -Xmx1g -XX:MaxMetaspaceSize=256m" in the jmeter batch file
Check : https://jmeter.apache.org/usermanual/best-practices.html
================================================================================
An error occurred:
No X11 DISPLAY variable was set, but this program performed an operation which requires it.
安装所需的包(yum intall xorg-x11-xauth)
yum install xorg-xll-xauth xorg-x11-server-utils xorg-x11-server-Xnest libXtst -y
验证(若还报错,可以重启一下机器,在进行测试)
# jmeter
3、jmeter介绍1、bin底下脚本介绍
/data/apache-jmeter-3.1/bin目录下的脚本:jmeter脚本文件,应该在绝大多数linux/UNIX系统上运行
jmeter:运行JMeter(默认GUI模式)。定义了一些JVM设置,但并不是对所有JVM都生效
jmeter-server:以服务器模式启动JMeter(通过合适的参数来调用jmeter脚本)。
jmeter.sh:没有指定JVM选项的非常基础的jmeter脚本
mirror-server.sh:在非GUI模式下启动JMeter镜像服务器
shutdown.sh:关闭一个非GUI实例(优雅的)
stoptest.sh:停止一个非GUI实例(中断式的)
使用一个产品的原则:使用路径(用户使用路径)
功能繁多,会导致使用路径非常多,很多刚接触的用户经常会迷路
先研究和掌握最核心的一条用户路径
JMeter(怎么对一个web服务进行压力测试)
2、JMeter常用术语
1、采样器(Samplers):采样器是JMeter测试脚本的基础单元用户可以用它来向服务器发出一个特定的请求,采样器会在超时前等待服务器的响应。
2、逻辑控制器(Logic Controllers):用户通过逻辑控制器来控制JMeter测试脚本的执行顺序,以便测试能够按照用户期望的顺序和逻辑执行
3、监听器(Listeners):监听器被用来收集测试结果信息,并以用户指定的方式加以展示
4、配置元件(Configuration Elements):配置元件被用来设置一些JMeter测试脚本公用的信息
5、断言(Assertions):断言被用来验证服务器实际返回的信息与用于期望的情况是否相符
6、定时器(Timers):定时器被用来保存JMeter测试脚本与时间相关的一些信息,例如思考时间(Think Time)
7、前置处理器(Pre-Processos):在前置处理器的作用范围内,任何采样被执行前,都要先执行前置处理器
8、后置处理器(Post-Processors):在后置处理器的作用范围内,任何采样器被执行后,都要执行对应的后置处理器
9、测试计划(Test Plan):测试计划是JMeter测试脚本的根节点,关于整个测试脚本的一些基础设置,可以在测试计划中设定,例如用户定义变量
10、线程组(Thread Group):线程组定义了一个虚拟用户池,其中每一个虚拟用户都使用同样的测试脚本
11、工作台(WorkBench):工作台被用来保存暂时不使用的测试元素,当测试人员保存测试计划时,工作台中的内容不会被一起保存
3、JMeter测试结果字段的意义
Label:定义HTTP请求名称
Samples:表示这次测试中一共发出了多少个请求
Average:平均响应时长---默认情况下是单个Request的平均响应时长,当使用Transaction Controller时,也可以以Transaction为单位显示平均响应时长
Median:中位数,也就是50%用户的响应时长
90%Line:90%用户的响应时长
Min:访问页面的最小响应时长
Max:访问页面的最大响应时长
Error%:错误请求的数量/请求的总数
Throughput:默认情况下表示每秒完成的请求数(Request per Second),当使用了Transaction Controller时,也可以表示类似LoadRunner的Transaction per Second数。
KB/Sec:每秒从服务器端接收到的数据量
4、建立测试计划
线程组:
HTTP采样器的配置元件:
采样器:/index.html
/index.php
监听器
三、Tomcat优化
1、server.xml主要优化参数基准、压力测试和性能测试
jmeter(性能测试)、ab(基准测试,压力测试)
ab:httpd服务自带的一个工具(apache)
yum install httpd-tools
ab参数:
-c:模拟用户数(启动多个进程或者是线程发起请求)
-n:总共要发起的并发请求数
-k:禁止Keep-Alive
ab -k -c 1 -n 2 http://www.baidu.com/index.html
打印日志,并分析
for i in 1..10000; do netstat -n|awk /^tcp/ ++S[$NF] ENDfor(a in S) print a,S[a] > > /tmp/tcp.log; free -m > > mem.log; vmstat > > cpu.log; sleep 1; done
mssssaxThreads尽量设置的小一点,当tomcat的线程数过大时,cpu资源都会浪费在tomcat线程调度上。线程调度消耗的cpu资源其实就是浪费的cpu资源,当cpu核心数< 线程数,其实就会产生线程调度,(合理控制)
maxThreads:tomcat能够启动的最大线程数100处理用户请求的线程
minSpaceThreads:tomcat初始化的线程池大小。
acceptCount:tomcat每个线程维护的最大队列长度
maxConnections:tomcat能够允许多少个客户tcp链接
2、数据库连接池配置1、主要优化参数
#初始化连接:连接池启动时创建的初始化连接数量
initialSize=10
#连接池的最大数据库连接数。设为0表示无限制
maxActive=50
#最大空闲数,数据库连接的最大空闲时间。超过空闲时间,数据库连接将被释放。设为0表示无限制
maxIdle=10
#最小空闲连接:连接池中容许保持空闲状态的最小连接数量,低于这个数量将创建新的连接
minIdle=5
#最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制
maxWait=1000
#超过removeAbandonedTimeout时间后,是否进 行没用连接(废弃)的回收(默认为false,调整为true)
removeAbandoned=true
#超过时间限制,回收没有用(废弃)的连接(默认为 300秒,调整为180)
removeAbandonedTimeout=180
2、配置方法方法一:在Tomcat的conf/context.xml中配置
< !--配置mysql数据库的连接池,
需要做的额外步骤是将mysql的Java驱动类放到tomcat的lib目录下
maxIdle 连接池中最多可空闲maxIdle个连接
minIdle 连接池中最少空闲maxIdle个连接
initialSize 初始化连接数目
maxWait 连接池中连接用完时,新的请求等待时间,毫秒
username 数据库用户名
password 数据库密码
-->
< Resource name="jdbc/mysqlds"
auth="Container"
type="javax.sql.DataSource"
username="root"
password="root"
maxIdle="30"
maxWait="10000"
maxActive="100"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://127.0.0.1:3306/db_blog" />
< /Context>
配置好后需要注意的两个步骤
1.将对应数据库的驱动类放到tomcat的lib目录下
2.重新启动tomcat服务器,让配置生效
方法二:在Tomcat的conf/server.xml中配置
打开tomcat的conf/server.xml文件,找到< GlobalNamingResources> < /GlobalNamingResources> 节点,默认的内容如下
< GlobalNamingResources>
< Resource name="UserDatabase" auth="Container"
type="org.apache.catalina.UserDatabase"
description="User database that can be updated and saved"
factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
pathname="conf/tomcat-users.xml" />
< /GlobalNamingResources>
在该节点中加入相关的池配置信息,如下
< GlobalNamingResources>
< Resource name="UserDatabase" auth="Container"
type="org.apache.catalina.UserDatabase"
description="User database that can be updated and saved"
factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
pathname="conf/tomcat-users.xml" />
< !--配置mysql数据库的连接池,
需要做的额外步骤是将mysql的Java驱动类放到tomcat的lib目录下
-->
< Resource name="jdbc/mysqlds"
auth="Container"
type="javax.sql.DataSource"
username="root"
password="root"
maxIdle="30"
maxWait="10000"
maxActive="100"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://127.0.0.1:3306/db_blog" />
< /GlobalNamingResources>
在tomcat的conf/context.xml文件中的< Context> < /Context> 节点中加入如下内容
< ResourceLink name="jdbc/mysqlds" global="jdbc/mysqlds" type="javax.sql.DataSource"/>
然后在web项目中的WEB-INF目录下的web.xml中配置
< resource-ref>
< description> mysql Connection< /description>
< !-- 参考数据源名字,同Tomcat中配置的Resource节点中name属性值"jdbc/mysqlds"一致 -->
< res-ref-name> jdbc/mysqlds< /res-ref-name>
< !-- 资源类型 -->
< res-type> javax.sql.DataSource< /res-type>
< res-auth> Container< /res-auth>
< res-sharing-scope> Shareable< /res-sharing-scope>
< /resource-ref>
同样配置好后,需要重新启动服务器,让配置生效.
方法三:web应用中中配置方法一
在Web项目中的META-INF目录下新建一个文件context.xml,写入配置
注意:是META-INF目录下,不是WEB-INF目录下
< ?xml version=1.0 encoding=utf-8?>
< Context>
< Resource name="jdbc/mysqlds"
auth="Container"
type="javax.sql.DataSource"
username="root"
password="root"
maxIdle="30"
maxWait="10000"
maxActive="100"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://127.0.0.1:3306/db_blog"
logAbandoned="true" />
< /Context>
3、mysql jdbc url参数详解:
user数据库用户名,用于连接数据库所有版本
password用户密码(用于连接数据库)所有版本
useUnicode是否使用Unicode字符集,如果参数characterEncoding设置为gb2312或gbk,本参数值必须设置为truefalse
characterEncoding当useUnicode设置为true时,指定字符编码。比如可设置为gb2312或gbk,utf8false
autoReconnect当数据库连接异常中断时,是否自动重新连接?false
autoReconnectForPools是否使用针对数据库连接池的重连策略false
failOverReadOnly自动重连成功后,连接是否设置为只读?true
maxReconnectsautoReconnect设置为true时,重试连接的次数3
initialTimeoutautoReconnect设置为true时,两次重连之间的时间间隔,单位:秒
connectTimeout和数据库服务器建立socket连接时的超时,单位:毫秒。 0表示永不超时,适用于JDK 1.4及更高版本
socketTimeoutsocket操作(读写)超时,单位:毫秒。 0表示永不超时
范例
jdbc:mysql://localhost:3306/test?user=root& password=& useUnicode=true& characterEncoding=gbk& autoReconnect=true& failOverReadOnly=false
3、JVM优化
-Xms:设置初始化堆大小
-Xmx:设置堆最大可使用空间
-Xss128k:虚拟机栈和本地方法栈溢出
-XX:PermSize=10M -XX:MaxPermSize=10M :运行时常量池的内存溢出
范例如下
export GC_LOG_DIR=/opt/logs/gc# 此处修改为规定的路径
export HEAPDUMP_DIR=/opt/logs/gc# 此处修改为规定的路径
mkdir -p $GC_LOG_DIR
mkdir -p $HEAPDUMP_DIR
jdk_verbose_version=`java -version 2> & 1 | grep version | awk -F"\\"" print $2`
echo "JDK version: $jdk_verbose_version"
jdk_major_version=`java -version 2> & 1 | grep version | awk -F"." print $2`
if [ $jdk_major_version -gt 7 ]
then
# jdk7 之后的版本
JAVA_OPTS="$JAVA_OPTS -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=384m"
else
# jdk7 以及之前的版本
JAVA_OPTS="$JAVA_OPTS -XX:PermSize=256M -XX:MaxPermSize=384M"
JAVA_OPTS="$JAVA_OPTS -XX:+UseConcMarkSweepGC -XX:CMSMaxAbortablePrecleanTime=5000"
fi
JAVA_OPTS="$JAVA_OPTS -Xms2g -Xmx4g"
JAVA_OPTS="$JAVA_OPTS -Xloggc:$GC_LOG_DIR/gc.log_$(date +%F) -XX:+PrintGCDetails -XX:+PrintGCDateStamps"
JAVA_OPTS="$JAVA_OPTS -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$HEAPDUMP_DIR/heapdump_$(date +%m-%d_%H:%M:%S).hprof"
JAVA_OPTS="$JAVA_OPTS -Dfile.encoding=UTF-8"
export JAVA_OPTS
推荐阅读
- VMware设置centos7共享文件夹
- Linux学习教程1.4 类UNIX系统是什么鬼()
- shell疑难杂症
- nvm node版本管理
- win8系统更新CF后不能全屏怎样办|win8系统更新CF后不能全屏处理措施
- Win8纯净版系统点击文件夹总显示未响应如何处理
- win8系统没有更新补丁导致office2010不能安装怎样办
- 更新Win8 update系统提示代码80244fff怎样回事
- win8/win8.1系统更新usb2.0驱动后不能运用怎样办