私のサーバ上のApacheの子供たち(ubuntu 12.04が11.10、Apache 2.2.22、perl 5.14.2、mod_perl 2.0.5からアップグレードされました)がハングアップしています。Apache children hanging/mod perl
私は、だから私は、Apacheを使用
(テストのために睡眠を使用した場合excpectedのように、それは動作しますが、プログラムの開発自体がハングアップしたときに何も出力が指定されていない)が、成功せずにsub handler : method{
my $mask = POSIX::SigSet->new(&POSIX::SIGUSR2, &POSIX::SIGALRM);
my $oldaction_usr2 = POSIX::SigAction->new();
my $oldaction_alarm = POSIX::SigAction->new();
my $action = POSIX::SigAction->new(sub {
Carp::confess("hm caught SIGUSR2 or ALARM DEAD LOCK YOU can run but not hide!");
},$mask,&POSIX::SA_NODEFER);
POSIX::sigaction(&POSIX::SIGUSR2,$action, $oldaction_usr2);
POSIX::sigaction(&POSIX::SIGALRM,$action, $oldaction_alarm);
alarm(30); #max 30 seconds per request
を信号USR2をキャッチしようとした、とアラーム最新のリクエストの初めからぶら下がっている子のPID(CPU時間が増加していない取得する状況だけSS(秒)
その後、私はバックトレースを取得するためのpidでGDBを添付:。
(gdb) bt
#0 0x00007fc4610fb606 in myck_entersub (my_perl=0x7fc47f7f63e0, op=0x7fc484b40910) at lib/Params/Classify.xs:682
#1 0x00007fc477a67abd in Perl_convert() from /usr/lib/libperl.so.5.14
#2 0x00007fc477a6f769 in Perl_utilize() from /usr/lib/libperl.so.5.14
#3 0x00007fc477a9daef in Perl_yyparse() from /usr/lib/libperl.so.5.14
#4 0x00007fc477b1635d in ??() from /usr/lib/libperl.so.5.14
問題を解決する方法やこれが何を意味するのかわかりません。 がmodper 1 gudeで私が見つけた:
% gdb httpd <pid of spinning process>
(gdb) where
(gdb) source mod_perl-x.xx/.gdbinit
(gdb) curinfo
が、私は、私は をインストールする必要があるか、私はソースからの私の自己によって、このファイルを作成する必要がありますどのパッケージ.gdbinitが配置されている場所を知っているかしていない(多分とDevel::DebugInit::GDB) ?
なぜSIGUSR2とSIGALRMのハンドラを設定したいのですか? –
アラームハンドラは、プログラムが長い間ハングしている状況を自動的に処理する必要があります。 usr2ハンドラは、プロセスが停止しているのを発見したときにkill -USR2に反応する可能性を提供するはずです。しかし、あなたは正しいのですが、警報ハンドラは十分なものです。私は、アラームタイマーが設定される前に、プロセスがハングしているので、動作していないという結論に達しました。おそらく、perlのbulid(コンパイル)フェーズで。 –