2012-11-29 4 views
2

웹 서버에서 요청할 때 상황이 다소 느리다는 사실을 알게되었습니다. 나는 그것을 조사하기 시작했고 루트 소유의 아파치 프로세스를 발견했다.다중 아파치 루트 프로세스

실제로 이것이 실제로 느려지는 원인인지는 모르겠지만 그다지 좋지 않습니다. 좋지 않습니다.

문제는 무엇을 해야할지 모르겠다. 루트 프로세스가 너무 많은 이유는 무엇입니까? 일부 시험을 권할 수 있습니까? 나는 그들 중 몇 개를 스트레칭하려고 시도했지만, 뭔가를하는 것처럼 보이지만 strace의 출력은 나를 넘어서있다.

root  30918 1.8 1.3 84284 52296 ?  Ss 14:11 0:01 /usr/sbin/apache2 -k restart 
root  30919 0.0 1.1 84420 45612 ?  S 14:11 0:00 /usr/sbin/apache2 -k restart 
root  30920 0.0 1.1 84420 45604 ?  S 14:11 0:00 /usr/sbin/apache2 -k restart 
root  30921 0.0 1.1 84420 45612 ?  S 14:11 0:00 /usr/sbin/apache2 -k restart 
root  30922 0.1 1.1 84420 45612 ?  S 14:11 0:00 /usr/sbin/apache2 -k restart 
root  30923 0.0 1.1 84420 45612 ?  S 14:11 0:00 /usr/sbin/apache2 -k restart 
www-data 30926 6.6 1.5 104964 61336 ?  S 14:12 0:03 /usr/sbin/apache2 -k restart 
root  30930 0.1 1.1 84420 45616 ?  S 14:12 0:00 /usr/sbin/apache2 -k restart 
root  30933 0.0 1.1 84420 45616 ?  S 14:12 0:00 /usr/sbin/apache2 -k restart 
root  30935 0.0 1.1 84420 45616 ?  S 14:12 0:00 /usr/sbin/apache2 -k restart 
root  30936 0.0 1.1 84420 45616 ?  S 14:12 0:00 /usr/sbin/apache2 -k restart 
root  30937 0.0 1.1 84420 45616 ?  S 14:12 0:00 /usr/sbin/apache2 -k restart 
root  30938 0.0 1.1 84420 45616 ?  S 14:12 0:00 /usr/sbin/apache2 -k restart 
root  30961 0.0 1.1 84420 45612 ?  S 14:12 0:00 /usr/sbin/apache2 -k restart 
root  30989 0.0 1.1 84420 45612 ?  S 14:12 0:00 /usr/sbin/apache2 -k restart 
root  30990 0.0 1.1 84420 45612 ?  S 14:12 0:00 /usr/sbin/apache2 -k restart 
root  31011 0.1 1.1 84420 45612 ?  S 14:12 0:00 /usr/sbin/apache2 -k restart 
root  31013 0.1 1.1 84420 45612 ?  S 14:12 0:00 /usr/sbin/apache2 -k restart 
root  31014 0.0 1.1 84420 45612 ?  S 14:12 0:00 /usr/sbin/apache2 -k restart 
www-data 31175 2.5 1.5 104168 60524 ?  S 14:12 0:00 /usr/sbin/apache2 -k restart 
www-data 31189 2.3 1.4 102360 58920 ?  S 14:12 0:00 /usr/sbin/apache2 -k restart 
www-data 31190 1.5 1.4 101904 58356 ?  S 14:12 0:00 /usr/sbin/apache2 -k restart 
www-data 31191 0.3 1.1 84556 46760 ?  S 14:12 0:00 /usr/sbin/apache2 -k restart 
www-data 31192 1.4 1.4 101916 58384 ?  S 14:12 0:00 /usr/sbin/apache2 -k restart 
www-data 31193 1.5 1.4 101916 58376 ?  S 14:12 0:00 /usr/sbin/apache2 -k restart 
root  31240 0.1 1.1 84420 45612 ?  S 14:12 0:00 /usr/sbin/apache2 -k restart 

