2013-03-04 72 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的隨機數。 我在線程環境中刪除它,問題消失。