tomcat7.0性能优化-挑战极限完整版

优化Tomcat性能与配置详解
本文详细介绍了如何通过安装APR与tomcat-native、优化配置、调整线程池及内存等方式来提升Tomcat服务器的性能。同时,提供了Apache-Bench(ab)工具的使用方法及其输出报表解读,帮助开发者进行性能测试与分析。

0 测试结果
参考精简版的空跑测试结论
http://phl.iteye.com/blog/1868206

1 tomcat
1.1 tomcat运行模式
Connector/protocol
org.apache.coyote.http11.Http11Protocol - blocking Java connector
org.apache.coyote.http11.Http11NioProtocol - non blocking Java connector
org.apache.coyote.http11.Http11AprProtocol - the APR/native connector.

                       Java Blocking Connector   Java Non Blocking Connector   APR/native Connector
                                 BIO                         NIO                       APR
    Classname              Http11Protocol             Http11NioProtocol         Http11AprProtocol
    Tomcat Version           3.x onwards                 6.x onwards              5.5.x onwards
    Support Polling              NO                          YES                       YES
    Polling Size                 N/A                   maxConnections             maxConnections
    Read HTTP Request         Blocking                  Non Blocking                 Blocking
    Read HTTP Body            Blocking                  Sim Blocking                 Blocking
    Write HTTP Response       Blocking                  Sim Blocking                 Blocking
    Wait for next Request     Blocking                  Non Blocking               Non Blocking
    SSL Support               Java SSL                    Java SSL                   OpenSSL
    SSL Handshake             Blocking                  Non blocking                 Blocking
    Max Connections        maxConnections              maxConnections             maxConnections

1.2 APR与tomcat-native安装
到http://apr.apache.org/下载下面3个包

apr-1.4.6.tar.gz
apr-iconv-1.2.1.tar.gz
apr-util-1.5.1.tar.gz

1.安装apr
./configure --prefix=/application/search/usr/apr/apr-1.4.6
make -j16
make install -j16

2.安装apr-iconv
./configure --prefix=/application/search/usr/apr-iconv/apr-iconv-1.2.1 --with-apr=/application/search/usr/apr/default
make -j16
make install -j16

3.安装apr-util
./configure --prefix=/application/search/usr/apr-util/apr-util-1.5.1 --with-apr=/application/search/usr/apr/default --with-apr-iconv=/application/search/usr/apr-iconv/default/bin/apriconv
make -j16
make install -j16

4安装tomcat-native
在tomcat目录下,找到bin/tomcat-native-1.1.24-src
./configure --with-apr=/application/search/usr/apr/default --with-java-home=/application/search/usr/java/default
make -j16
make install -j16

配置环境变量
vi ~/.bashrc
export LD_LIBRARY_PATH=/application/search/usr/apr/default/lib:/application/search/usr/tomcat-native/default/lib
使环境变量生效
source ~/.bashrc
附加阅读

----------------------------------------------------------------------
Libraries have been installed in:
/application/search/usr/tomcat-native/tomcat-native-1.1.24/lib