다음은 하나의 프로세스에서 나온 strace의 출력 예입니다.

--- SIGCHLD (Child exited) @ 0 (0) --- 
read(6, 0xff87f6ef, 1)     = -1 EAGAIN (Resource temporarily unavailable) 
getuid32()        = 0 
close(17)        = 0 
gettimeofday({1354109303, 670988}, NULL) = 0 
semop(5668864, {{0, -1, SEM_UNDO}}, 1) = 0 
accept(4, {sa_family=AF_INET, sin_port=htons(48107), sin_addr=inet_addr("192.168.16.12")}, [16]) = 17 
fcntl64(17, F_GETFD)     = 0 
fcntl64(17, F_SETFD, FD_CLOEXEC)  = 0 
semop(5668864, {{0, 1, SEM_UNDO}}, 1) = 0 
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0xf74a2768) = 1949 
waitpid(1949, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0) = 1949 
--- SIGCHLD (Child exited) @ 0 (0) --- 
read(6, 0xff87f6ef, 1)     = -1 EAGAIN (Resource temporarily unavailable) 
getuid32()        = 0 
close(17)        = 0 
gettimeofday({1354109305, 724358}, NULL) = 0 
semop(5668864, {{0, -1, SEM_UNDO}}, 1) = 0 
accept(4, {sa_family=AF_INET, sin_port=htons(48132), sin_addr=inet_addr("192.168.16.12")}, [16]) = 17 
fcntl64(17, F_GETFD)     = 0 
fcntl64(17, F_SETFD, FD_CLOEXEC)  = 0 
semop(5668864, {{0, 1, SEM_UNDO}}, 1) = 0 
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0xf74a2768) = 1974 
waitpid(1974, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0) = 1974 
--- SIGCHLD (Child exited) @ 0 (0) --- 

나는에있는 모든 모듈 인증, ENV, siteenv 및 별칭 같은 중요한 사람을 제외하고 개조가 가능하고 서버를 시작 불가능했습니다. 이 경우 나는 여전히 6 개의 루트 아파치 프로세스와 1 개의 www 데이터 소유 아파치 프로세스를 얻는다.

모든 모듈이 up2date인지 확인했습니다.

로그에 명백한 오류가 없습니다.

config follow; 모듈에서 컴파일

ServerRoot "/etc/apache2" 

LockFile /var/lock/apache2/accept.lock 

PidFile ${APACHE_PID_FILE} 

Timeout 300 

KeepAlive On 

MaxKeepAliveRequests 100 

KeepAliveTimeout 15 

<IfModule mpm_worker_module> 
StartServers   2 
MaxClients   150 
MinSpareThreads  25 
MaxSpareThreads  75 
ThreadsPerChild  25 
MaxRequestsPerChild 0 
</IfModule> 

User ${APACHE_RUN_USER} 
Group ${APACHE_RUN_GROUP} 

AccessFileName .htaccess 

<Files ~ "^\.ht"> 
Order allow,deny 
Deny from all 
</Files> 

DefaultType text/plain 


HostnameLookups Off 

ErrorLog /var/log/apache2/error.log 

LogLevel warn 

