2013-03-04 68 views
2

我在运行IIS 7.5的Windows 2008 Server(64位)上运行ActiveState Perl 5.16.2(32位)时遇到问题。 Perl在IIS中使用PerlIS.dll和ISAPI筛选器运行。ActiveState Perl在高负载下在IIS上崩溃

似乎有一个问题与重载和/或并发连接有关,这些连接会生成看似随机的错误消息。

这里有几个样本的错误:

*** 'C:\inetmli\wwwroot\ldope\index.cgi' error message at: 2013/02/28 13:01:07 
Variable "%Config" is not imported at C:/Perl/lib/Config.pm line 53. 
Variable "%Config" is not imported at C:/Perl/lib/Config.pm line 94. 
Global symbol "%Config" requires explicit package name at C:/Perl/lib/Config.pm line 53. 
Global symbol "%Config" requires explicit package name at C:/Perl/lib/Config.pm line 94. 
Compilation failed in require at C:/Perl/lib/Errno.pm line 8. 
BEGIN failed--compilation aborted at C:/Perl/lib/Errno.pm line 8. 
Compilation failed in require at C:/Perl/lib/IO/Socket.pm line 18. 
BEGIN failed--compilation aborted at C:/Perl/lib/IO/Socket.pm line 18. 
Compilation failed in require at C:/Perl/site/lib/Net/LDAP.pm line 9. 
BEGIN failed--compilation aborted at C:/Perl/site/lib/Net/LDAP.pm line 9. 
Compilation failed in require at C:\inetmli\wwwroot\test\index.cgi line 4. 
BEGIN failed--compilation aborted at C:\inetmli\wwwroot\test\index.cgi line 4. 

*** 'C:\inetmli\wwwroot\ldope\index.cgi' error message at: 2013/02/28 13:01:07 
String found where operator expected at (eval 4) line 2, near "croak 'usage: $io->getline()'" 
    (Do you need to predeclare croak?) 
String found where operator expected at (eval 4) line 8, near "croak 'usage: $io->getlines()'" 
    (Do you need to predeclare croak?) 
String found where operator expected at (eval 4) line 10, near "croak 'Can\'t call $io->getlines in a scalar context, use $io->getline'" 
    (Do you need to predeclare croak?) 
syntax error at (eval 4) line 2, near "croak 'usage: $io->getline()'" 
syntax error at (eval 4) line 8, near "croak 'usage: $io->getlines()'" 
syntax error at (eval 4) line 10, near "croak 'Can\'t call $io->getlines in a scalar context, use $io->getline'" 
Compilation failed in require at C:/Perl/lib/IO/Socket.pm line 12. 
BEGIN failed--compilation aborted at C:/Perl/lib/IO/Socket.pm line 12. 
Compilation failed in require at C:/Perl/site/lib/Net/LDAP.pm line 9. 
BEGIN failed--compilation aborted at C:/Perl/site/lib/Net/LDAP.pm line 9. 
Compilation failed in require at C:\inetmli\wwwroot\test\index.cgi line 4. 
BEGIN failed--compilation aborted at C:\inetmli\wwwroot\test\index.cgi line 4. 

*** 'C:\inetmli\wwwroot\ldope\index.cgi' error message at: 2013/02/28 13:01:07 
Can't locate loadable object for module main in @INC (@INC contains: C:/Perl/site/lib C:/Perl/lib .) at C:/Perl/lib/DynaLoader.pm line 99, <DATA> line 635. 
    DynaLoader::croak('Can\'t locate loadable object for module main in @INC (@INC c...') called at C:/Perl/lib/DynaLoader.pm line 161 
    DynaLoader::bootstrap('main') called at C:/Perl/lib/DynaLoader.pm line 106 
    DynaLoader::bootstrap_inherit('main') called at C:/Perl/lib/POSIX.pm line 0 
    require POSIX.pm called at C:/Perl/lib/POSIX.pm line 0 
    PDF::API2::Util::BEGIN() called at C:/Perl/lib/POSIX.pm line 0 
    eval {...} called at C:/Perl/lib/POSIX.pm line 0 
    require PDF/API2/Util.pm called at C:/Perl/lib/POSIX.pm line 0 
    PDF::API2::BEGIN() called at C:/Perl/lib/POSIX.pm line 0 
    eval {...} called at C:/Perl/lib/POSIX.pm line 0 
    require PDF/API2.pm called at C:\inetmli\wwwroot\test\index.cgi line 13 
Compilation failed in require at C:/Perl/site/lib/PDF/API2/Util.pm line 31, <DATA> line 635. 
BEGIN failed--compilation aborted at C:/Perl/site/lib/PDF/API2/Util.pm line 31, <DATA> line 635. 
Compilation failed in require at C:/Perl/site/lib/PDF/API2.pm line 9, <DATA> line 635. 
BEGIN failed--compilation aborted at C:/Perl/site/lib/PDF/API2.pm line 9, <DATA> line 635. 
Compilation failed in require at C:\inetmli\wwwroot\test\index.cgi line 13, <DATA> line 635. 

正在执行的脚本是用许多图书馆一个非常简单的测试脚本:

use strict; 
use Net::LDAP; 
require Archive::Zip; 
require CAM::PDF; 
require DBI; 
require Excel::Writer::XLSX; 
require HTTP::Request; 
require LWP::UserAgent; 
require MIME::Base64; 
require MIME::QuotedPrint; 
require PDF::API2; 
require PHP::Serialization; 
require Socket; 
require Win32::Process; 

print "HTTP/1.1 200 OK\nContent-Type: text/plain\n\nI'm OK!"; 

当多次请求这个剧本我可以生成错误很多时候,但是什么时候或什么原因没有明显的模式。我甚至管理只使用单一的最后一行的脚本时出现错误:

print "HTTP/1.1 200 OK\nContent-Type: text/plain\n\nI'm OK!"; 

从错误是:

*** 'C:\inetmli\wwwroot\ldope\index.cgi' error message at: 2013/02/28 12:26:25 
syntax error at C:\inetmli\wwwroot\test\index.cgi line 1, near "K!" 
Can't find string terminator '"' anywhere before EOF at C:\inetmli\wwwroot\test\index.cgi line 26, <DATA> line 635. 

我必须从多个线程运行脚本数以千计的时候我PC来产生这个错误,它只会触发几次。我相信它是由并发访问触发的。

从这个错误,它似乎没有读取整个文件,当它开始解析它?

这个错误令我很烦恼!在重载服务器上,它会经常产生错误,有时IIS中的整个应用程序池崩溃并且必须重新启动。

有没有人见过这个?有没有解决方法?由于其他选项(PerlEX和FastCGI未经当前代码测试),我最好还是使用ISAPI。

我会非常感谢任何帮助或提示,以帮助我解决我的问题。由于我没有在网上找到任何东西,也可能会帮助其他人看起来随机的错误信息。

到目前为止,我已经试过:

  • 分裂应用了不同的应用程序池(仅限于正面效应是一个崩溃的应用程序现在是仅限于当前的应用程序池)
  • 添加多个工作进程单个应用程序池(所犯的错误罕见但不dissapear)
  • 设置处理器亲和力为true
  • 设置应用程序池回收都非常高和非常低到没有明显的影响
  • 使用各种“经典” /“管道”和ASP.NET设置尽管知道他们可能什么都没有用它做
  • Perl的5.14没有这个问题,只有Perl的5.16

任何人有还有什么想法?

+0

你有没有解决这个问题? – albertjan 2014-10-29 07:57:17

回答

0

在我的情况(MacOS)错误出现在STDOUT-> flush()的线程数大于120的随机数。 我在线程环境中删除它,问题消失。