- 浏览: 43902 次
- 性别:
- 来自: 北京
文章分类
最新评论
http://blog.csdn.net/ruixj/article/details/754079
写道
问题描述:
有一个系统的功能很简单,就是几个表单的提交和几个页面的显示。但是这个网站的访问量很大,一周时间累计至少10万次访问,高峰时间可能每秒的 点击数会达到500次。OS为Redhat Linux 9 , Database为Oracle 8i,JSP容器为Tomcat 4,使用Struts框架。当使用工具进行压力测试时,如果连接数到100个,2、3分钟后几乎所有访问都出现404错误,无法访问此页面。这就是我接到 问题时候的状况。
问题解决:
首先我们需要知道产生瓶颈的地方,分析后可能影响效率的地方有如下几处:
Struts产生的瓶颈
数据库的设置,最大连接数问题
Tomcat服务器的配置问题
Linux OS的配置问题
服务器的机器硬件配置问题
服务器的带宽不够
测试是否是Struts瓶颈问题很容易,我们用压力测试工具中设置只访问index.jsp这个页面,此页面和Struts没有一点关系,在每 秒点击在100次左右的时候,网站访问速度只是稍微有些慢,但是到200个访问数后,错误404再次发生。说明不是Struts产生的瓶颈,或者说 Struts的瓶颈不是主要影响我们效率的问题所在。
然后我们写了一个很简单的JSP测试页面,使用和在ActionServlet中调用数据库相同的方法进行一个Select操作,并且把那个结果显示到JSP页面中,针对这个test的页面,进行100次同时连接,错误出现了。此时还是不能判断什么是瓶颈所在。
然后登录上服务器,察看Tomcat的配置文件server.xml,发现允许最大的并发连接数设置项maxProcessors= "75",说明Tomcat允许的同时连接最大为75,这个肯定是一个tomcat的配置失误。把它改为maxProcessors="1000",重新 启动服务器,进行测试。对index.jsp文件测试的时候,同时连接500人的时候没有出现问题,但是测试test页面的数据库查询时,仍然是到100 个左右的连接数的时候出现404错误。这两个测试说明了tomcat服务器配置的问题基本解决了,问题已经不在tomcat的设置上了,很有可能是在数据 库中。
检查Oracle的设置,把最大连接数改成1000,再次测试test页面,仍然是错误。
在Linux下使用[root@NetCom51 bin]# ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
file size (blocks, -f) unlimited
max locked memory (kbytes, -l) unlimited
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
stack size (kbytes, -s) 8192
cpu time (seconds, -t)
发现允许使用的open files都达到了要求了。
服务器的硬件问题和带宽不是我们能解决的,暂时不管。现在把我们能做的事情定位在优化程序和优化服务器上。
Tomcat本身不能直接在计算机上运行,需要依赖于硬件基础之上的操作系统和一个java虚拟机。Sun公司和其它一些公司一直 在为提高性能而对java虚拟机做一些升级改进,一些报告显示JDK1.4在性能上比JDK1.3提高了将近10%到20%。我们使用java -version命令查看JRE的版本,发现已经是1.4了。
Tomcat默认可以使用的内存为128MB,在较大型的应用项目中,这点内存是不够的,需要调大。在linux下,修改{tomcat_home}/bin/catalina.sh文件,在
echo "Using CATALINA_BASE: $CATALINA_BASE"
echo "Using CATALINA_HOME: $CATALINA_HOME"
echo "Using CATALINA_TMPDIR: $CATALINA_TMPDIR"
echo "Using JAVA_HOME: $JAVA_HOME"
后加上
JAVA_OPTS='-Xms256m -Xmx512m'
JAVA_OPTS='-Xms【初始化内存大小】 -Xmx【可以使用的最大内存】'
这两个值的大小一般根据需要进行设置。初始化堆的大小执行了虚拟机在启动时向系统申请的内存的大小。一般而言,这个参数不重要。但是有的应用 程序在大负载的情况下会急剧地占用更多的内存,此时这个参数就是显得非常重要,如果虚拟机启动时设置使用的内存比较小而在这种情况下有许多对象进行初始 化,虚拟机就必须重复地增加内存来满足使用。由于这种原因,我们一般把-Xms和-Xmx设为一样大,而堆的最大值受限于系统使用的物理内存。一般使用数 据量较大的应用程序会使用持久对象,内存使用有可能迅速地增长。当应用程序需要的内存超出堆的最大值时虚拟机就会提示内存溢出,并且导致应用服务崩溃。因 此一般建议堆的最大值设置为可用内存的最大值的80%。
重新启动服务器进行测试,发现服务器启动速度变慢,但是启动后服务器效率确实有提高,但是仍然未能达到我们要求的每秒500访问数的要求。
重新检查程序,试着使用tomcat的数据库连接池,修改tomcat配置文件server.xml,在context标签中加上
<Context path="" docBase="ROOT" debug="0">
<Resource name="jdbc/OracleDB" auth="Container" type="javax.sql.DataSource"/>
<ResourceParams name="jdbc/OracleDB">
<parameter>
<name>factory</name>
<value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
</parameter>
<parameter>
<name>driverClassName</name>
<value>oracle.jdbc.driver.OracleDriver</value>
</parameter>
<parameter>
<name>url</name>
<value>jdbc:oracle:thin:@10.11.6.1:1521:dbname</value>
</parameter>
<parameter>
<name>username</name>
<value>yourname</value>
</parameter>
<parameter>
<name>password</name>
<value>yourpasswd</value>
</parameter>
<parameter>
<name>maxActive</name>
<value>1000</value>
</parameter>
<parameter>
<name>maxIdle</name>
<value>20</value> </parameter>
<parameter>
<name>maxWait</name>
<value>-1</value>
</parameter>
</ResourceParams>
</Context>
maxActive 是最大激活连接数,这里取值为1000,表示同时最多有1000个数据库连接。maxIdle是最大的空闲连接数,这里取值为20,表示即使没有数据库连 接时依然可以保持20空闲的连接,而不被清除,随时处于待命状态。MaxWait是最大等待秒钟数,这里取值-1,表示无限等待,直到超时为止,也可取值 9000,表示9秒后超时。
修改web.xml文文件,加入
<resource-ref>
<description>Oracle
Datasource example</description>
<res-ref-name>jdbc/OracleDB</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
将Oracle的JDBC驱动classes12.jar拷贝到Tomcat安装目录的common/lib下。建立简单的测试页面test2.jsp:
Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
ds = (DataSource)envCtx.lookup("jdbc/OracleDB");
Connection cn=ds.getConnection();
进行测试,发现问题还没有解决,在同时连接100人的时候再次出错。
最后仔细检查后,发现是未释放connection资源,使用cn.close()方法,可以同时连接500个用户了。
有一个系统的功能很简单,就是几个表单的提交和几个页面的显示。但是这个网站的访问量很大,一周时间累计至少10万次访问,高峰时间可能每秒的 点击数会达到500次。OS为Redhat Linux 9 , Database为Oracle 8i,JSP容器为Tomcat 4,使用Struts框架。当使用工具进行压力测试时,如果连接数到100个,2、3分钟后几乎所有访问都出现404错误,无法访问此页面。这就是我接到 问题时候的状况。
问题解决:
首先我们需要知道产生瓶颈的地方,分析后可能影响效率的地方有如下几处:
Struts产生的瓶颈
数据库的设置,最大连接数问题
Tomcat服务器的配置问题
Linux OS的配置问题
服务器的机器硬件配置问题
服务器的带宽不够
测试是否是Struts瓶颈问题很容易,我们用压力测试工具中设置只访问index.jsp这个页面,此页面和Struts没有一点关系,在每 秒点击在100次左右的时候,网站访问速度只是稍微有些慢,但是到200个访问数后,错误404再次发生。说明不是Struts产生的瓶颈,或者说 Struts的瓶颈不是主要影响我们效率的问题所在。
然后我们写了一个很简单的JSP测试页面,使用和在ActionServlet中调用数据库相同的方法进行一个Select操作,并且把那个结果显示到JSP页面中,针对这个test的页面,进行100次同时连接,错误出现了。此时还是不能判断什么是瓶颈所在。
然后登录上服务器,察看Tomcat的配置文件server.xml,发现允许最大的并发连接数设置项maxProcessors= "75",说明Tomcat允许的同时连接最大为75,这个肯定是一个tomcat的配置失误。把它改为maxProcessors="1000",重新 启动服务器,进行测试。对index.jsp文件测试的时候,同时连接500人的时候没有出现问题,但是测试test页面的数据库查询时,仍然是到100 个左右的连接数的时候出现404错误。这两个测试说明了tomcat服务器配置的问题基本解决了,问题已经不在tomcat的设置上了,很有可能是在数据 库中。
检查Oracle的设置,把最大连接数改成1000,再次测试test页面,仍然是错误。
在Linux下使用[root@NetCom51 bin]# ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
file size (blocks, -f) unlimited
max locked memory (kbytes, -l) unlimited
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
stack size (kbytes, -s) 8192
cpu time (seconds, -t)
发现允许使用的open files都达到了要求了。
服务器的硬件问题和带宽不是我们能解决的,暂时不管。现在把我们能做的事情定位在优化程序和优化服务器上。
Tomcat本身不能直接在计算机上运行,需要依赖于硬件基础之上的操作系统和一个java虚拟机。Sun公司和其它一些公司一直 在为提高性能而对java虚拟机做一些升级改进,一些报告显示JDK1.4在性能上比JDK1.3提高了将近10%到20%。我们使用java -version命令查看JRE的版本,发现已经是1.4了。
Tomcat默认可以使用的内存为128MB,在较大型的应用项目中,这点内存是不够的,需要调大。在linux下,修改{tomcat_home}/bin/catalina.sh文件,在
echo "Using CATALINA_BASE: $CATALINA_BASE"
echo "Using CATALINA_HOME: $CATALINA_HOME"
echo "Using CATALINA_TMPDIR: $CATALINA_TMPDIR"
echo "Using JAVA_HOME: $JAVA_HOME"
后加上
JAVA_OPTS='-Xms256m -Xmx512m'
JAVA_OPTS='-Xms【初始化内存大小】 -Xmx【可以使用的最大内存】'
这两个值的大小一般根据需要进行设置。初始化堆的大小执行了虚拟机在启动时向系统申请的内存的大小。一般而言,这个参数不重要。但是有的应用 程序在大负载的情况下会急剧地占用更多的内存,此时这个参数就是显得非常重要,如果虚拟机启动时设置使用的内存比较小而在这种情况下有许多对象进行初始 化,虚拟机就必须重复地增加内存来满足使用。由于这种原因,我们一般把-Xms和-Xmx设为一样大,而堆的最大值受限于系统使用的物理内存。一般使用数 据量较大的应用程序会使用持久对象,内存使用有可能迅速地增长。当应用程序需要的内存超出堆的最大值时虚拟机就会提示内存溢出,并且导致应用服务崩溃。因 此一般建议堆的最大值设置为可用内存的最大值的80%。
重新启动服务器进行测试,发现服务器启动速度变慢,但是启动后服务器效率确实有提高,但是仍然未能达到我们要求的每秒500访问数的要求。
重新检查程序,试着使用tomcat的数据库连接池,修改tomcat配置文件server.xml,在context标签中加上
<Context path="" docBase="ROOT" debug="0">
<Resource name="jdbc/OracleDB" auth="Container" type="javax.sql.DataSource"/>
<ResourceParams name="jdbc/OracleDB">
<parameter>
<name>factory</name>
<value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
</parameter>
<parameter>
<name>driverClassName</name>
<value>oracle.jdbc.driver.OracleDriver</value>
</parameter>
<parameter>
<name>url</name>
<value>jdbc:oracle:thin:@10.11.6.1:1521:dbname</value>
</parameter>
<parameter>
<name>username</name>
<value>yourname</value>
</parameter>
<parameter>
<name>password</name>
<value>yourpasswd</value>
</parameter>
<parameter>
<name>maxActive</name>
<value>1000</value>
</parameter>
<parameter>
<name>maxIdle</name>
<value>20</value> </parameter>
<parameter>
<name>maxWait</name>
<value>-1</value>
</parameter>
</ResourceParams>
</Context>
maxActive 是最大激活连接数,这里取值为1000,表示同时最多有1000个数据库连接。maxIdle是最大的空闲连接数,这里取值为20,表示即使没有数据库连 接时依然可以保持20空闲的连接,而不被清除,随时处于待命状态。MaxWait是最大等待秒钟数,这里取值-1,表示无限等待,直到超时为止,也可取值 9000,表示9秒后超时。
修改web.xml文文件,加入
<resource-ref>
<description>Oracle
Datasource example</description>
<res-ref-name>jdbc/OracleDB</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
将Oracle的JDBC驱动classes12.jar拷贝到Tomcat安装目录的common/lib下。建立简单的测试页面test2.jsp:
Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
ds = (DataSource)envCtx.lookup("jdbc/OracleDB");
Connection cn=ds.getConnection();
进行测试,发现问题还没有解决,在同时连接100人的时候再次出错。
最后仔细检查后,发现是未释放connection资源,使用cn.close()方法,可以同时连接500个用户了。
发表评论
-
Python检测Windows剩余磁盘空间
2012-10-28 12:34 8768参考: http://linuxshow.blog.51ct ... -
Struts2/XWork 安全漏洞Remote Command Execution(二)
2012-06-03 08:39 3177Struts2/XWork 安全漏洞Remote Comman ... -
Tomcat性能调优方案
2012-01-12 07:25 667http://qibaopeng2000.blog.163. ... -
Tomcat内存、连接数等性能参数设置
2012-01-12 07:14 810http://space.itpub.net/144019 ... -
"ORA-28002"提示信息解决(Ver:11g)
2012-01-02 21:11 1018http://blog.163.com/z_rx/blog ... -
struts2文件上传大小
2011-12-19 23:39 727引用自:http://www.cnblogs.com/h ... -
Spring管理Hibernate事务
2011-12-18 11:01 1072引用自:http://www.cnblogs.com/An ... -
Ext window 相对位置
2011-12-05 22:57 1700var win = Ext.create('Ext.Windo ... -
非功能性的测试培训
2010-07-18 07:32 0参加了一个测试的培训,讲的是性能、安全等非基本功能 ... -
JQuery的Post提交的参数
2010-05-26 08:14 5427需要提交一个数字签名串,感觉数据量有点大,用的JQ ... -
关于基础组件的思考
2010-05-15 01:46 783使用了一个基础组件,它提供了自己的接口方法,强化了封 ... -
给自己定一些规则
2010-05-12 00:24 8752010-5-12 首先逻辑要简单,然后再追求复用。 ... -
Hibernate模糊查询
2010-05-11 08:23 2083看了官方文档的模糊查询,觉得不够。也看了几篇介绍基本 ... -
Hibernate的Event-listener业务审计日志的一个思路
2010-05-09 02:00 3169需要实现一个日志审计的功能,从JE上看到了一个 ...
相关推荐
标题中的“Tomcat配置连接数(优化)”指的是在Apache Tomcat服务器中调整与处理并发请求相关的设置,以提升服务器的性能和稳定性。这通常涉及到调整最大连接数、线程池大小、超时时间等核心参数。在高并发场景下,...
在JBOSSTomcat服务器的性能优化中,最大连接数配置和JVM内存配置是两个至关重要的环节,它们直接影响到服务器的响应速度和稳定性,尤其对于处理大量并发请求的场景。 首先,我们来看JBOSS最大连接数的配置。在`...
总结来说,一个高效的Tomcat服务器需要合理配置其连接器的协议类型、连接数和线程池大小。通过选择合适的协议,优化连接处理方式,合理分配线程资源,可以显著提升Tomcat服务器在处理并发请求时的性能。同时,需要...
Tomcat7 安装使用及 JVM 连接数参数调优 Tomcat7 是一个流行的 Java Web 服务器,主要用于部署和管理基于 Java 的 Web 应用程序。为了确保 Tomcat7 的稳定运行和高效性能,需要对其进行合理的安装、配置和优化。...
常见的负载均衡策略有轮询、最少连接数、IP哈希等。 配置Tomcat服务器集群和负载均衡通常涉及以下步骤: 1. **安装和配置Tomcat**:在多台服务器上安装相同版本的Tomcat,并确保所有服务器都能正常运行独立的...
Tomcat的性能可以通过调整配置参数、使用NIO(非阻塞I/O)连接器、启用压缩、限制并发连接数等方式进行优化。 6. **安全与管理** Tomcat提供了安全管理机制,如用户认证、角色授权和访问控制。管理员可以通过管理...
**Tomcat服务器工作原理** Tomcat是一款开源的Java Servlet容器,它是Apache软件基金会下的Jakarta项目的核心组件,主要用于部署和运行Java Web应用程序。Tomcat以其轻量级、高效和易于管理的特性,成为了许多...
【标题】:“深入理解Tomcat服务器搭建” 【内容详述】: Tomcat是Apache软件基金会Jakarta项目中的核心部分,它是一款开源且免费的Servlet容器,广泛用于部署Java Web应用程序。Tomcat对于开发者和运维人员来说,...
【Tomcat服务器】是Apache软件基金会的Jakarta项目下的一个开源免费Web应用服务器,它主要负责处理基于Java Servlet和JavaServer Pages(JSP)的应用。Tomcat作为一个轻量级的服务器,广泛应用于小型到中型企业级...
### Linux 下 Tomcat 优化设置最大连接数及内存 JConsole 监控 #### 一、Tomcat 内存优化 ##### 1.1 基本原理 在启动 Java 应用程序时,JVM(Java 虚拟机)会为应用程序分配一定的初始内存和最大内存。这些设置对...
本文将详细介绍如何对刚搭建好的Tomcat服务器进行简单的优化,包括启动内存优化以及线程和连接数的配置优化等方面。 #### 二、启动内存优化 启动内存优化是提高Tomcat服务器性能的重要手段之一。合理的内存设置...
例如,增加堆内存大小、设置合适的最大连接数等。 通过以上步骤,您已成功搭建了一个基本的Tomcat服务器。随着对Tomcat的深入理解和实践,您可以进一步掌握更多高级功能,如集群、负载均衡、SSL配置等,以满足复杂...
【标题】"Tomcat的连接器最新版"指的是Tomcat服务器中的Connector组件的最新更新,这个组件在Tomcat运行过程中起着至关重要的作用。Tomcat作为一个开源、免费的Web应用服务器,尤其受到Java开发者青睐,它能有效地...
这包括指定连接池的名称、类型、驱动类、最大活动连接数、最大空闲连接数、最大等待时间、验证查询等参数。例如: ```xml auth="Container" type="javax.sql.DataSource" driverClassName=...
开发者通常会在IDE(如Eclipse、IntelliJ IDEA)中集成Tomcat服务器,进行开发和调试。IDE会自动处理部署和重启过程。对于外部部署,开发者可以打包Web应用为WAR文件,然后将其放在Tomcat的webapps目录下,Tomcat会...
Apache Tomcat作为一款流行的Java Web服务器,其内置的数据库连接池功能为开发者提供了极大的便利。本文将详细介绍如何在Tomcat 6中配置数据库连接池,并通过实际案例进行演示。 #### 二、配置步骤详解 ##### 2.1 ...
【标题】:Tomcat服务器集群 【描述】:在高流量和高并发的Web应用环境中,单个Tomcat服务器可能无法满足性能需求。此时,通过搭建Tomcat服务器集群,可以实现负载均衡、故障转移和扩展性提升。本教程将详细介绍...
7. **安全与性能调整**:为了提高安全性,可以配置Tomcat的server.xml文件,比如设置用户访问权限、限制并发连接数等。同时,根据服务器资源情况调整Tomcat的JVM内存分配,以优化性能。 通过以上步骤,你就可以在...
【Apache Tomcat服务器文件详解】 Apache Tomcat是一款开源的Java Servlet容器,它是Java EE(Java Platform, Enterprise Edition)的一部分,特别用于实现Java Servlet和JavaServer Pages(JSP)技术。这个压缩包...