Include /etc/apache2/mods-enabled/*.load 
Include /etc/apache2/mods-enabled/*.conf 

Include /etc/apache2/httpd.conf 

Include /etc/apache2/ports.conf 

LogFormat "%v:%p %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined 
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined 
LogFormat "%h %l %u %t \"%r\" %>s %b" common 
LogFormat "%{Referer}i -> %U" referer 
LogFormat "%{User-agent}i" agent 

CustomLog /var/log/apache2/other_vhosts_access.log vhost_combined 

Include /etc/apache2/conf.d/ 

Include /etc/apache2/sites-enabled/ 

은 다음과 같습니다 모듈에서 컴파일 : core.c mod_log_config.c mod_logio.c itk.c http_core.c

그래서 난 mod_so.c 이제는 mpm_worker 설정 만 실행합니다.

DEBUG UPDATER 
When I restart apache, and ps, I get something like this; 
    root  26921 0.5 1.3 80008 52452 ?  Ss 21:27 0:02 /usr/sbin/apache2 -k start 
    root  27114 0.0 1.1 80144 44804 ?  S 21:34 0:00 /usr/sbin/apache2 -k start 
    root  27115 0.0 1.1 80144 44820 ?  S 21:34 0:00 /usr/sbin/apache2 -k start 
    root  27116 0.0 1.1 80144 44804 ?  S 21:34 0:00 /usr/sbin/apache2 -k start 
    root  27117 0.0 1.1 80144 44804 ?  S 21:34 0:00 /usr/sbin/apache2 -k start 
    root  27119 0.0 1.1 80144 44804 ?  S 21:34 0:00 /usr/sbin/apache2 -k start 

나는 그때 mod_proxy를

[Thu Nov 29 21:34:01 2012] [info] Server built: Sep 9 2012 21:17:36 
[Thu Nov 29 21:34:01 2012] [debug] itk.c(1100): AcceptMutex: sysvsem (default: sysvsem) 
[Thu Nov 29 21:34:01 2012] [debug] proxy_util.c(1818): proxy: grabbed scoreboard slot 0 in child 27115 for worker proxy:reverse 
[Thu Nov 29 21:34:01 2012] [debug] proxy_util.c(1818): proxy: grabbed scoreboard slot 0 in child 27114 for worker proxy:reverse 
[Thu Nov 29 21:34:01 2012] [debug] proxy_util.c(1934): proxy: initialized single connection worker 0 in child 27115 for (*) 
[Thu Nov 29 21:34:01 2012] [debug] proxy_util.c(1837): proxy: worker proxy:reverse already initialized 
[Thu Nov 29 21:34:01 2012] [debug] proxy_util.c(1934): proxy: initialized single connection worker 0 in child 27114 for (*) 
[Thu Nov 29 21:34:01 2012] [debug] proxy_util.c(1818): proxy: grabbed scoreboard slot 0 in child 27117 for worker proxy:reverse 
[Thu Nov 29 21:34:01 2012] [debug] proxy_util.c(1837): proxy: worker proxy:reverse already initialized 
[Thu Nov 29 21:34:01 2012] [debug] proxy_util.c(1934): proxy: initialized single connection worker 0 in child 27117 for (*) 
[Thu Nov 29 21:34:01 2012] [debug] proxy_util.c(1818): proxy: grabbed scoreboard slot 0 in child 27119 for worker proxy:reverse 
[Thu Nov 29 21:34:01 2012] [debug] proxy_util.c(1837): proxy: worker proxy:reverse already initialized 
[Thu Nov 29 21:34:01 2012] [debug] proxy_util.c(1934): proxy: initialized single connection worker 0 in child 27119 for (*) 
[Thu Nov 29 21:34:01 2012] [debug] proxy_util.c(1818): proxy: grabbed scoreboard slot 0 in child 27116 for worker proxy:reverse 
[Thu Nov 29 21:34:01 2012] [debug] proxy_util.c(1837): proxy: worker proxy:reverse already initialized 
[Thu Nov 29 21:34:01 2012] [debug] proxy_util.c(1934): proxy: initialized single connection worker 0 in child 27116 for (*) 
[Thu Nov 29 21:36:20 2012] [notice] SIGHUP received. Attempting to restart 

공지 사항 PID를 매치에서 이러한 메시지를 볼 수, 디버그 및 재시작에 LogLevel에 넣어합니다. 그러나 mod_proxy를 사용하지 않으면이 메시지가 사라지지만 시작하는 루트 프로세스의 수가 같아서 증상이 아닌 것으로 생각됩니다.

+0

httpd.conf에 코멘트를 건너 뛰어도 표시 할 수 있습니까? 아마도 설정을 더 잘 이해하는 데 도움이됩니다. 한편 내 대답에 설명 된 것들을 확인하십시오. 그것도 도움이 될 수 있습니다. 그러나 지금은 www 데이터가 아닌 루트 프로세스를 제외하고는 악의적 인 것을 보지 못합니다. – AlexKey

+0

안녕하세요 - config를 추가했습니다 – mark

+0

이것은 오래된 질문이지만, 이것에 대한 해결책을 얻었습니까? 나는 데비안 박스에서 똑같은 문제를 겪고있다. 부모 아파치 프로세스는 몇 명의 자식을 루트로 시작하고, 그 중 일부는 www-data가 소유 한 하나의 자식을 시작합니다. – stockli

답변

2

이것은 Apache에서 절대적으로 발생합니다. 각 프로세스는 한 번에 하나의 요청을 처리합니다. 따라서 하나의 프로세스 (작업자라고 함)가있는 경우 많은 사용자가 있으면 실제로 느려질 수 있습니다.

내가보기에 문제는 루트 소유 프로세스가 아니어야한다는 것입니다. 플랫폼에 따라 자체 사용자가 있어야합니다. 데비안 사용자와 마찬가지로 www-data가됩니다. 그런 다음 하나의 프로세스 만 루트가 소유하고 나머지는 해당 사용자가 소유하게됩니다.

그러나 속도는 하드웨어, 웹 서버 및 웹 응용 프로그램과 같은 여러 요인에 의해 정의됩니다.

이 좋지 하드웨어 기능의 경우에는 반드시이 실행되는 하드웨어에 맞는 요구 사항 (충분한 RAM 및 CPU) 근로자의

낮은 번호를 확인하거나 슈퍼 좋은 경우 증가한다.

웹 응용 프로그램 (있는 경우, 종종 PHP 응용 프로그램)이 성능을위한 병목 현상이 아닌지 확인하십시오.

추신 : 형식이 잘못되어 죄송합니다. 전화로 친하게 답장을 보내 셨습니다.

+0

안녕하세요. 알렉스, 그게 내 질문입니다. 분명하지 않다면 미안 해요. 왜 그렇게 많은 루트 프로세스가 있습니까? 내가 뭘하고 있는지 알아? 우리 모두가 www- 데이터 처리를한다면 행복 할 것입니다. 그러나 6 개의 루트 소유 프로세스가 (서버를 시작할 때) 각 www- 데이터 프로세스에 대해 무언가를하고 있으며 그렇게 사용되지 않았습니다. – mark

+0

@mark 음, 기본 설정에서 조사를 시작할 수 있도록 설정을보고 싶습니다.) – AlexKey

+0

아 - 죄송합니다. 귀하의 의견을 놓치 셨습니다. 구성이 추가되었습니다. – mark

0

게임에 좀 늦었지만 같은 문제가 발생하여 무슨 일이 일어나고 있는지 파악하려고했습니다. 나는 아파치 2.4.7에있다. 그래서 너보다 조금 새로운데 일반적인 전제가 같다.

나는 나의 MPM 구성을 찾을 수 /etc/apache2/mods-enabled/mpm_prefork.conf에서 지켜 볼 수밖에 없었습니다하지만 당신은 바로 여기 있습니다

<IfModule mpm_worker_module> 
StartServers   2 
MaxClients   150 
MinSpareThreads  25 
MaxSpareThreads  75 
ThreadsPerChild  25 
MaxRequestsPerChild 0 
</IfModule> 

는 그것이 유효한 설정, 같은데. 그러나 MaxRequestsPerChild는 내 것과 같이 0으로 설정되었습니다. 약 10으로 조정했습니다 (아마도 더 높을 수 있지만 지금 테스트 중입니다). 내 문제가 해결 된 것 같습니다. 희망이 도움이!