ColdFusion 10实例/ Tomcat以可预测的间隔死亡(白屏死机)

时间:2014-06-26 15:45:12

标签: tomcat coldfusion coldfusion-10

在过去的几天里,团队一直在努力解决一个持续的问题,在这个问题上,一个ColdFusion实例一直是白屏死机。

每三个小时,网站就会开始为任何网址返回一个空白页面。然后我们将重新启动实例,一切都会很棒......再过三个小时,几乎到了分钟。当然这发生在星期五,因此所有周末的人都会在每次死亡时轮流重新启动实例。

尽我所知,在这个开始发生之前,没有人对ColdFusion或我们的服务器环境做过任何更改。在此之前,实例运行正常。

从那时起,我们已经看到此实例的isapi_redirect.log文件充满了Tomcat /连接错误。

我们按照http://www.webtrenches.com/post.cfm/resolve-stability-problems-and-speed-up-coldfusion-10上的优秀说明操作,并根据建议调整了我们的连接器设置。虽然这可能很好地帮助了一般性能,并且在崩溃之间将时间范围从3小时改为3.5小时,但它还没有解决它。

在此之前,我们甚至尝试将网站从我们的虚拟服务器移动到另一个虚拟服务器而没有运气。

我们尝试重新启动IIS,甚至重新启动整个服务器一晚,看看是否有帮助,但仍然没有。

以下是我们在日志和配置中看到的尽可能多的信息。非常感谢任何帮助,请让我知道我能提供哪些其他有用的细节。


我们正在运行IIS v7.5.7600.16385

这是唯一绑定到此实例的网站/ IIS记录,它专门与它绑定,而不是"所有网站"。

当问题发生时,我认为没有任何请求进入实例... IIS日志显示连接仍在发生,但实例的http.log文件只是停止。

我不确定tomcat相关的错误是否是问题或症状。

当问题发生时,服务器运行良好,我们有几个其他CF实例一起运行,没有问题。

有问题的实例的CF管理员加载并在问题期间完全响应(对于我来说,对于我来说,对于实例的其他过去问题,情况并非如此)。

同样,在这个问题出现之前,没有人用我们的代码,CF实例配置或服务器配置改变任何东西。我们可以告诉你。


Server Product: ColdFusion
Version: 10,0,13,287689
Tomcat Version: 7.0.23.0
Edition: Enterprise
Operating System: Windows Server 2008 R2
OS Version:  6.1
Update Level: chf10000013.jar
Adobe Driver Version: 4.1 (Build 0001)

workers.properties:

worker.list=Instance_Codebase
worker.Instance_Codebase.type=ajp13
worker.Instance_Codebase.host=localhost
worker.Instance_Codebase.port=8014
worker.Instance_Codebase.max_reuse_connections=250
worker.Instance_Codebase.connection_pool_size=250
worker.Instance_Codebase.connection_pool_timeout=60

server.xml中

<Server port="8009" shutdown="SHUTDOWN">
    <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on"></Listener>
    <Listener className="org.apache.catalina.core.JasperListener"></Listener>
    <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener"></Listener>
    <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener"></Listener>
    <GlobalNamingResources>
        <Resource description="User database that can be updated and saved" name="UserDatabase" pathname="conf/tomcat-users.xml" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" type="org.apache.catalina.UserDatabase" auth="Container"></Resource>
    </GlobalNamingResources>
    <Service name="Catalina">
        <Executor name="tomcatThreadPool" minSpareThreads="4" maxThreads="150" namePrefix="catalina-exec-"></Executor>
        <Connector port="8014" protocol="AJP/1.3" redirectPort="8447" tomcatAuthentication="false" maxThreads="250" connectionTimeout="60000"></Connector>
        <Engine jvmRoute="Instance_Codebase" name="Catalina" defaultHost="localhost">
            <Realm className="org.apache.catalina.realm.LockOutRealm">
                <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"></Realm>
            </Realm>
            <Host name="localhost" autoDeploy="false" unpackWARs="true" appBase="webapps">
                <!--<Valve pattern="%h %l %u %t &quot;%r&quot; %s %b" directory="logs" prefix="localhost_access_log." className="org.apache.catalina.valves.AccessLogValve" suffix=".txt" resolveHosts="false"></Valve>-->
            </Host>
        </Engine>
        <Connector port="8501" protocol="org.apache.coyote.http11.Http11NioProtocol" connectionTimeout="20000" redirectPort="8443" executor="tomcatThreadPool"></Connector>
    </Service>
