Resin 3 pro高并发,响应性与稳定性方案(转)
以下方案我是在Intel xeon(至强) 3.2G 2个双核物理CPU+2G内存(Ecc)上进行:
resin版本为resin-pro-3.0.21,JVM为Jrockit 1.5_06, resin java 启动参数 -Xms256m -Xmx512m
1. 以下为resin.conf配置
<!--
- Resin 3.0 configuration file.
-->
<resin xmlns="http://caucho.com/ns/resin"
xmlns:resin="http://caucho.com/ns/resin/core">
<!--
- Logging configuration for the JDK logging API.
-->
<log name="" level="all" path="stdout:" timestamp="[%H:%M:%S.%s] "/>
<logger name="com.caucho.java" level="config"/>
<logger name="com.caucho.loader" level="config"/>
<dependency-check-interval>600s</dependency-check-interval>
<javac compiler="internal" args=""/>
<thread-pool>
<thread-max>10240</thread-max>
<spare-thread-min>50</spare-thread-min>
</thread-pool>
<min-free-memory>5M</min-free-memory>
<server>
<class-loader>
<tree-loader path="${resin.home}/lib"/>
<tree-loader path="${server.root}/lib"/>
</class-loader>
<keepalive-max>1024</keepalive-max>
<keepalive-timeout>60s</keepalive-timeout>
<resin:if test="${resin.isProfessional()}">
<select-manager enable="true"/>
</resin:if>
<bind-ports-after-start/>
<http server-id="" host="*" port="80"/>
<cluster>
<srun server-id="" host="127.0.0.1" port="6802"/>
</cluster>
<resin:if test="${resin.isProfessional()}">
<persistent-store type="cluster">
<init path="session"/>
</persistent-store>
</resin:if>
<ignore-client-disconnect>true</ignore-client-disconnect>
<resin:if test="${isResinProfessional}">
<cache path="cache" memory-size="20M"/>
</resin:if>
<web-app-default>
<class-loader>
<tree-loader path="${server.root}/ext-webapp"/>
</class-loader>
<cache-mapping url-pattern="/" expires="60s"/>
<cache-mapping url-pattern="*.gif" expires="600s"/>
<cache-mapping url-pattern="*.jpg" expires="600s"/>
<servlet servlet-name="directory"
servlet-class="com.caucho.servlets.DirectoryServlet">
<init enable="false"/>
</servlet>
<allow-servlet-el/>
<session-config>
<enable-url-rewriting>false</enable-url-rewriting>
</session-config>
</web-app-default>
<host-default>
<class-loader>
<compiling-loader path="webapps/WEB-INF/classes"/>
<library-loader path="webapps/WEB-INF/lib"/>
</class-loader>
<!--access-log path="logs/access.log"
format='%h %l %u %t "%r" %s %b "%{Referer}i" "%{User-Agent}i"'
rollover-period="1W"/-->
<web-app-deploy path="webapps"/>
<ear-deploy path="deploy">
<ear-default>
<!-- Configure this for the ejb server
-
- <ejb-server>
- <config-directory>WEB-INF</config-directory>
- <data-source>jdbc/test</data-source>
- </ejb-server>
-->
</ear-default>
</ear-deploy>
<resource-deploy path="deploy"/>
<web-app-deploy path="deploy"/>
</host-default>
<resin:import path="${resin.home}/conf/app-default.xml"/>
<host-deploy path="hosts">
<host-default>
<resin:import path="host.xml" optional="true"/>
</host-default>
</host-deploy>
<host id="" root-directory=".">
<web-app id="/" document-directory="d:\website\chat">
</web-app>
</host>
</server>
</resin>
2.
在应用的resin.conf的web-app-default元素下加入resin status查看servlet映射 (原文是加在了web.xml中,在resin3.1.10中服务启动失败)
<servlet-mapping servlet-class='com.caucho.servlets.ResinStatusServlet'>
<url-pattern>/resin-status</url-pattern>
<init enable="read"/>
</servlet-mapping>
3. 启动resin,确认应用正常启动。
4. 写访问测试程序
<!--
import java.io.InputStream;
import java.net.URL;
public class TestURL
{
public static void main(String[] args) throws Exception
{
long a = System.currentTimeMillis();
System.out.println("Starting request url:");
for(int i = 0; i < 10000; i++){
URL url = new URL("http://192.168.1.200/main.jsp");
InputStream is = url.openStream();
is.close();
System.out.println("Starting request url:"+i);
}
System.out.println("request url end.take "+(System.currentTimeMillis()-a)+"ms");
}
}
-->
5. 在Jbuilder中执行TestURL
在执行过程中,一边刷新http://192.168.1.200/resin-status,查看resin状态,在http://*:80 中的 Active Threads 和 Total,会一直增长,当长到512的时候不再增长,这时再刷新resin-status页面时,会发现打开很慢。原因是服务器已经达到最大连接数,在等待前面连接的释放而不能接受新的连接。
于是下载Resin 3.0.21源码,搜索 512,发现com.caucho.server.port.Port类中有以下代码:
// default timeout
private long _timeout = 65000L;
private int _connectionMax = 512;//就是这行,查找resin所有源码后,发现没有对这个值进行设置
private int _minSpareConnection = 16;
private int _keepaliveMax = -1;
private int _minSpareListen = 5;
private int _maxSpareListen = 10;
将_connectionMax 改为 20480,然后重新编译并替换resin.jar中的Port类。
6. 重新启动Resin,再次运行TestURL进行测试,这次你会发现Threads Active 和 Total 一直变大,且可以超过512一直增大,在测试程序运行过程中刷新页面,页面响应性能还是不错的.
另,测试过程中Resin会打印出 1-3次 强制执行GC的信息,属于正常。
7.待测试完毕,Threads Active 和 Total 马上降为1.Idle为9,总内存为536.87Meg 空闲内存为480.33M
再经多次测试,结果一致,内存回收正常,表明当前 resin 稳定性和响应性可靠。
原文连接:http://www.blogjava.net/jelver/articles/183345.html
分享到:
相关推荐
- 进程回滚:让死锁进程回退到一个无死锁的状态,然后重新执行。 - 资源分配策略调整:改变资源分配策略,避免再次发生死锁。 五、代码实现 在给定的文件中,"SafetyAutoLock.cpp"和"SafetyAtuoLock.h"可能是实现...
### DB2死锁问题分析及解决方案 #### 一、引言 在数据库管理与维护过程中,死锁问题是一个常见的挑战,特别是在使用IBM DB2这样的大型关系型数据库管理系统时。本文将详细探讨DB2中死锁问题的分析方法及有效的解决...
1. **检查代码逻辑**:确保每次操作后都正确关闭连接和释放资源,避免事务悬空。 2. **优化事务管理**:尽量减少事务的粒度,尽快完成事务操作,避免长时间占用锁。 3. **设置超时时间**:通过设置`busy_timeout`...
针对交换超立方网络通信中所出现的死锁及延迟问题,提出了一种基于虫洞路由的无死锁算法。引入交换超立方网的s-导出子网和t-导出子网的的概念,证明了s-导出子网和t-导出子网分别同构于s维超立方体网络和t维超立方体...
理解死锁的原因和解决策略对于优化数据库性能至关重要。 首先,我们要深入理解死锁的基本原理。死锁的根本原因是资源竞争。在SQL Server中,当两个或更多事务按不同顺序请求并持有资源时,就可能发生死锁。举个例子...
本文将深入探讨“DB2解决表死锁”这一主题,结合提供的资源“DB2解除表锁.doc”,我们将讨论死锁的基本概念、DB2中的死锁检测、死锁预防以及如何在遇到死锁时进行有效的解决。 首先,我们要理解什么是死锁。死锁是...
它允许死锁的发生,并在死锁发生后采取措施来解决。具体做法包括: 1. **定期检测**:数据库系统周期性地检查是否存在死锁状态,一旦发现死锁,就需要采取行动,如回滚其中一个或多个事务,以解除死锁。 2. **死锁...
3. 使用PL/SQL函数来解决死锁:可以使用PL/SQL函数来解决死锁问题。 示例代码: ```plsql CREATE OR REPLACE FUNCTION kill_session(p_sid IN NUMBER, p_serial IN NUMBER) RETURN NUMBER IS v_count NUMBER; ...
### MySQL死锁解决 在数据库管理系统(DBMS)中,特别是在关系型数据库系统如MySQL中,事务处理是确保数据一致性和可靠性的关键机制之一。然而,在并发操作环境下,多个事务可能会因为请求锁定相同的资源而相互等待...
数据库死锁是一个需要认真对待的问题,但通过合理的预防、检测和解决策略,我们可以有效地避免和解决死锁问题,确保数据库系统的稳定运行。通过优化查询、调整事务隔离级别、分解大事务、使用锁超时以及加强监控和告...
一、数据库死锁的现象 程序在执行的过程中,点击确定或保存按钮,程序没有响应,也没有出现报错。 二、死锁的原理 当对于数据库某个表的某一列做更新或删除等操作,执行完毕后该条语句不提 交,另一条对于这一列...
本文将深入探讨ORACLE表死锁的成因、检测与解决方法,基于实际测试经验分享有效的解决方案。 ### ORACLE表死锁的成因 死锁通常发生在多个事务同时对同一资源进行互斥访问的情况下。具体而言,当一个事务请求锁定一...
本文将深入探讨SQL Server死锁的概念、原因、检测方法以及如何有效地解决和预防死锁。 1. **死锁的概念** 死锁是系统资源分配的一种状态,其中两个或更多的事务相互等待对方释放资源,形成一个循环等待链,导致...
本文将探讨MySQL死锁的产生原因以及解决方案。 **死锁的产生原因** 1. **资源竞争与顺序依赖**:当两个事务A和B分别持有对方需要的资源,A等待B释放资源,B也在等待A释放资源,就会形成死锁。例如,事务A锁定表A后...
### SQL死锁解析与删除失败解决方案 #### 一、理解SQL死锁 在数据库系统中,当两个或多个事务在等待对方释放资源时就会发生死锁。这种情况类似于现实生活中的两个或多个人互相等待对方做出动作而自己却不动的情况...
### Oracle死锁原因及解决办法 #### 一、Oracle死锁概述 在Oracle数据库系统中,死锁是一种常见的并发问题,它会导致多个事务之间互相等待对方释放资源而无法继续执行,最终导致整个系统的运行效率降低甚至停滞。...
### 数据库死锁解决方案详解 #### 一、死锁的本质及常见表现形式 在数据库管理领域,死锁问题一直是困扰开发者的重要难题之一。死锁的根本原因在于资源竞争,特别是当两个或多个进程试图以不同的顺序锁定同一组...
6. 使用select 数据库名=dbname(dbid), 用户ID=uid, 用户名=loginame, 累计CPU时间=cpu, 登录时间=login_time, 打开事务数=open_tran, 进程状态=status命令来查询死锁的进程信息。 7. 使用select 工作站名=hostname,...
本文将深入探讨如何使用`synchronized`来解决Java中的死锁问题。 首先,我们需要理解死锁的四个必要条件: 1. 互斥条件:至少有一个资源必须在任何时候只能由一个线程使用。 2. 请求与保持条件:一个线程因请求被...