1. Overview

OHS 12cR2(12.2.1.4) event mpm child processes 가 점진적으로 메모리 사용률이 증가하여 재기동으로 해소 중이다.

메모리가 증가하는 원인을 분석해야 한다.



2. Descriptions

OHS 와 같은 binary process의 경우, 이러한 상황에서 분석하기 위해

OHS 자체에서 제공하는 기능이 충분치 않다.

mod_status 와 같은 모듈 외에 특별한 것이 있지 않기 때문에, top 과 같은 명령어에 의존적이다.


valgrind 를 사용하여, 메모리를 사용하는 모듈을 파악하려 하며,

smaps 자료로 메모리 사용 형태를 파악하기로 한다.


2.1 valgrind

apachectl 을 사용하는 OHS 12cR1 이전 버전들에 대해서는, valgrind 셋업이 비교적 쉽다.

OHS 12cR2 부터는 launch를 사용해야 하는데, binary 다 보니 valgrind 셋업이 되지 않아,

lastinvocation을 활용해야 한다.


lastinvocation.log 를 shell script로 복제한다.

1
2
$ cp ${DOMAIN_HOME}/servers/<worker>/logs/lastinvocation.log ${DOMAIN_HOME}/servers/<worker>/logs/start-<worker>_with_valgrind.sh
$ chmod +x ${DOMAIN_HOME}/servers/<worker>/logs/start-<worker>_with_valgrind.sh


shell 을 수정하여, valgrind 를 셋업한다. lastinvocation.log와 비교하면, valgrind를 어떻게 셋업해야 할지 알 수 있다.

1
2
3
4
$ vi ${DOMAIN_HOME}/servers/<worker>/logs/start-<worker>_with_valgrind.sh
PATH=/sw/webtier/12cR2/wlserver/../ohs/bin:/sw/webtier/12cR2/wlserver/../bin:/bin:/usr/bin:/usr/local/bin; export PATH
...
exec valgrind --trace-children=yes --tool=memcheck --leak-check=full --log-file=/tmp/valgrind-%p.log --num-callers=35 --error-limit=no --read-var-info=yes --track-origins=yes -v /sw/webtier/12cR2/wlserver/../ohs/bin/launch httpd -DOHS_MPM_EVENT -d /sw/webtier/12cR2/.../<worker> -k start -f /sw/webtier/12cR2/.../<worker>/httpd.conf


OHS 실행

1
$ ${DOMAIN_HOME}/servers/<worker>/logs/start-<worker>_with_valgrind.sh

1024 미만의 Port를 사용 시, root 권한이 필요한데, exec valgrind 명령은 shell 내장함수라서 root 권한을 부여하며 실행하여도 valgrind는 적용되지 않아, 1024 미만의 Port 로 기동되지 않는다.

1024 미만의 Port를 사용하지 않도록 하거나, firewall-rules 등을 통한 조치를 하거나, 여기서 연구되지 않은 다른 방법을 찾아야 한다.


/tmp/valgrind-<pid>.log 아 기록되며, kill -TERM <parent pid> 으로 종료 시 일부 로그에 Leak summary 가 기록된다.

해당 자료를 통해 조사해야 한다.



2.2 smaps

OHS 모든 프로세스 대상으로, /proc/<pid>/smaps 자료를 수집하여 조사한다.

실제 고객은 OHS parent, child, rotatelogs 등 세 종류의 모든 프로세스를 조사하였다.


이 중, child processes 들에서 아래와 같이 [Heap]의 사용량은 적으나,

Anonymous 라고 하는, 어느 모듈이 사용하는지 추적되지 않은 익명으로 기록되고 있다.

또한, 여기서 Private 항목으로 메모리 사용률이 높다고 나오는데, 해당 child process 만 독점적으로 사용하고 있다는 것이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
7fc808000000-7fc80c000000 rw-p 00000000 00:00 0 
Size:              65536 kB
Rss:               65536 kB
Pss:               65536 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:     65536 kB
Referenced:        65092 kB
Anonymous:         65536 kB
AnonHugePages:      2048 kB
Swap:                  0 kB
KernelPageSize:        4 kB
MMUPageSize:           4 kB
Locked:                0 kB


고객은, valgrind 를 통해 더 이상 추적 하지 않고,

MaxConnectionsPerChild 옵션값을 10,000 으로 설정하여 주기적 재기동으로 문제를 해결하는 것으로 만족했다.

smaps 자료를 통해, 해당 child process 만의 메모리 점유 문제이므로 동의한 것이다.



3. References