</Server>

我们的isapi_redirect.log示例。可以在http://trasper.com/files/isapi_redirect.log.txt查看完整部分内容。

问题(在这个例子中)恰好在晚上11:41发生。据我们所知。

[Wed Jun 25 23:40:34.503 2014] [10012:912] [info] ajp_send_request::jk_ajp_common.c (1658): (Instance_Codebase) all endpoints are disconnected, detected by connect check (27), cping (0), send (0)

[Wed Jun 25 23:40:34.504 2014] [10012:1396] [info] ajp_connection_tcp_get_message::jk_ajp_common.c (1313): (Instance_Codebase) can't receive the response header message from tomcat, network problems or tomcat (127.0.0.1:8014) is down (errno=54)
[Wed Jun 25 23:40:34.820 2014] [10012:1396] [error] ajp_get_reply::jk_ajp_common.c (2190): (Instance_Codebase) Tomcat is down or refused connection. No response has been sent to the client (yet)
[Wed Jun 25 23:40:34.823 2014] [10012:1396] [info] ajp_service::jk_ajp_common.c (2692): (Instance_Codebase) sending request to tomcat failed (recoverable),  (attempt=1)

[Wed Jun 25 23:40:34.708 2014] [10012:7880] [error] ajp_get_reply::jk_ajp_common.c (2190): (Instance_Codebase) Tomcat is down or refused connection. No response has been sent to the client (yet)

[Wed Jun 25 23:40:40.477 2014] [10012:2296] [info] ajp_connect_to_endpoint::jk_ajp_common.c (1047): Failed opening socket to (127.0.0.1:8014) (errno=61)

[Wed Jun 25 23:40:40.364 2014] [10012:8256] [error] ajp_service::jk_ajp_common.c (2711): (Instance_Codebase) connecting to tomcat failed.

[Wed Jun 25 23:40:40.825 2014] [10012:7060] [error] HttpExtensionProc::jk_isapi_plugin.c (2309): service() failed with http error 503

[Wed Jun 25 23:40:40.877 2014] [10012:10364] [error] ajp_send_request::jk_ajp_common.c (1669): (Instance_Codebase) connecting to backend failed. Tomcat is probably not started or is listening on the wrong port (errno=61)
[Wed Jun 25 23:40:40.965 2014] [10012:10364] [info] ajp_service::jk_ajp_common.c (2692): (Instance_Codebase) sending request to tomcat failed (recoverable), because of error during request sending (attempt=1)

[Wed Jun 25 23:40:40.857 2014] [10012:1020] [error] HttpExtensionProc::jk_isapi_plugin.c (2309): service() failed with http error 503

4 个答案:

答案 0 :(得分:1)

感谢大家的投入和帮助。截至今天,我们已经免费运行WSOD 4天以上了。

我们仍然不确定是什么引发了这个问题,它可能只是网络流量的一个转折点,但我相信我们现在已经控制它了。

在很大程度上,我认为这是连接器调整的问题。

默认情况下,使用Web服务配置工具(wsconfig.exe)创建连接器时,连接池将设置为250个连接,但默认情况下,这不会反映在server.xml配置中。我们更改了AJP / 1.3连接器以指定匹配的最大线程值,并添加了60秒的连接超时,因为它们是无限期的。

我们还调整了workers.properties文件以指定connection_pool_size和connection_pool_timeout以匹配。

以前的默认设置似乎与isapi_redirect.log匹配,我们会看到每次我们正好接近200个连接时tomcat会停止。匹配所有这些设置似乎有所帮助。

