소개
DTrace 는 솔라리스10 의 새로운 기능으로 시스템과 시스템에서 실행되고 있는 프로그램에 대한 좀 더 나은 이해를 도와 줍니다. DTrace 는 시스템이 하고 있는 일을 보고 확인 할 수 있도록 해주고 느린 동작의 원인을 잡아 낼 수 있도록 합니다. 이 것은 "D 프로그래밍 언어" 를 통해 이루어 지고 D는 프로그래밍 경험이 많이 없어도 충분히 이해할 수 있습니다. 이 에제에서 필자는 DTrace 스크립트를 만들 필요도 없이 DTraceToolkit(Brendan Gregg 만듬) 이라고 불리는 패키지 내의 스크립트를 사용할 것입니다. 이 패키지에는 약 80개 정도의 스크립트가 들어 있습니다.
문제
아파치에 mod_owa.so 모듈을 머신을 건드리지 않고 로드 하려고 하였습니다. 이 모듈은 Apache 가 오라클에 접속해서 정보를 가져 오는데에 사용 됩니다. Apache 에 모듈을 로딩할때 마다 머신의 로드가 높아 지면서 (실행되고 있는 Apache 프로세스만) <defunct> 프로세스들이 생깁니다. (참고: Defunct 프로세스는 그들의 부모 혹은 자식 프로세스와 통신 할 수 없어서 오류가 생긴 프로세스 입니다.)
{callacct:/u01/app/oracle} /usr/apache/bin/apachectl start /usr/apache/bin/apachectl start: httpd started {callacct:/u01/app/oracle} vmstat 1 kthr memory page disk faults cpu r b w swap free re mf pi po fr de sr m1 m1 m1 m2 in sy cs us sy id 0 0 0 17075280 447352 89 105 14 6 6 0 2 1 1 1 0 432 2566 671 1 1 98 0 0 0 16958384 157736 326 1242 23 31 31 0 0 40 43 43 0 2319 670 409 1 7 92 0 0 0 16945808 154256 93 1962 24 0 0 0 0 110 113 111 0 4168 1224 736 2 14 83 0 0 0 16945720 149888 1 139 8 0 0 0 0 247 256 261 0 5067 64 716 0 10 90 0 0 0 16948864 151448 3 601 55 879 879 0 0 186 186 174 0 4885 77 637 0 9 91 ^C
Apache 를 시작하기 전에 머신은 idle 이 100 이였습니다. 시작 후에 90 초반에서 90 으로 떨어지는 것을 볼때 무언가 문제가 생겼음을 알 수 있습니다ps -ef 를 실행해 보겠습니다:
{callacct:/u01/app/oracle} ps -ef
UID PID PPID C STIME TTY TIME CMD
root 15038 14830 0 - ? 0:00 <defunct>
oracle 16343 16341 0 Sep 19 pts/3 0:00 -sh
oracle 16341 16338 0 Sep 19 ? 0:00 /usr/lib/ssh/sshd
root 15042 12675 0 Sep 19 ? 0:00 /usr/lib/ssh/sshd
root 15041 14830 1 09:14:45 ? 0:00 /usr/apache/bin/httpd
root 14830 1 0 09:11:06 ? 0:01 /usr/apache/bin/httpd
root 15044 15511 0 09:14:48 pts/2 0:00 ps -ef
root 15043 14830 1 09:14:45 ? 0:00 /usr/apache/bin/httpd
root 15040 14830 0 - ? 0:00 <defunct>
위에서 defunct 프로세스를 볼 수 있고 load 가 0 에서 .22 로 증가했습니다:
{callacct:/u01/app/oracle} w
9:13am up 4 day(s), 21:49, 3 users, load average: 0.22, 0.12, 0.05
이제 Apache 가 이 모듈과 함꼐 시작되었고 머신에 문제가 생겼으며 무엇인가 잘 못 되가고 있다는 것이 명확합니다. 시스템은 또한 매우 느려 졌고 간단한 커맨드에 응답하는데에 시간이 오래 걸렸습니다.
해결책 찾기
필자는 mod_owa.so 의 소스 먼저 들여다 보기 시작했습니다. 그리고 컴파일 하고 (필자가 이전에 가지고 있던 것은 바이너리였습니다), 이것이 문제라고 생각했었습니다. 그러나 실제로는 그렇지 않았고 어쨌든 문제를 해결하지도 못했습니다. 그래서 시스템을 살펴 보고 실제로 무슨 일이 벌어 지고 있는지 알아보기로 결정했습니다.
아래는 DTraceToolkit 의 execsnoop 을 이용해서 확실한 무언가가 나타나는지 확인해 보았습니다. (참고: execsnoop 은 시스템에서 벌어지는 파일 실행에 대해 알려 줍니다.)
{callacct:/root/DTraceToolkit-0.83} ./execsnoop -a TIME STRTIME ZONE PROJ UID PID PPID ARGS [wait 10-15 seconds] ^C
아무것도 나타 나지 않았습니다. 그래서 다음으로 opensnoop 을 시도해 보았습니다. (참고: opensnoop 은 시스템에서 벌어지는 파일 열기 작업들에 대해 알려 줍니다.)
출력을 볼떄 httpd 프로세스는 위의 모든 파일들을 반복적으로 열고 있습니다. 여기서 우리가 관심 있는 것은 FD (file descriptor) 가 '-1' 값을 가지고 있는 (이것은 오류를 의미) /u01/app/oracle/ocommon/nls/admin/data/lx1boot.nlb 파일 입니다. 이 파일이 존재하는지 확인해 보겠습니다:
{callacct:/u01/app/oracle} ls /u01/app/oracle/ocommon/nls/admin/data/lx1boot.nlb
/u01/app/oracle/ocommon/nls/admin/data/lx1boot.nlb: No such file or directory
이 파일이 어디에 있는지 확인해 보았습니다:
{callacct:/u01/app/oracle} find /u01 -name *lx1boot.nlb*
/u01/app/oracle/OraHome1/ocommon/nls/admin/data/lx1boot.nlb
문제는 프로그램이 /u01/app/oracle/OraHome1/ocommon 에서 찾아야 할 파일을 /u01/app/oracle/ocommon 에서 찾고 있었습니다.
문제 해결하기
해결책은 아주 간단 합니다 -- 단순히 파일의 심볼릭 링크를 생성하였습니다.:
이제 연결이 만들어 졌고, 다시 opensnoop 을 실행해서 여전히 문제가 있는지 확인해 보았습니다:
이제 lx1boot.nlb 파일에는 아무런 문제도 없습니다, 그러나 /u01/app/oracle/ldap 과 /u01/app/oracle/oracore 디렉토리에 있는 파일들에 문제가 생겼습니다.
이전의 /u01/app/oracle 디렉토리를 확인해 본 결과 oracore 와 ldap 이 존재하지 않음을 확인 하였고 이 디렉토리들 또한 심볼릭 링크를 걸어 주었습니다:
opensnoop 을 다시 한번 실행해 본 결과 어떠한 에러도 발생하지 않았고 vmstat 도 cpu idle 을 다시 정상인 100으로 출력되었습니다:
또한 load 평균도 감소 하였습니다:
{callacct:/u01/app/oracle} w 9:57am up 4 day(s), 22:33, 3 users, load average: 0.02, 0.10, 0.12
그리고 어떠한 defunct 프로세스도 생성되지 않았습니다.
저자에 관하여
Derek Crudgington 은 dacrud@gmail.com 로 연락이 가능합니다 그의 웹사이트는 다음과 같습니다: http://hell.jedicoder.net
이 글의 영문 원본은
Using DTrace to Solve a Problem With Defunct Processes
에서 보실 수 있습니다.
"관리자코너" 카테고리의 다른 글
- 메타 데이터베이스 삭제 사고 시 솔라리스 OS의 시스템 복구 (댓글 0개 / 트랙백 0개) 2008/07/10
- 멀티스레드 시스템의 리소스를 최대한 사용하기 위한 기본 예약 클래스 설정 (댓글 0개 / 트랙백 0개) 2008/07/15
- DTrace 를 이용하여 Defunct 프로세스 문제 해결하기 (댓글 0개 / 트랙백 0개) 2008/07/28
- 솔라리스 볼륨 메니저를 이용하여 솔라리스9, 10 에서 루트를 미러링 하는 방법 (댓글 1개 / 트랙백 0개) 2008/09/20
- UFS Dump 의 안전한 관리 방법 (댓글 14개 / 트랙백 1개) 2007/08/20
- 솔라리스9 혹은 그 이상 버전을 운용하는 시스템상의 하드 디스크로 부터 WAN 부트이용하기 (댓글 0개 / 트랙백 0개) 2007/12/14
- rsync 와 sudo 를 이용한 원격 업데이트 (댓글 0개 / 트랙백 0개) 2008/03/11
- 윈도우 혹은 리눅스에서 솔라리스 파티션에 접근하기 (댓글 0개 / 트랙백 0개) 2008/05/19
- 솔라리스 라이브 업그레이드를 이용하여 논-글로벌 존의 솔라리스10을 업그레이드 하는 방법 (댓글 0개 / 트랙백 0개) 2008/01/16
- 썬 디바이스 검출 툴 - 버젼 1.0 (댓글 3개 / 트랙백 0개) 2007/01/23
댓글을 달아 주세요