Perl ActiveState падает на IIS при большой нагрузке
У меня проблема с запуском ActiveState Perl 5.16.2 (32-разрядная версия) на Windows 2008 Server (64-разрядная версия) с IIS 7.5. Perl запускается с использованием PerlIS.dll с фильтром ISAPI в 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.
Я должен запускать сценарий тысячи раз из нескольких потоков с моего компьютера, чтобы сгенерировать эту ошибку, и она срабатывает только несколько раз. Я полагаю, что это вызвано одновременным доступом.
Из этой ошибки кажется, что он не прочитал весь файл, когда он начал анализировать его?
Эта ошибка раздражает меня до безумия! На сервере с высокой нагрузкой он генерирует ошибки довольно часто, и иногда весь пул приложений в IIS падает и должен быть перезапущен.
Кто-нибудь видел это раньше? Есть ли работа вокруг? Предпочтительно я хотел бы остаться с ISAPI, так как другие варианты (PerlEX и FastCGI не проверены с текущим кодом).
Я был бы очень благодарен за любую помощь или совет, чтобы помочь мне решить мою проблему. Поскольку я ничего не нашел в Интернете, возможно, это также могло бы помочь кому-то еще, кто борется с этими, казалось бы, случайными сообщениями об ошибках.
Пока что я пробовал:
- разделение приложений на разные пулы приложений (единственный положительный эффект заключается в том, что сбойное приложение теперь ограничено текущим пулом приложений)
- добавление нескольких рабочих процессов в один пул приложений (ошибки реже, но не исчезают)
- установка сродства процессора к истинному
- настройка рециркуляции пула приложений как очень высокая, так и очень низкая, без видимого эффекта
- использование всевозможных "классических"/"конвейерных" и настроек ASP.NET, несмотря на то, что они, вероятно, не имеют к этому никакого отношения
- Perl 5.14 НЕ имеет этой проблемы, только Perl 5.16
У кого-нибудь есть еще идеи?
1 ответ
В моем случае (MacOS) ошибка появляется случайно в STDOUT->flush(), когда число потоков больше 120. Я удалил ее в среде потоков и проблема исчезла.