最近,我们的Apache Web服务器每天给我们多次这个错误:
[Tue Apr 06 01:07:10 2010] [error] Server ran out of threads to serve requests. Consider raising the ThreadsPerChild setting
我们将ThreadsPerChild设置从50提升到100,但是我们仍然得到错误。 我们的访问日志表明,这些错误甚至在高负载时也不会发生。 例如,这里是我们的访问日志摘录(IP地址和一些url被编辑为隐私)。 正如你所看到的,上述错误发生在1:07,导致错误的几分钟内只有less量的请求发生:
99.88.77.66 - - [06/Apr/2010:00:59:33 -0400] "GET /WebRepository/jquery/jquery-ui-1.7.1.custom/css/smoothness/images/ui-icons_222222_256x240.png HTTP/1.1" 304 - 99.88.77.66 - - [06/Apr/2010:00:59:34 -0400] "GET /WebRepository/jquery/jquery-ui-1.7.1.custom/css/smoothness/images/ui-bg_glass_75_dadada_1x400.png HTTP/1.1" 200 111 99.88.77.66 - - [06/Apr/2010:00:59:34 -0400] "GET /WebRepository/jquery/jquery-ui-1.7.1.custom/css/smoothness/images/ui-bg_glass_75_dadada_1x400.png HTTP/1.1" 200 111 99.88.77.66 - mpeu [06/Apr/2010:00:59:40 -0400] "GET /some/dynamic/content HTTP/1.1" 200 145049 55.44.33.22 - mpeu [06/Apr/2010:01:06:56 -0400] "GET /other/dynamic/content HTTP/1.1" 200 12311 55.44.33.22 - - [06/Apr/2010:01:06:56 -0400] "GET /WebRepository/jquery/jquery-ui-1.7.1.custom/css/smoothness/jquery-ui-1.7.1.custom.css HTTP/1.1" 304 - 55.44.33.22 - - [06/Apr/2010:01:06:56 -0400] "GET /WebRepository/jquery/jquery-ui-1.7.1.custom/js/jquery-1.3.2.min.js HTTP/1.1" 304 - 55.44.33.22 - - [06/Apr/2010:01:06:56 -0400] "GET /WebRepository/jquery/jquery-ui-1.7.1.custom/js/jquery-ui-1.7.1.custom.min.js HTTP/1.1" 304 - 55.44.33.22 - - [06/Apr/2010:01:06:56 -0400] "GET /WebRepository/jquery.tablesorter.min.js HTTP/1.1" 304 - 55.44.33.22 - - [06/Apr/2010:01:06:56 -0400] "GET /WebRepository/date.js HTTP/1.1" 304 - 55.44.33.22 - - [06/Apr/2010:01:06:56 -0400] "GET /WebRepository/pdfs/image1.gif HTTP/1.1" 304 - 55.44.33.22 - - [06/Apr/2010:01:06:56 -0400] "GET /WebRepository/pdfs/image2.png HTTP/1.1" 304 - 55.44.33.22 - - [06/Apr/2010:01:06:56 -0400] "GET /WebRepository/pdfs/image3.png HTTP/1.1" 304 - 55.44.33.22 - - [06/Apr/2010:01:06:56 -0400] "GET /WebRepository/pdfs/image4.png HTTP/1.1" 304 - 55.44.33.22 - - [06/Apr/2010:01:06:56 -0400] "GET /WebRepository/pdfs/image5.png HTTP/1.1" 304 - 55.44.33.22 - - [06/Apr/2010:01:06:56 -0400] "GET /WebRepository/pdfs/image6.png HTTP/1.1" 304 - 55.44.33.22 - - [06/Apr/2010:01:06:56 -0400] "GET /WebRepository/pdfs/image7.png HTTP/1.1" 304 - 55.44.33.22 - - [06/Apr/2010:01:06:57 -0400] "GET /WebRepository/pdfs/image8.png HTTP/1.1" 304 - 55.44.33.22 - - [06/Apr/2010:01:06:57 -0400] "GET /WebRepository/pdfs/image9.png HTTP/1.1" 304 - 55.44.33.22 - - [06/Apr/2010:01:06:57 -0400] "GET /WebRepository/pdfs/imageA.png HTTP/1.1" 304 - 55.44.33.22 - - [06/Apr/2010:01:06:57 -0400] "GET /WebRepository/jquery/jquery-ui-1.7.1.custom/css/smoothness/images/ui-bg_flat_75_ffffff_40x100.png HTTP/1.1" 304 - 55.44.33.22 - - [06/Apr/2010:01:06:59 -0400] "GET /WebRepository/jquery/jquery-ui-1.7.1.custom/css/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png HTTP/1.1" 304 - 55.44.33.22 - - [06/Apr/2010:01:06:59 -0400] "GET /WebRepository/jquery/jquery-ui-1.7.1.custom/css/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png HTTP/1.1" 200 110 55.44.33.22 - - [06/Apr/2010:01:06:59 -0400] "GET /WebRepository/jquery/jquery-ui-1.7.1.custom/css/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png HTTP/1.1" 200 110 11.22.33.44 - mpeu [06/Apr/2010:01:18:03 -0400] "GET /other/dynamic/content HTTP/1.1" 200 12311 11.22.33.44 - - [06/Apr/2010:01:18:03 -0400] "GET /WebRepository/jquery/jquery-ui-1.7.1.custom/js/jquery-1.3.2.min.js HTTP/1.1" 304 - 11.22.33.44 - - [06/Apr/2010:01:18:04 -0400] "GET /WebRepository/jquery/jquery-ui-1.7.1.custom/css/smoothness/jquery-ui-1.7.1.custom.css HTTP/1.1" 200 27374 11.22.33.44 - - [06/Apr/2010:01:18:04 -0400] "GET /WebRepository/jquery/jquery-ui-1.7.1.custom/js/jquery-ui-1.7.1.custom.min.js HTTP/1.1" 304 - 11.22.33.44 - - [06/Apr/2010:01:18:04 -0400] "GET /WebRepository/jquery.tablesorter.min.js HTTP/1.1" 200 12795 11.22.33.44 - - [06/Apr/2010:01:18:04 -0400] "GET /WebRepository/date.js HTTP/1.1" 200 25809
值得一提的是,我们运行的是Oracle 10g(2.0版本)附带的Apache版本,我们使用mod_plsql来生成我们的dynamic内容。 由于Apache服务器作为一个单独的进程运行,并且在发生此错误时数据库不会logging任何问题,所以我怀疑Oracle是否是问题。
不幸的是,这些错误吓坏了我们的系统pipe理员,他们倾向于指责服务器出现这个错误时出现的任何问题。 这是Apache的一个已知的错误,我根本无法find通过谷歌的任何参考?
编辑:在Embreau的请求,这里是我们正在使用的设置(注意,特定于Unix的,如MinSpareServers被注释掉)[另一个编辑 – 除了ThreadsPerChild这些都只是在安装时存在的默认值]:
ServerType standalone Timeout 300 SendBufferSize 16384 KeepAlive On MaxKeepAliveRequests 100 KeepAliveTimeout 15 MaxRequestsPerChild 0 ThreadsPerChild 100 #MinSpareServers 5 #MaxSpareServers 20 #MaxClients 150
进一步编辑:这是一个运行在64位1.6 GHz Itanium 2服务器上的Windows Server 2003系统,有16个内存。 我们已经开始做一些日志logging来确定发生这些错误时服务器的负载是多less; 我们的Apache日志显示几乎没有人触及网站,但数据收集过程发生在后台,所以也许其中一个缓慢的Apache足以导致一些问题或事情。
虽然你的configuration设置还有改进的空间,比如Embreau提到的,它们可能不是直接原因。
这可能是你的应用程序或沿着堆栈的东西造成的问题。
例如,如果您的应用程序正在等待来自数据库的响应,则最终可能会导致所有线程等待,因此即使在低负载情况下也会造成问题。 这种性能通常会被主动数据库连接搅动所示。
应用程序错误可能会performance出相同的性能,并且更难以分离。 虽然这是事实,但除非有这样的暗示,否则我将首先关注两件事情。
为什么要configurationThreadsPerChild或SendBufferSize ? 使用ThreadsPerChild ,除非有不寻常的需求,或者您已经对其使用做了适当的考虑,否则默认应该没问题。 如果调整不当,可能会耗尽物理内存并开始交换,这会降低性能。
MaxRequestsPerChild设置为0是不明智的。 如果您的应用程序有内存泄漏,Apache儿童将永远不会回收。 你想让他们回收。
我猜你是一名开发人员。 您的系统pipe理员应该与您密切合作来解决此问题,因为这绝对是一个跨function问题。
您的超时值设置为300秒,这是5分钟,将其设置为更合理的值,如15或30秒。
现在你的问题可能是ThreadsPerChild的值。 设置它至less250.请监视负载下的任务pipe理器的变化,以确保它没有矫枉过正(可能不是,我已经设置了一些旧的单核CPU服务繁忙的网站更高)。
如果我理解正确,它是一个Windows操作系统? 如果是这样,哪一个硬件? (CPU和内存)