포스트그레SQL제공 데이터베이스 서버의 동적 추적을 지원하는 기능입니다. 이를 통해 특정 지점에서 외부 유틸리티를 호출할 수 있습니다. 코드에서 실행을 추적합니다. 현재 이 시설은 주로 데이터베이스 개발자가 사용하도록 고안되었습니다. 코드에 대한 상당한 지식이 필요합니다.
종종 프로브라고 불리는 다수의 추적 지점이 이미 소스코드에 삽입했습니다. 기본적으로 이러한 프로브는 다음과 같습니다. 비활성화되어 있으며 사용자는 명시적으로 구성을 알려야 합니다. 프로브를 사용할 수 있게 만드는 스크립트PostgreSQL.
현재는 DTrace 유틸리티만 지원됩니다. Solaris Express 및 Solaris 10+에서 사용할 수 있습니다. 예상되는 것은 DTrace는 향후 FreeBSD 및 Mac OS X에서 사용할 수 있습니다. 다른 동적 추적 유틸리티를 지원하는 것은 이론적으로 에 대한 정의를 변경하면 가능합니다.PG_TRACE매크로src/include/pg_trace.h.
기본적으로 추적 지점은 비활성화되어 있으므로 다음을 수행해야 합니다. 프로브를 만들도록 구성 스크립트에 명시적으로 지시합니다. 에서 사용 가능PostgreSQL. 받는 사람 DTrace 지원 포함 지정--활성화-dtrace구성합니다. 참조섹션 15.5더 자세히 알아보기 정보.
소스 코드에는 몇 가지 표준 추적 지점이 제공됩니다. (물론 특정 목적에 따라 더 추가될 수도 있습니다. 문제). 이는 다음과 같습니다.표 26-3.
표 26-3. 내장 추적 지점
| 이름 | 매개변수 | 개요 |
|---|---|---|
| transaction__start | (int transactionId) | 새로운 거래의 시작. |
| transaction__commit | (int transactionId) | 트랜잭션이 성공적으로 완료되었습니다. |
| transaction__abort | (int transactionId) | 거래 완료에 실패했습니다. |
| lwlock__acquire | (int lockid, int 모드) | LWLock이 획득되었습니다. |
| lwlock__release | (int lockid, int 모드) | LWLock이 해제되었습니다. |
| lwlock__startwait | (int lockid, int 모드) | LWLock은 즉시 사용할 수 없었고 백엔드는 잠금이 해제될 때까지 기다리기 시작했습니다. 가능합니다. |
| lwlock__endwait | (int lockid, int 모드) | 백엔드가 대기에서 해제되었습니다. LW잠금. |
| lwlock__condacquire | (int lockid, int 모드) | 호출자가 LWLock을 성공적으로 획득했습니다. 대기 없음을 지정했습니다. |
| lwlock__condacquire__fail | (int lockid, int 모드) | LWLock은 다음과 같은 경우 성공적으로 획득되지 않았습니다. 발신자가 대기 없음을 지정했습니다. |
| lock__startwait | (int locktag_field2, int lockmode) | 무거운 잠금(lmgr 잠금)에 대한 요청이 있습니다. 잠금을 사용할 수 없기 때문에 기다리기 시작했습니다. |
| lock__endwait | (int locktag_field2, int lockmode) | 무거운 잠금(lmgr 잠금)에 대한 요청이 있습니다. 대기가 완료되었습니다(즉, 잠금을 획득했습니다). |
아래 예는 분석을 위한 DTrace 스크립트를 보여줍니다. 거래는 시스템에 따라 계산됩니다. 스냅샷 찍기pg_stat_database성능 테스트 전후:
#!/usr/sbin/dtrace -qs
postgresql$1:::트랜잭션-시작
@start["시작"] = 개수();
자체-ts = 타임스탬프;
postgresql$1:::트랜잭션-중단
@abort["중단"] = count();
postgresql$1:::트랜잭션-커밋
/자신-ts/
@commit["커밋"] = count();
@time["총 시간(ns)"] = sum(timestamp - self-ts);
자체-ts=0;
추적점 이름에 이중 밑줄이 어떻게 표시되어야 하는지 참고하세요. D 스크립트를 사용할 때 하이픈으로 대체됩니다. 실행되면, 예제 D 스크립트는 다음과 같은 출력을 제공합니다.
# ./txn_count.d `pgrep -n postgres` ^C 시작 71 커밋 70 총 시간(ns) 2312105013
추적 프로그램은 주의 깊게 살펴보아야 한다는 점을 기억해야 합니다. 사용하기 전에 작성 및 디버깅합니다. 그렇지 않으면 추적 수집된 정보는 의미가 없을 수 있습니다. 대부분의 경우 문제가 발견되면 기기에 결함이 있는 것입니다. 기본 시스템이 아닙니다. 발견된 정보를 논의할 때 동적 추적을 사용하는 경우 다음 작업에 사용된 스크립트를 포함해야 합니다. 그것도 확인하고 논의하도록 허용하세요.
새로운 추적 지점은 코드 내에서 정의될 수 있습니다. 개발자가 원하지만 이를 위해서는 재컴파일.
추적 지점 중 하나를 사용하여 추적 지점을 삽입할 수 있습니다. 매크로. 이는 변수의 수에 따라 선택됩니다. 해당 추적 지점에서 검사가 가능하도록 해야 합니다. 추적 이벤트 발생은 한 줄로 달성할 수 있으며, 추적점 이름만 사용합니다. 예:
PG_TRACE (my__new__trace__point);
더 복잡한 사설 토토 사이트 지점은 하나 이상의 사설 토토 사이트 지점을 제공할 수 있습니다. 동적 사설 토토 사이트 유틸리티에서 검사할 변수 를 사용하여PG_TRACEn수에 해당하는 매크로 추적 지점 이름 뒤의 매개변수:
PG_TRACE3(my__complex__event, varX, varY, varZ);
transaction__start 추적 지점의 정의는 다음과 같습니다. 아래에 표시됨:
정적 공백
StartTransaction(무효)
...
/*
* 새로운 거래 ID 생성
*/
s-transactionId = GetNewTransactionId(false);
XactLockTableInsert(s-transactionId);
PG_TRACE1(transaction__start, s-transactionId);
...
트랜잭션 ID가 동적 서버에 어떻게 제공되는지 참고하세요. 사설 토토 사이트 유틸리티입니다.
동적 추적 유틸리티를 사용하려면 추가 작업이 필요할 수 있습니다. 이러한 추적점을 정의하십시오. 예를 들어 DTrace에서는 다음을 요구합니다. 파일에 새 프로브 추가src/backend/utils/probes.d여기에 표시된 대로:
공급자 postgresql
...
트랜잭션__start(int) 조사;
...
;
다음에 지정된 데이터 유형에 주의해야 합니다. 프로브 인수가 사용된 변수의 데이터 유형과 일치합니다.PG_TRACE매크로. 이것은 아니다 컴파일 타임에 확인됩니다. 새로 추가된 것을 확인할 수 있습니다. 추적 지점은 다시 컴파일한 다음 새 항목을 실행하여 사용할 수 있습니다. 바이너리 및 루트로 다음과 같은 DTrace 명령을 실행합니다.
dtrace -l -n 트랜잭션 시작