2009-12-04 100 views
5

我们使用Apache和JBOSS来托管我们的应用程序,但是我们发现了一些与线程处理mod_jk有关的问题。Apache与JBOSS使用AJP(mod_jk)给线程数产生尖峰

我们的网站属于低流量网站,在我们网站的高峰活动期间拥有最多200-300位并发用户。随着流量的增长(不是以并发用户为单位,而是以服务器的累积请求为单位),服务器停止提供很长时间的请求,虽然它没有崩溃,但直到20分钟才能提供请求。 JBOSS服务器控制台显示350个线程在两台服务器上都很忙,尽管有足够的空闲内存,比如1-1.5 GB(JBOSS使用2台服务器,64位,为JBOSS分配4 GB RAM)

为了检查我们使用JBOSS和Apache Web控制台的问题,我们发现线程在S状态下显示的时间长达数分钟,尽管我们的页面大约需要4-5秒才能提供服务。

我们采取了线程转储,发现线程主要处于WAITING状态,这意味着它们无限期地等待着。这些线程不是我们的应用程序类,而是AJP 8009端口。

有人可以帮助我,因为别人也可能得到这个问题,并以某种方式解决它。如果需要更多信息,请告诉我。

也是mod_proxy比使用mod_jk更好,或者mod_proxy还有一些其他问题,如果我切换到mod_proxy可能会致命吗?是

我使用的版本如下:

Apache 2.0.52 
JBOSS: 4.2.2 
MOD_JK: 1.2.20 
JDK: 1.6 
Operating System: RHEL 4 

感谢您的帮助。

伙计们!我们终于找到了上述配置的解决方法。这是APR的使用,这里提到:http://community.jboss.org/thread/153737。其问题正如许多人在下面的答案中正确提到的那样,即连接器问题。此前我们通过配置hibernate和增加响应时间来做临时解决方案。完整的修复是APR。

回答

0

我们所做的排序这个问题出如下:

<property name="hibernate.cache.use_second_level_cache">false</property> 


<property name="hibernate.search.default.directory_provider">org.hibernate.search.store.FSDirectoryProvider</property> 
    <property name="hibernate.search.Rules.directory_provider"> 
     org.hibernate.search.store.RAMDirectoryProvider 
    </property> 

    <property name="hibernate.search.default.indexBase">/usr/local/lucene/indexes</property> 

    <property name="hibernate.search.default.indexwriter.batch.max_merge_docs">1000</property> 
    <property name="hibernate.search.default.indexwriter.transaction.max_merge_docs">10</property> 

    <property name="hibernate.search.default.indexwriter.batch.merge_factor">20</property> 
    <property name="hibernate.search.default.indexwriter.transaction.merge_factor">10</property> 

<property name ="hibernate.search.reader.strategy">not-shared</property> 
<property name ="hibernate.search.worker.execution">async</property> 
<property name ="hibernate.search.worker.thread_pool.size">100</property> 
<property name ="hibernate.search.worker.buffer_queue.max">300</property> 

<property name ="hibernate.search.default.optimizer.operation_limit.max">1000</property> 
<property name ="hibernate.search.default.optimizer.transaction_limit.max">100</property> 

<property name ="hibernate.search.indexing_strategy">manual</property> 

以上参数确保工作线程不会被lucene和hibernate搜索阻塞。 hibernate的默认优化器让我们的生活变得轻松,因此我认为这个设置非常重要。

还删除了C3P0连接池并使用内置的JDBC连接池,因此我们在下面的部分进行了评论。

<!--For JDBC connection pool (use the built-in)--> 


<property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property> 
    <!-- DEPRECATED very expensive property name="c3p0.validate>--> 
    <!-- seconds --> 

做这一切之后,我们能够显着降低其中AJP线程正在采取以服务请求的时间和线程开始来R状态服务于S状态的要求,即后。

0

我们是在一个JBoss 5环境有这个问题。原因是Web服务比Jboss/Tomcat允许的响应时间更长。这会导致AJP线程池最终耗尽其可用线程。然后它会停止响应。我们的解决方案是调整Web服务以使用Request/Acknowledge模式而不是Request/Respond模式。这使Web服务在每次超时时间内都能响应。当然这并不能解决Jboss的底层配置问题,但是在我们的上下文中调整jboss比较容易。

2

在jboss/bin/native下部署Apache本机APR。

编辑您的jboss run.sh以确保它正在寻找正确的文件夹中的本机库。

这将强制jboss使用本机AJP连接器的trhead而不是默认的纯java版本。