Переменная mod_perl 2 и повреждение процесса - PullRequest
2 голосов
/ 03 февраля 2009

Мы только что портировали довольно большую кодовую базу из древней среды Perl 5.005.03 CGI в mod_perl 2, и теперь, когда она находится в публичной бета-версии, есть несколько, возможно связанных, проблем, с которыми мы время от времени сталкиваемся , Они накапливаются до тех пор, пока мы не перезапустим сервер.

Весь наш код компилируется под строгим использованием, но ранее он назывался как скомпилированный, запускаемый и отбрасываемый CGI-скрипт. Проблемы, с которыми мы столкнулись до сих пор: установка $| или вызов STDOUT->autoflush(1); с использованием глобальных файловых дескрипторов старого стиля (open(ERRORFILE, $errorfile) вместо open(my $fh_error, $errorfile)). Также звоните system() - вскоре после того, как мы начали публичную бета-версию, мы заметили, например, Прослушивание / bin / tail или / usr / sbin / sendmail на портах 80 и 443 остановило перезапуск сервера. С тех пор я переписал этот код для использования методов чистого Perl, и у нас больше нет этой проблемы.

Осталось две проблемы. Во-первых, журналы заполнены mod_perl с жалобами на переопределение констант, например,

Constant subroutine ModPerl::ROOT::ModPerl::PerlRun::usr_local_..._cgi_forgotpassword::O_CREAT redefined at /usr/lib/perl5/ModPerl/Util.pm line 69.

Кроме того, иногда, казалось бы, основные переменные будут уничтожены. Один из наших основных внутренних модулей регистрирует информацию о PID и имени скрипта, и выдает такую ​​информацию:

20090202-233948-32154:Started script /usr/local/.../cgi/account/renewalcalendar
20090202-233948-32154:Ended script /usr/sbin/apache2

В других случаях идентификатор процесса заканчивается как undef. Это редко и периодически.

Во-вторых, а также периодически мы будем видеть, что сборщик мусора не запускается. (Возможно, проблема со слабыми ссылками? Но почти все время все работает нормально.) Самый непосредственный признак этого - открытые дескрипторы базы данных, которые никогда не закрывался, но когда я углубляюсь в проблему, становится очевидно, что в стандартном хеш-объекте Perl хранится объект DBI, и метод DESTROY этого объекта (редко и периодически) не вызывается.

Мы работаем с Debian 5.0 (Lenny), Perl 5.10.0, Apache 2.29, mod_perl 2.0.4, openSSL 0.9.8g. Я могу предоставить больше информации, если это необходимо, но я думаю, что это основа.

Существенные части конфигурации apache, такие как / etc / apache2 / sites-enabled / * sitename *, (некоторые биты отредактированы по соображениям конфиденциальности):

<VirtualHost ...:443>
<Directory />
    Options SymLinksIfOwnerMatch
    AllowOverride None
</Directory>
<Directory /usr/local/.../cgi>
    SetHandler perl-script
    PerlResponseHandler ModPerl::PerlRun
    PerlOptions +ParseHeaders
    Options +ExecCGI
</Directory>
</VirtualHost>

Там есть кое-что по SSL, переписыванию и перенаправлению, но это важная вещь.

Звучит ли это кому-нибудь знакомо? Кроме того, кто-нибудь может порекомендовать какой-либо способ отладки проблемы дальше?

1 Ответ

2 голосов
/ 03 февраля 2009

Для вашей проблемы с памятью: вам нужно позвонить ослабить (из стандартного модуля Scalar :: Util )

...