DTrace
1. 개요
DTrace는 썬 마이크로시스템즈가 개발한 동적 추적 프레임워크로, 사용자가 애플리케이션과 운영 체제를 조정하고 문제 해결을 할 수 있도록 운영 통찰력을 제공한다. DTrace는 D 프로그래밍 언어를 사용하여 작성된 추적 프로그램(스크립트)을 통해 작동하며, 프로브를 사용하여 특정 조건 발생 시 작업을 실행한다. 솔라리스 10에 처음 포함되었으며, FreeBSD, NetBSD, macOS, 리눅스, 윈도우 등 다양한 운영 체제에서 지원된다. MySQL, PostgreSQL, 오라클 데이터베이스 등 여러 애플리케이션에서도 DTrace를 지원한다. 브라이언 캔트릴, 마이크 샤피로, 아담 레벤탈이 개발했으며, 여러 기술 혁신 상을 수상했다.
| 이름 | DTrace |
|---|---|
| 종류 | 동적 추적 프레임워크 |
| 개발자 | 선 마이크로시스템즈, 오라클, 마이크로소프트 |
| 발표일 | 2005년 1월 |
| 저장소 | GitHub 저장소 |
| 운영 체제 | 솔라리스, illumos, macOS, FreeBSD, NetBSD, 리눅스, 윈도우 |
| 프로그래밍 언어 | C |
| 장르 | 추적 |
| 라이선스 | CDDL, GPLv2, UPL |
| 웹사이트 | DTrace 공식 웹사이트 |
-
관점 지향 프로그래밍 -
Nemerle
Nemerle은 객체 지향 및 함수형 프로그래밍 스타일을 혼합하여 사용할 수 있는 프로그래밍 언어이며, 강력한 형식 추론, 메타프로그래밍 시스템, 다양한 프로그래밍 스타일 지원, .NET 플랫폼 라이브러리 접근 용이성 등의 특징을 갖는다. -
관점 지향 프로그래밍 -
스프링 프레임워크
스프링 프레임워크는 로드 존슨의 코드에서 시작된 자바 플랫폼용 오픈 소스 애플리케이션 프레임워크로, IoC 컨테이너와 AOP 등의 핵심 기능과 다양한 모듈 및 템플릿을 통해 엔터프라이즈 자바 개발의 생산성을 향상시키고 확장성을 제공하며 웹 개발, 보안, 데이터 접근 등 다양한 기능을 지원한다. -
리눅스 커널 특징 -
커널 기반 가상 머신
커널 기반 가상 머신(KVM)은 리눅스 커널의 가상화 확장 기능으로, CPU와 메모리 가상화를 지원하며 QEMU와 함께 완전한 가상화 솔루션을 구성하고 다양한 관리 도구를 제공한다. -
리눅스 커널 특징 -
AppArmor
AppArmor는 리눅스 보안 모듈로, 프로그램의 정상적인 동작을 정의하는 프로필을 통해 비정상적인 행위를 차단하며 SELinux의 대안으로 제시되었으나 보안 취약점, 성능, 설정, 호환성 등에 대한 논란도 있다. -
명령줄 소프트웨어 -
어드밴스트 패키징 툴
어드밴스트 패키징 툴(APT)은 데비안 계열 리눅스 배포판에서 패키지를 관리하는 도구 모음으로, 패키지 설치, 삭제, 업데이트, 업그레이드 기능을 제공하며, 특히 패키지 간 의존성을 자동 관리하는 특징을 가진다. -
명령줄 소프트웨어 -
FFmpeg
FFmpeg은 오디오 및 비디오 데이터를 다루는 자유 소프트웨어 프로젝트로, 다양한 코덱과 형식을 지원하며 멀티미디어 응용 프로그램에 활용되고 2011년 Libav로 포크되기도 했으나 통합 과정을 거쳤다.
2. 설명
썬 마이크로시스템즈는 사용자가 애플리케이션과 운영체제(OS) 자체를 튜닝하고 문제를 해결할 수 있도록 운영 통찰력을 제공하기 위해 DTrace를 설계했다.
테스터는 D 프로그래밍 언어 (다른 "D"라는 이름을 가진 프로그래밍 언어와 혼동하지 않도록 주의)를 사용하여 추적 프로그램(스크립트라고도 함)을 작성한다. C에서 영감을 얻은 이 언어에는 추적에 특화된 함수와 변수가 추가되었다. D 프로그램은 구조적으로 AWK 프로그램과 유사하며, 하나 이상의 프로브(계측 지점) 목록으로 구성되고 각 프로브는 작업과 연결된다. 이러한 프로브는 관점 지향 프로그래밍의 포인트컷과 유사하다. 프로브에 대한 조건이 충족될 때마다 관련 작업이 실행된다 (프로브가 "실행"된다). 일반적인 프로브는 특정 파일이 열리거나, 프로세스가 시작되거나, 특정 코드 줄이 실행될 때 실행될 수 있다. 실행되는 프로브는 콜 스택과 컨텍스트 변수에 접근하고 식을 평가하여 런타임 상황을 분석할 수 있으며, 일부 정보를 출력하거나 기록하고 데이터베이스에 기록하거나 컨텍스트 변수를 수정할 수 있다. 컨텍스트 변수를 읽고 쓰는 기능을 통해 프로브가 서로 정보를 전달하여 서로 협력하여 다른 이벤트 간의 상관 관계를 분석할 수 있다.
DTrace를 운영 환경에서 안전하게 사용할 수 있도록 특별한 고려가 이루어졌다. 예를 들어, 추적을 수행할 때 프로브 효과가 최소화되고 비활성화된 프로브와 관련된 성능 영향이 없다. 활성화할 수 있는 수만 개의 DTrace 프로브가 있기 때문에 이는 중요하다. 새로운 프로브도 동적으로 생성할 수 있다.
3. 명령 줄 예
DTrace 스크립트는 하나 이상의 프로브(probe)와 액션(action)을 인수로 지정하여 명령 줄에서 직접 호출할 수 있다.
스크립트는 수백 줄 길이로도 작성할 수 있지만, 고급 문제 해결 및 분석에는 보통 수십 줄 정도만 필요하다. Brendan Gregg(DTrace 책의 저자)가 만든 DTraceToolkit에서 200개 이상의 오픈 소스 DTrace 스크립트 예제를 찾을 수 있으며, 각 스크립트에 대한 문서와 데모도 제공한다.
3.1. 예시
DTrace 스크립트는 하나 이상의 프로브(probe)와 액션(action)을 인수로 지정하여 명령 줄에서 직접 호출할 수 있다. 다음은 그 예시이다.
| 설명 | 명령어 |
|---|---|
| 인수가 있는 새로운 프로세스 | `dtrace -n 'proc:::exec-success { trace(curpsinfo->pr_psargs); }'` |
| 프로세스에서 연 파일 | `dtrace -n 'syscall::open*:entry { printf("%s %s",execname,copyinstr(arg0)); }'` |
| 프로그램별 시스템 호출 횟수 | `dtrace -n 'syscall:::entry { @num[execname] = count(); }'` |
| 시스템 호출별 시스템 호출 횟수 | `dtrace -n 'syscall:::entry { @num[probefunc] = count(); }'` |
| 프로세스별 시스템 호출 횟수 | `dtrace -n 'syscall:::entry { @num[pid,execname] = count(); }'` |
| 프로세스별 디스크 크기 | `dtrace -n 'io:::start { printf("%d %s %d",pid,execname,args[0]->b_bcount); }'` |
| 프로세스별 페이지 인 | `dtrace -n 'vminfo:::pgpgin { @pg[execname] = sum(arg0); }'` |
스크립트는 수백 줄 길이로도 작성할 수 있지만, 고급 문제 해결 및 분석에는 보통 수십 줄 정도만 필요하다. Brendan Gregg(DTrace 책의 저자)가 만든 DTraceToolkit에서 200개 이상의 오픈 소스 DTrace 스크립트 예제를 찾을 수 있으며, 각 스크립트에 대한 문서와 데모도 제공한다.
4. 지원 플랫폼
DTrace는 2003년 11월에 처음 사용 가능하게 되었으며, 2005년 1월 Sun의 솔라리스 10의 일부로 정식 출시되었다. DTrace는 OpenSolaris 프로젝트 구성 요소 중 CDDL 하에 소스 코드가 공개된 최초의 구성 요소였다.
DTrace는 illumos 및 관련 배포판의 필수적인 부분이다. 또한 FreeBSD와 NetBSD의 표준 부분이기도 하다.
애플은 Mac OS X 10.5 "Leopard"에 DTrace 지원을 추가했으며, Instruments라는 GUI를 포함시켰다. /usr/bin에는 DTraceToolkit의 40개 이상의 DTrace 스크립트가 포함되어 있으며, 디스크 I/O (iosnoop) 및 프로세스 실행 (execsnoop)을 검사하는 도구가 포함되어 있다. DTrace가 지원되는 다른 플랫폼과 달리, Mac OS X에는 프로그램이 설정할 수 있는 플래그 (P_LNOATTACH)가 있어 DTrace 및 gdb와 같은 디버깅 유틸리티가 해당 프로세스를 추적하는 것을 허용하지 않는다. 최초의 Mac OS X DTrace 구현에서 이 플래그가 설정된 프로그램이 실행되는 동안 실행되어야 하는 관련 없는 프로브가 실행되지 않아 다른 시스템 정보 추적에 영향을 미칠 수 있었다. OS X 10.5.3 업데이트는 몇 달 후에 이 문제를 해결했다. 그러나 El Capitan 이후부터 System Integrity Protection은 기본적으로 사용자가 보호된 바이너리를 DTrace하는 것을 방지한다.
리눅스용 DTrace는 2008년부터 사용 가능하게 되었으며; 문제 개선 및 해결을 위한 작업이 활발히 진행 중이다. 또한 [https://github.com/dtrace4linux/linux github에 활발한 구현]이 있다. 표준 코어 제공자(fbt, syscall, profile)와 특별한 "instr" 제공자가 제공된다 (일부 솔라리스 제공자는 현재 사용할 수 없다). 리눅스 DTrace 구현은 로드 가능한 커널 모듈이므로 커널 자체를 수정할 필요가 없어 DTrace가 CDDL 대 GPL 라이선스 충돌을 (최소한 소스 형태로) 피할 수 있다. 그러나 DTrace가 로드되면 커널 인스턴스는 오염됨으로 표시된다.
2007년, QNX Software Systems의 한 개발자는 자신의 블로그에서 자신과 동료가 DTrace를 QNX 운영 체제에 통합하는 작업을 진행하고 있다고 발표했다.
오라클은 2011년 오라클 리눅스에 대한 베타 DTrace 지원을 추가했으며, Unbreakable Enterprise Kernel 릴리스 2에서 기술 미리 보기로 제공되었고, 이는 GPLv2 하에 있다 (DTrace 리눅스 커널 모듈은 원래 CDDL 하에 출시되었다). 일반 사용 가능성은 2012년 12월에 발표되었다.
2019년 3월 11일, 마이크로소프트는 Windows 10 insider 빌드용 DTrace 버전을 출시했다. 마이크로소프트는 Windows Server 2025에 DTrace를 내장 도구로 포함시켰다.
5. 언어 및 애플리케이션 제공자
DTrace는 지원되는 언어 제공자를 통해 함수, 소스 파일, 줄 번호 위치를 포함한 코드의 컨텍스트를 검색할 수 있다. 또한, 동적 메모리 할당 및 가비지 수집은 해당 언어에서 지원하는 경우 사용할 수 있다. 지원되는 언어 제공자에는 어셈블리어, C, C++, 자바, 얼랭, 자바스크립트, Perl, PHP, 파이썬, 루비, 셸 스크립트, Tcl이 있다.
애플리케이션 제공자를 사용하면 DTrace가 시스템 호출을 통해 애플리케이션의 작동을 추적하여 커널까지 접근할 수 있다. DTrace 애플리케이션 제공자를 제공하는 애플리케이션에는 MySQL, PostgreSQL, 오라클 데이터베이스, 오라클 그리드 엔진, 파이어폭스가 있다.