配置更改后,我们删除了并从实例重新创建了连接器本身。这样,我们100%确定连接器是最新的,包含所有服务器更新的最新更改。

然后我们也在IIS中重新启动了网站,但我们必须确保实例的w3wp.exe进程也被重置(我们终止了进程并让它重新启动)。

然后我们把所有东西都备份起来,从那时起就没有任何问题。


再次感谢此处和Adobe forums提供的协助;它帮助我们专注于我们的一些问题。如果发现任何其他信息,我一定会更新这篇文章。我很确定这些步骤可以帮助任何有连接器/ tomcat性能问题的人。

以下是我们能够找到的一些很好的资源,帮助了我们很多:


最后,这里是我们为解决问题所做的更改和步骤的摘要:


1。) server.xml

更改

<Connector port="8014" protocol="AJP/1.3" redirectPort="8446" tomcatAuthentication="false">

<Connector port="8014" protocol="AJP/1.3" redirectPort="8447" tomcatAuthentication="false" maxThreads="250" connectionTimeout="60000">

2。) workers.properties

设置(以确保它与我们的连接数匹配)

worker.Instance_Codebase.max_reuse_connections=250

添加了行

worker.Instance_Codebase.connection_pool_size=250
worker.Instance_Codebase.connection_pool_timeout=60

3。)删除现有连接器,然后使用实例的Web服务器配置工具(wsconfig.exe)重新创建连接器(确保以管理员身份运行!)。

另请注意,重建连接器可能需要您将上述更改重新输入到workers.properties文件中。


4。)重新启动IIS站点,其中包括确保站点的w3wp.exe进程已停止/终止并重新启动。


5.)启动实例和IIS站点备份。

答案 1 :(得分:0)

您可以忽略日志中的大多数条目,因为它们是来自Tomcat的信息。作为cocerns,我注意到的是错误502(错误网关)和503(服务不可用)。日志仍然有信息/错误,而不是调试信息。你能否将日志级别更改为&#34; debug &#34;来自&#34; 信息&#34;并重新启动IIS。

此外,您网站的连接器也需要调整。您可以参考http://blogs.coldfusion.com/post.cfm/coldfusion-11-iis-connector-tuning。这也适用于CF10。您可以启用指标记录(调试和记录&gt;调试输出设置),然后调整连接器。使用Current Thread Count作为connection_pool_size的输入,然后设置max_reuse_connections。

答案 2 :(得分:0)

尝试在Application.cfc中注释掉onError()方法。然后你的白色死亡屏幕会显示一条错误信息,这可能会帮助你调试正在进行的事情。

答案 3 :(得分:0)

我相信这可能与Tomcat有关,而与ColdFusion无关。当Tomcat出现错误时,Internet上有很多关于Tomcat空响应的帖子。甚至在早期版本的Tomcat(2011)中修复了一个错误。 ColdFusion定制了Tomcat,所以由Adobe来完成所有更改并将它们作为修补程序吐出。我不确定哪些版本的Tomcat Adob​​e在开始定制时(可能在2010年或2011年)使用它们或者它们对改进补丁有多容易。在Tomcat有补丁的Adobe论坛上,应用程序池和Tomcat也存在类似的问题,但Adobe没有将它集成到他们的tomcat版本中。 https://forums.adobe.com/thread/1023068?start=40&tstart=0

以下是tomcat上的错误修复示例: https://issues.apache.org/bugzilla/show_bug.cgi?id=51550

我记得看到另一篇关于tomcat的帖子,其默认错误页面错误地设置为“”(errorPage =“”),而不是实际的错误页面,这会推高空响应。

这也可以解释为什么你不能在ColdFusion中捕获错误,而IIS只能提供200.

所以,在这种情况下的答案有点神秘,你可以自动让你的web服务器层重试空响应,希望它们能够正常工作,因为它们通常对页面刷新有好处,但这也有有可能加剧任何灾难。但是,它仍然是一个很好的解决方法。您还可以尝试确定Adobe是否有任何更新Tomcat的解决方案。

Anit在这里拥有最终的权威,我的回答主要是猜测。