2009-12-26 3 views
1

Иногда mod_perl процесс apache помечен как «несуществующий» в «верхней» утилите, то есть становится зомби-процессом. Правильное ли поведение? Должен ли я беспокоиться об этом?Почему процесс apache mod_perl стал зомби?

Наш скрипт Perl очень прост, он не порождает дочерние процессы. Процесс зомби исчезает довольно быстро. Apache2, Ubuntu.

Наш Апач конфиг здесь: apache_config.txt

Вот оснастки выстрел сверху.

PID USER  PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 
19525 www-data 20 0 55972 25m 4684 S 10.3 2.4 0:00.32 apache2 
19486 www-data 20 0 52792 21m 4120 S 1.7 2.1 0:00.05 apache2 
19538 www-data 20 0 52792 21m 4120 S 1.3 2.1 0:00.04 apache2 
19539 www-data 20 0  0 0 0 Z 0.7 0.0 0:00.03 apache2 <defunct> 
19481 www-data 20 0 52860 21m 4016 S 0.3 2.1 0:00.05 apache2 
19521 www-data 20 0 52804 21m 3824 S 0.3 2.1 0:00.08 apache2 

Этих модули CPAN я использую

CGI(); 
XML::LibXML(); 
DateTime; 
DateTime::TimeZone; 
Benchmark(); 
Data::Dump(); 
Devel::StackTrace(); 
DBD::mysql(); 
DBI(); 
LWP(); 
LWP::UserAgent(); 
HTTP::Request(); 
HTTP::Response(); 
URI::Heuristic(); 
MD5(); 
IO::String(); 
DateTime::Format::HTTP(); 
Math::BigInt(); 
Digest::SHA1(); 


top: 
26252 www-data 20 0  0 0 0 Z 0.3 0.0 0:00.22 apache2 <defunct> 

access.log with pid logged as the first parameter: 
26252 85.124.207.173 - - [26/Dec/2009:22:16:42 +0300] "GET /cgi-bin/wimo/server/index.pl?location=gn:2761369&request=forecast&client_part=app&ver=2_0b191&client=desktop&license_type=free&auto_id=125CC6B6DAA HTTP/1.1" 200 826 0 "-" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; GTB6.3; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)" 

3 различных процессы зомби регистрируемых серверов статус

Srv  PID  Acc  M CPU  SS Req ConnChild Slot Client  VHost   Request 
32-0 1300 0/0/45 _ 0.00 0 0 0.0 0.00 2.29 127.0.0.1 weather_server OPTIONS * HTTP/1.0 
100-0 1254 1/7/41 C 0.22 0 0 0.0 0.00 1.51 127.0.0.1 weather_server OPTIONS * HTTP/1.0 
29-0 1299 0/12/78 _ 0.31 0 2 0.0 0.78 2.37 [my ip was here] weather_server GET /server-status HTTP/1.1 

ответ

2

Моего первое подозрение в том, что вы на самом деле разветвлении, но, возможно, вы не» Это понятно. Можно ли включить код? Помните, что любые system или `` вызовы разворачиваются. Это может легко происходить внутри модуля CPAN без вашего понимания. Существует некоторая полезная информация о mod_perl и forking (в том числе о том, как создаются зомби и как их избежать) here.

Update: попробуйте добавить это к вашей конфигурации:

# Monitor apache server status 
ExtendedStatus On 
<VirtualHost 127.0.0.1:80> 
    <Location /server-status> 
     SetHandler server-status 
     Order deny,allow 
     Deny from all 
     Allow from 127.0.0.1 
    </Location> 
</VirtualHost> 

А затем измените Allow from быть ваш IP, то вы можете посетить http://yourdomain.com/server-status и получить страницу сводной информации о апача. Попытайтесь сделать это, когда увидите одного из зомби и посмотрите, что apache считает, что этот процесс делает.

+0

Спасибо, Роб. Я могу отправить вам весь исходный код. Вы хотите посмотреть на него? Тем не менее, есть что прочитать, около 30 файлов. Я добавил список модулей CPAN, используемых нашей системой, на столбе, см. Выше. – Pavel

+0

Я уверен, что в моем коде нет прямых системных вызовов. – Pavel

+0

Кроме того, pid процесса зомби соответствует Apache2 pid. Как мне кажется, процесс зомби - это процесс Apache mod_perl, а не другой, порожденный кодом mod_perl. – Pavel

0

Я вижу это тоже с моим очень простым модулем mod_perl 2. Я ничего не вилка, просто напишите строку в клиентский сокет, а затем верните OK. И все еще неработающий процесс появляется на моей виртуальной машине CentOS 5.5 Linux, а затем уходит. Вот мой исходный код, и вы можете протестировать его с помощью «telnet yourhost 843» и нажать ENTER:

package SocketPolicy; 

# Run: semanage port -a -t http_port_t -p tcp 843 
# And add following lines to the httpd.conf 
# Listen 843 
# <VirtualHost _default_:843> 
#  PerlModule     SocketPolicy 
#  PerlProcessConnectionHandler SocketPolicy 
# </VirtualHost> 

use strict; 
use warnings FATAL => 'all'; 
use APR::Const(-compile => 'SO_NONBLOCK'); 
use APR::Socket(); 
use Apache2::ServerRec(); 
use Apache2::Connection(); 
use Apache2::Const(-compile => qw(OK DECLINED)); 

use constant POLICY => 
qq{<?xml version="1.0"?> 
<!DOCTYPE cross-domain-policy SYSTEM 
"http://www.adobe.com/xml/dtds/cross-domain-policy.dtd"> 

<cross-domain-policy> 
<allow-access-from domain="*" to-ports="8080"/> 
</cross-domain-policy> 
\0}; 

sub handler { 
     my $conn = shift; 
     my $socket = $conn->client_socket(); 
     my $offset = 0; 

     # set the socket to the blocking mode 
     $socket->opt_set(APR::Const::SO_NONBLOCK => 0); 

     do { 
       my $nbytes = $socket->send(substr(POLICY, $offset), length(POLICY) - $offset); 
       # client connection closed or interrupted 
       return Apache2::Const::DECLINED unless $nbytes; 
       $offset += $nbytes; 
     } while ($offset < length(POLICY)); 

     my $slog = $conn->base_server()->log(); 
     $slog->warn('served socket policy to: ', $conn->remote_ip()); 
     return Apache2::Const::OK; 
} 

1; 
Смежные вопросы