| Sowmini Varadhan, opensolaris.org, 2007년 1월 |
|
|
|
배경 지식
Dtrace는 네트워크의 문제점 특히 커널 내의 문제점을 디버깅할 수 있도록 도와주는 매우 간편한 툴입니다. 그리고 이 문서는 DTrace 의 간단한 소개와 기능, 그리고 다양하고 복잡한 기능을 하는 네트워크 특수한 스크립트들을 제공합니다. 이 글의 목적은 스크립트의 저장소를 제공함으로써 네트워크에 심각한 버그를 겪고 있음에도, DTrace 를 처음부터 배우기 곤란한 사람들을 도와주기 위함입니다.
이 글에 포함된 스크립트들은 어떤 특수한 문제를 완전히 해결하기 위한 것이라기 보다 갖다 붙이기를 하면서 다른 문제들을 해결 할 수 있도록 의도된 스크립트들이라는 점을 유념하여 주시기 바랍니다.
우리의 뉴스레터를 위한 모든 종류의 도움을 환영 합니다. Sowmini 에게 스크립트를 보내주세요!
여기에 몇가지 다른 유용한 문서들의 링크를 소개 합니다:
네트워크를 위한 DTrace 교재
시작하려면
가이드
DTrace는 어떻게 사용할까요? 사용자는 DTrace 스크립트를 사용하거나 혹은 직접 작성할 것입니다:
DTrace 스크립트 사용
- DTraceToolkit 을 다운로드 함.
- 스크립트를 다른 웹사이트 에서 다운로드 함.
- DTrace 한줄 스크립트(OneLiner)를 확인함.
- /usr/demo/dtrace 에 있는 스크립트나 DTrace Guide 에 있는 스크립트들을 사용 함.
- BigAdmin 포럼 혹은 인터넷을 검색하여 유용한 스크립트들을 찾아냄.
DTrace 스크립트 작성
여러분은 오류를 해결하거나 성능 문제를 해결하기 위해 고유의 DTrace 스크립트를 작성할 것입니다.
- C 를 아는 것은 도움이 됨.
- 커널에 대해 조금이라도 아는 것이 도움이 됨
- 거의 모든 작업이 가능함
고유의 스크립트 작성을 시작하려면:
- DTrace Guide 의 챕터 1(적어도) 을 읽을 것
- DTrace 한줄 스크립트(OneLiner) 를 확인해 볼 것.
- DTrace 예제들을 읽어 볼 것.
- 스크립트를 공부할 것.
- 다른 웹사이트의 스크립트를 확인해 볼것.
- DTraceToolkit 을 다운로드 받을 것
- BigAdmin 포럼 에 참여할 것
주의: 이 사이트 내의 스크립트 중 많은 수가 커맨드 라인 옵션을 받기 위해 본 쉘 혹은 펄로 래핑(wrapping) 되어 있습니다. 아마 앞으로 DTrace 가 직접 매개변수를 다룰 수 있을수도 있습니다. 그동안 이 코드는 미래의 순수한 DTrace 컨버젼을 용이하게 하는 방향으로 작성되어 왔습니다.
네트워크 Dtrace 스크립트
몇몇 한줄짜리 DTrace 스크립트는
usres.tpg.com.au 에서 찾아보실 수 있습니다.
추가적인 DTrace 스크립트들의 tarball (아래에서 설명됨)은
여기 서 찾을 수 있습니다.
간단한 DTrace 스크립트
bge_send.d - bge_send 의 보내진 패킷과 실패한 패킷의 카운트를 확인. 특별한 타입(ip proto 등등) 의 패킷을 카운트 하도록 간단히 수정 가능
arp_lookup.d - arp에서 찾고자하는 ipv4 주소를 간단히 찾아냄.
arp_snoop.d - ar_rput()에서 가로챈 패킷의 스택 트레이스와 패킷 구조(snoop의 출력형식과 비슷하게)를 출력함.
break_in_kmdb.html - kmdb에서 breakpoint()를 호출할 수 있는 스크립트.
ctx.d - sendto() 호출이 pswitch probe를 사용할때 컨텍스트 스위칭을 관찰.
udp.d - UDP MIB 제공자를 이용하여 각 초당의 udp 상태를 보여줌.
ip_reass.d - ip 패킷의 분리를 추적함; 32 비트 ip 어드레스의 보기 간편한 출력을 제공.
unknown_proto.d 는 "알수없는 IP 프로토콜" 패킷의 정체를 출력할때 사용됨. -- ipInUnknownProtos MIB/netstat 카운터에 나타난 패킷.
타이밍 드라이버를 위한 DTrace 스크립트
e1000g.d - e1000g 드라이버의 호출 횟수 및 비싼 호출인 CleanTxInterrupts() 함수의 시간을 카운트; 집합("@") 의 사용예.
ce.d.html - ce 드라이버의 arp 모듈의 서비스 타임 측정.
jitter.d - sendto, recvfrom 에서 오류 혹은 오래 지연된 시간 측정; jitter2.d 는 jitter.d 를 speculate() 를 이용하여 필터링.
trace_nce_res_mp.d 는 중요한 함수(예를 들어 dblk_free)에서 특정한 패킷을 집어 내도록 커스터마이즈 할 수 있는 간단한 템플릿임.
커널 프로파일링을 위한 DTrace 스크립트
prof.d - 시스템 타임을 많이 소비하는 커널을 프로파일; 프로파일 제공자를 집합등과 사용하는 예제임. prof2.d 와 prof3.d 는 prof.d 의 수정된 예제임.
DTrace를 이용한 프로파일링 툴
썬 스튜디오 컴파일러는 er_kernel 툴을 통해 솔라리스 커널을 프로파일링 할 수 있는 툴을 제공합니다. er_kernel 은 솔라리스10을 위한 DTrace, 그리고 솔라리스 8, 9, 10의 kpcsdrv라는 두가지의 드라이버를 통해 데이타를 수집합니다. DTrace 드라이버는 기본값입니다; kpcsdrv 드라이버는 er_kernel의 첫번째 매개변수가 -X 일때 사용됩니다.
이 툴에 대한 자세한 정보는 다음을 확인하시기 바랍니다:
좀더 정교한 스크립트들....
dtrace 토론 (http://www.open solaris.org/os/community/dtrace/scripts/) 사이트에 몇몇 스크립트들이 있습니다.
zerocopy.d (http://npt.eng/dtrace/zerocopy.d.html) - 모니터
zerocopy.d - TCP의 ZeroCopy 기능을 모니터 하여 다른 컴포넌트 들에 무슨 일이 발생했는지 보여줌(예를 들어 STREAM head, TCP, IP(ill), mblk, 같은)
다른 Dtrace 스크립트 리스트
Richard McDougall 의 Dtrace 스크립트
네트워크를 위한 Dtrace의 제약사항
Dtrace는 사후 분석에 알맞은 툴은 아닙니다. 예를 들어 네트워크 분야에서 자주 발생하는 문제인 "내 패킷이 어느 큐에 들어갔지" 하는 질문 같은 것들 말입니다. 또 다른 문제로는 메모리 누출이 이미 발생한 후에 어떠한 이벤트가 메모리 혹은 참조카운트 누출을 발생시켰는지 분석하는 것들이 있습니다.
공헌자
Jim Carlson, Jim Fiori, Darrin Johnson, Alex Peng, Sowmini Varadhan
댓글을 달아 주세요
좋은 정보 감사해요~
2007/09/19 03:59좋은 정보 감사해요~
2007/09/19 04:00tcp/ip에서 유용한 문제해결 도구죠. 저도 자주 써먹고 있어요. 이렇게 다양하진 않지만요.
2007/09/19 15:49