httpd의 현재 처리중인 작업을 확인 할 수 있는 방법이 있을까요??

sunjae79의 이미지

몇달 전부터 OOM으로 인해 서버에 문제가 생기고있습니다

확인해본바 httpd의 메모리 점유율 상승으로 스왑영역까지 모두 사용하여 발생하고 있었습니다.

httpd 데몬은 개발팀의 client가 설치되어있긴 한데 개발쪽에서는 문제 없다고 말하고있고

장애 때문에 메모리 50%이상 올라가면 수동으로 kill 시켜주고 있는 상황입니다.

특정시간에 발생하는것은 아닌것 같고.. 몇십개의 httpd 중에 하나의 데몬에만 문제가 발생하는 상황이라

도움될만한 정보가 있다면 도움 부탁드립니다.

2대의 서버에서 발생하고있어 서버 자체를 동일 모델 다른 장비로 바꾸어 보았지만 동일한 증상이 발생하고있으니

하드웨어 문제의 경우는 배제하고 답변 부탁드립니다.

incarnate의 이미지

일단 lsof 로 살펴 보시고 (lsof -i TCP:80)

다음으로 OOM 문제가 httpd (아파치일 경우)가 확실하다면 RLimitMEM 모듈로 강제적으로 메모리 제한을 두고 모니터링 해보시면 어떨까 합니다.

보통 웹 서버 엔진 문제보다는 애플리케이션 서버에서 문제가 발생하는 경우를 많이 봤습니다.

애플리케이션 서버가 php일 경우와 톰켓 같은 컨테이너 일 경우 각각 모니터링 하는 방법이 틀립니다.

php 는 구글에서 찾으면 많을 거 같고 톰켓은 힙 덤프를 떠서 확인 후 개발자에게 말하는게 좋을 듯 합니다.

먹고 죽자~

김정균의 이미지

gdb로 process dump를 떠 봐서 확인해 보는 것도 한 방법입니다.

다음의 스크립트를 만들어서 실행해 보세요.

/tmp/gdbopt.txt

where
quit

procdump.sh

#!/bin/bash
 
pids=$(/sbin/pidof httpd)
for i in $pids
do
    printf "## %s debugging ##\n\n" $i
    gdb /usr/bin/httpd $i < /tmp/gdbopt.txt 2> /dev/null
    printf "\n\n"
done

이 스크립트를 실행하시면 현재 실행되고 있는 httpd process를 dump 합니다. 그리고 메모리를 많이 잡아먹는 프로세스의 pid를 확인해서 어떤 call을 실행하고 있는지 확인해 보는 것도 한 방법입니다.

pidof, httpd, gdb의 경로는 machine마다 다를 수 있으니 확인해 보세요.

이 방법은 이미 OOM이 발생하면 사용할 수 없으니, monitoring 하다가 메모리 많이 잡아먹는 놈이 발생하면 실행해 주시면 됩니다. 소스를 좀 수정해서 특정 PID만 보시든지요. (코드 짜기가 좀 귀찮아서..)

안녕 리눅스의 경우에는 그냥 httpd-dump 명령을 실행하면 /var/log/httpd/gdb 에 결과가 남습니다.

goforit의 이미지

> 특정시간에 발생하는것은 아닌것 같고.. 몇십개의 httpd 중에 하나의 데몬에만 문제가 발생하는 상황이라

top command (option with H) 주기 적으로 실행하여 그결과를 저장 후에 VIRT (총 가상메모리) 증가하는 놈을 찾으세요. 생각보다 쉽습니다. 대부분 프로세서의 VIRT 크게 변하지 않는데 계속 증가하는 특정 PID가 보일 것 입니다. 그 녀석에게서 메모리 Leak이 발생하고 있는 것입니다.