If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the `-LLIBDIR'
flag during linking and do at least one of the following:
- add LIBDIR to the `LD_LIBRARY_PATH' environment variable
during execution
- add LIBDIR to the `LD_RUN_PATH' environment variable
during linking
- use the `-Wl,-rpath -Wl,LIBDIR' linker flag
- have your system administrator add LIBDIR to `/etc/ld.so.conf'

See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
----------------------------------------------------------------------

1.3 优化配置
官方参考文档 http://tomcat.apache.org/tomcat-7.0-doc/config/http.html
为了提高安全性,一般情况下屏蔽 AJP
注释或者删除server.xml中的 Connector节点
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

启用NIO或者APR模式运行
想运行在该模式下,直接修改server.xml里的Connector节点,修改protocol为
<Connector port="80" protocol="org.apache.coyote.http11.Http11NioProtocol"   (或者Http11AprProtocol)
connectionTimeout="20000"
URIEncoding="UTF-8"
useBodyEncodingForURI="true"
enableLookups="false"  (是否反查域名)
redirectPort="8443" />

根据经验,调整nio的线程池,参考http://tomcat.apache.org/tomcat-7.0-doc/config/http.html

线程池参数,需要直接在connector节点配置。
  <Connector port="8080"
               protocol="org.apache.coyote.http11.Http11NioProtocol" 
               connectionTimeout="20000"
               URIEncoding="UTF-8"
               useBodyEncodingForURI="true"
               maxThreads="768"
               minSpareThreads="64"
               enableLookups="false"
               redirectPort="8443" />

调整内存
JAVA_OPTS="-Xms1024m -Xmx1024"

启用APR
Apr要自己安装
<Connector port="8081"
               executor="tomcatThreadPool"
               protocol="org.apache.coyote.http11.Http11AprProtocol"
               connectionTimeout="20000"
               URIEncoding="UTF-8"
               useBodyEncodingForURI="true"
               enableLookups="false"
               redirectPort="8444" />

调整线程池
<Connector port="8081"
               executor="tomcatThreadPool"
               protocol="org.apache.coyote.http11.Http11AprProtocol"
               connectionTimeout="20000"
               URIEncoding="UTF-8"
               useBodyEncodingForURI="true"
               enableLookups="false"
               redirectPort="8444" />

<Executor name="tomcatThreadPool"
namePrefix="catalina-exec-"
maxThreads="1024"
minSpareThreads="512"
prestartminSpareThreads="true" />

注意:线程池设置在apr,nio模式下不生效(个人估计是个bug),查看manager页面,线程数还是200。因此需要将maxThreads,minSpareThreads直接设置在connector节点下


2 经验总结
首先要掌握未优化之前,服务器性能现状;
设置虚拟机内存,性能提升明显;
设置tomcat运行模式略微有提高;
设置tomcat线程池,一般设置的比较大以免成为瓶颈;
逐步递增的性能调试计划,从较少请求数,较低并发开始逐步递增。直到性能明显下降位置;
以吞吐率、并发、响应时间等为关键性能指标;
区分裸奔性能和分布式调用的性能;
尽量覆盖全部代码运行,服务启动要为性能测试做特殊处理(callId,timeStamp);
做AB压力测试,可以编写个shell夜间运行并将结果重定向;

3 widget的压力测试技术
224网段有防火墙设置,所以先前的压力测试不够准确
之后采取了搬迁物理服务器到防火墙外面
做了相关的压力测试
优化点如下:
1 动态、静态分离部署
2 将widget从2台扩充到8台物理服务器
3 单台物理服务器,配置1台tomcat占用全部服务器资源性能  <  配置8台tomcat占用全部服务器资源性能,大概差4-5倍

Linux命令查看CPU
more /proc/cpuinfo

主要查看物理cpu数,线程数
processor      逻辑处理器的id。
physical id    物理封装的处理器的id。
core id        每个核心的id。
cpu cores      位于相同物理封装的处理器中的内核数量。
siblings       位于相同物理封装的处理器中的逻辑处理器的数量。





Apache-Bench工具介绍
Apache HTTP服务器已经带了一个测试工具: ab

一般把apache压力测试称为AB测试. ab工具的位置在apache2的bin目录里为什么用这个工具

l  支持命令行执行,可以在linux行运行
l  简单,实用
l  应用广泛

1.1.1    输入参数
常用的命令如下:
./ab -n 请求次数 -c 并发数 地址

参数名 参数含义
-n 请求数
-c 并发数

windows下,地址要用双引号
linux下,地址用单引号

1.1.2    输出报表
字段名字 中文解释
Server Software 被测试的Web服务器软件名称
Server Hostname 请求的URL中的主机部分名称
Server Port 被测试的WEB服务器的监听端口
Document Path URL中的相对路径
Document Length http响应数据的正文长度
Concurrency Level 并发用户数(-c)
Time taken for tests 所有请求被处理完所花费的总时间
Complete requests 总请求数(-n)
Failed requests 失败请求数
Total transferred 所有请求的响应数据长度和,包括头和正文
HTML transferred 所有请求的响应数据中,正文数据的和
Requests per second 吞吐率
Time per request 用户平均请求等待时间 = time taken for tests / (complete requests / concurrency level)
Time per request: 服务器平均请求处理时间 = 吞吐率的倒数 = time per request / concurrency level
Transfer rate 请求在单位时间内,从服务器获的数据长度
Percentage of the requests served within a certain time (ms) 请求处理时间的分布情况

参考资料
http://www.cnblogs.com/jackei/archive/2006/07/18/454144.html  apache-ab
http://wenku.baidu.com/view/3fe17e1bc5da50e2524d7fb9.html apache-ab
http://phl.iteye.com/blog/910984  apr安装
http://phl.iteye.com/blog/910996  tomcat运行模式
http://phl.iteye.com/admin/blogs/1561604 proc/cpuinfo的概念
http://tomcat.apache.org/tomcat-7.0-doc/config/executor.html  tomcat线程池配置
http://tomcat.apache.org/tomcat-7.0-doc/config/http.html  tomcat protocol
http://city-moon.iteye.com/blog/578282  Tomcat 6 支持 NIO -- Tomcat的四种基于HTTP协议的Connector性能比较

<think> 我们正在解决用户的问题:使用JDK6启动Tomcat 7.0.109时遇到问题。根据之前的对话,我们知道Tomcat 7.0.109是支持JDK6的,但用户可能遇到了配置或兼容性问题。 结合用户提供的引用内容,我们可以总结出可能的原因和解决方案: 引用[1]提到环境变量未配置导致Tomcat启动失败,引用[2]提供了两种解决办法(降低JDK版本或升级Tomcat版本),引用[3]提到了手动编译Tomcat7源码的方法(但用户可能不需要),引用[4]是关于配置SSL的,可能不直接相关。 根据用户当前的问题描述,我们主要关注在JDK6环境下启动Tomcat 7.0.109的解决方案。 可能的问题和解决方案: 1. 环境变量配置不正确:确保JAVA_HOME指向JDK6的安装路径,且PATH中包含JDK6的bin目录。 2. JDK版本冲突:系统中可能安装了多个JDK,导致Tomcat启动时使用了错误的JDK版本。 3. Tomcat版本与JDK6的兼容性问题:虽然Tomcat7.0.x官方支持JDK6,但某些特定小版本可能存在bug,可以尝试使用Tomcat7.0.x的其他版本(如7.0.109是已知的稳定版本,但也可以尝试7.0.108或7.0.110等)。 4. 端口冲突:检查Tomcat的默认端口(8080,8005,8009)是否被其他程序占用。 5. 权限问题:在Linux系统下,可能需要给Tomcat的bin目录下的.sh文件添加执行权限。 6. 日志分析:查看Tomcat的logs目录下的catalina.out和localhost.log等日志文件,定位具体错误。 解决方案步骤: 第一步:确认JDK6安装和环境变量配置 - 检查JAVA_HOME:在命令行中执行`echo %JAVA_HOME%`(Windows)或`echo $JAVA_HOME`(Linux),确认指向JDK6的安装目录。 - 检查PATH:确保PATH中JDK6的bin目录在PATH环境变量中,并且位于其他JDK版本之前(避免使用其他版本的java)。 第二步:配置Tomcat使用JDK6 - 可以在Tomcat的bin目录下创建setenv.bat(Windows)或setenv.sh(Linux)文件,并设置JAVA_HOME和JRE_HOME。 Windows (setenv.bat): set "JAVA_HOME=C:\path\to\jdk1.6.0" set "JRE_HOME=C:\path\to\jdk1.6.0\jre" Linux (setenv.sh): export JAVA_HOME=/path/to/jdk1.6.0 export JRE_HOME=/path/to/jdk1.6.0/jre - 然后重启Tomcat。 第三步:检查端口占用 - Windows: `netstat -ano | findstr :8080` - Linux: `netstat -tulpn | grep :8080` - 如果端口被占用,可以修改Tomcat的conf/server.xml中的端口号。 第四步:检查Tomcat日志 - 查看Tomcat的logs/catalina.out文件(Linux)或logs/catalina.yyyy-mm-dd.log(Windows),寻找错误信息。 第五步:尝试使用命令行启动以便查看错误信息 - 进入Tomcat的bin目录,执行: catalina.bat run (Windows) ./catalina.sh run (Linux) 这样可以在控制台看到启动日志,便于发现错误。 第六步:如果以上步骤无法解决,考虑重新下载Tomcat7.0.109并重新配置。 第七步:如果问题依然存在,考虑升级Tomcat版本(如Tomcat8)或升级JDK(如JDK8),但用户当前要求使用JDK6,所以升级JDK可能不是首选。 另外,引用[2]中提到两种方法:降低JDK版本(用户已经在用JDK6)或升级Tomcat版本。如果用户的问题确实无法解决,可以考虑升级Tomcat到8.x(Tomcat8支持JDK7及以上,不支持JDK6),但用户环境是JDK6,所以升级Tomcat8不可行。因此,我们主要解决在JDK6环境下的问题。 根据引用[3],手动编译Tomcat7源码也是一种方法,但通常用于开发调试,对于部署环境来说比较繁琐,不建议普通用户使用。 根据引用[4],如果是SSL配置问题,可以检查conf/server.xml中关于SSL连接器的配置,但用户没有提到SSL相关错误,所以暂时不考虑。 生成相关问题: 1. 如何正确配置Tomcat的环境变量? 2. 如何查看Tomcat启动日志以排查问题? 3. Tomcat启动时出现端口冲突怎么办? 4. 如何在Windows/Linux下设置JAVA_HOME? 5. Tomcat7支持哪些JDK版本? 现在,按照步骤给出详细解答。 </think>### 使用 JDK6 启动 Tomcat 7.0.109 的解决方案 根据您的问题和引用内容[^1][^2],以下是针对 JDK6 启动 Tomcat 7.0.109 的完整解决方案: --- #### 一、核心问题排查(必做) 1. **验证环境变量** - 检查 `JAVA_HOME` 是否指向 JDK6 安装路径(如 `C:\Java\jdk1.6.0_45` 或 `/usr/lib/jvm/java-6-openjdk`) - 在命令行执行: ```bash echo %JAVA_HOME% # Windows echo $JAVA_HOME # Linux/Mac ``` - 若未配置,需在系统环境变量中添加: ```bash # Linux/Mac (写入 ~/.bashrc) export JAVA_HOME=/path/to/jdk1.6.0_45 export PATH=$JAVA_HOME/bin:$PATH # Windows (系统属性 → 环境变量) JAVA_HOME = C:\Java\jdk1.6.0_45 PATH = %JAVA_HOME%\bin;... ``` 2. **检查 Tomcat 启动脚本** 编辑 `tomcat/bin/catalina.bat`(Windows)或 `catalina.sh`(Linux),在文件开头强制指定 JDK: ```bash # Linux/Mac export JAVA_HOME=/path/to/jdk1.6.0_45 export JRE_HOME=$JAVA_HOME/jre # Windows set "JAVA_HOME=C:\Java\jdk1.6.0_45" set "JRE_HOME=%JAVA_HOME%\jre" ``` --- #### 二、常见问题修复 1. **SSL/TLS 协议兼容性问题**(引用[^4]) 修改 `conf/server.xml`,强制使用 TLSv1: ```xml <Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol" SSLEnabled="true" sslEnabledProtocols="TLSv1" <!-- 关键修改 --> keystoreFile="conf/keystore" keystorePass="changeit" /> ``` 2. **类加载冲突** 在 `conf/catalina.properties` 添加: ```properties tomcat.util.scan.StandardJarScanFilter.jarsToScan=\ bootstrap.jar,jaxen-*.jar,ant-*.jar tomcat.util.scan.StandardJarScanFilter.jarsToSkip=\ *.jar ``` 3. **内存配置调整** 在 `bin/setenv.bat` 或 `setenv.sh` 中添加: ```bash export CATALINA_OPTS="-Xms512m -Xmx1024m -XX:MaxPermSize=256m" ``` --- #### 三、替代方案(如问题仍存在) 1. **降级 Tomcat 版本**(引用[^2]) 下载与 JDK6 兼容性更好的 Tomcat 7.0.106: ```bash wget https://archive.apache.org/dist/tomcat/tomcat-7/v7.0.106/bin/apache-tomcat-7.0.106.tar.gz ``` 2. **源码编译适配**(引用[^3]) 手动编译 Tomcat 7 源码: ```bash # 1. 下载源码 svn checkout https://svn.apache.org/repos/asf/tomcat/tc7.0.x/tags/TOMCAT_7_0_109/ # 2. 修改 build.properties base.path=/path/to/jdk6/dependencies # 3. 使用 Ant 编译 ant download && ant build ``` --- #### 四、验证是否成功 启动 Tomcat 后检查日志: ```bash tail -f logs/catalina.out ``` 出现以下内容即表示成功: ``` INFO: Server startup in 1200 ms JVM Version: 1.6.0_45-b06 (Oracle Corporation) ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值