IIS 7.5 を搭載した Windows 2008 Server (64 ビット) で ActiveState Perl 5.16.2 (32 ビット) を実行すると問題が発生します。Perl は、IIS の ISAPI フィルターを使用して PerlIS.dll を使用して実行されます。
一見ランダムなエラー メッセージを生成する高負荷および/または同時接続に関連する問題があるようです。
エラーの例を次に示します。
*** '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!";
このスクリプトを複数回要求すると、エラーが頻繁に発生する可能性がありますが、いつ、または何が原因で発生するかについて明確なパターンはありません。最後の1行だけをスクリプトとして使用して、エラーを取得することさえできました。
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 を使用したいと思います。
私の問題を解決するための助けやヒントをいただければ幸いです。私はウェブ上で何も見つけていないので、これらの一見ランダムなエラーメッセージに苦しんでいる他の誰かを助けるかもしれません.
これまでのところ、私は試しました:
- アプリケーションを異なるアプリケーション プールに分割する (唯一のプラスの効果は、クラッシュしたアプリケーションが現在のアプリケーション プールに限定されることです)
- 複数のワーカー プロセスを 1 つのアプリケーション プールに追加する (エラーはまれになりましたが、消えませんでした)
- プロセッサ アフィニティを true に設定する
- アプリケーション プールのリサイクルを非常に高く設定するか、非常に低く設定して、明らかな効果がないようにする
- おそらくそれとは何の関係もないことを知っているにもかかわらず、あらゆる種類の「クラシック」/「パイプライン」およびASP.NET設定を使用する
- Perl 5.14 にはこの問題はありません。Perl 5.16 のみです。
誰かもっとアイデアがありますか?