簡體   English   中英

重載下IIS上的ActiveState Perl崩潰

[英]ActiveState Perl crashes on IIS under heavy load

我在帶有IIS 7.5的Windows 2008 Server(64位)上運行ActiveState Perl 5.16.2(32位)時遇到問題。 Perl是使用PerlIS.dll和IIS中的ISAPI篩選器運行的。

似乎與重負載和/或並發連接有關,該問題生成看似隨機的錯誤消息。

以下是一些示例錯誤:

*** '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中的整個應用程序池崩潰,必須重新啟動。

誰看過這個嗎? 是否有已知的解決方法? 最好是我想繼續使用ISAPI,因為其他選項(PerlEX和FastCGI未使用當前代碼進行測試)。

我將非常感謝您提供的任何幫助或提示,以幫助我解決問題。 既然我在網絡上還沒有找到任何東西,也許它也可以幫助正在努力處理這些看似隨機的錯誤消息的其他人。

到目前為止,我已經嘗試過:

  • 在不同的應用程序池中拆分應用程序(唯一的積極效果是,崩潰的應用程序現在僅限於當前應用程序池)
  • 將多個輔助進程添加到單個應用程序池中(使錯誤少見但不會消失)
  • 將處理器關聯性設置為true
  • 設置應用程序池的回收率很高或很低,幾乎沒有效果
  • 使用各種“經典” /“管道”和ASP.NET設置,盡管知道它們可能與它無關
  • Perl 5.14沒有這個問題,只有Perl 5.16

還有其他想法嗎?

就我而言(MacOS),當線程數大於120時,STDOUT-> flush()中會隨機出現錯誤。我在線程環境中將其刪除,問題消失了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM