PostgreSQL제공 데이터베이스 서버의 동적 토토 핫을 지원하는 시설. 이를 통해 외부 유틸리티를 특정 지점에서 호출 할 수 있습니다. 코드에서 토토 핫 실행. 현재이 시설 주로 데이터베이스 개발자가 사용하기위한 것입니다. 코드에 대한 상당한 친숙 함이 필요합니다.
종종 프로브라고하는 많은 추적 지점이 이미 있습니다. 소스 코드에 삽입되었습니다. 기본적 으로이 프로브는 다음과 같습니다 비활성화되고 사용자는 명시 적으로 구성을 알려야합니다. 프로브를 사용할 수 있도록 스크립트postgresql.
현재 DTRACE 유틸리티 만 지원됩니다. Solaris Express 및 Solaris 10+에서 제공됩니다. 그것은 예상됩니다 DTRACE는 FreeBSD 및 Mac OS X에서 향후 제공 될 예정입니다. 다른 동적 토토 핫 유틸리티를 지원하는 것은 이론적으로입니다 에 대한 정의를 변경하여 가능합니다.PG_TRACE매크로스에서src/include/pg_trace.h.
기본적으로 토토 핫 지점이 비활성화되므로 프로브를 작성하도록 구성 스크립트를 명시 적으로 알려줍니다 사용 가능PostgreSQL. 에게 dtrace 지원 포함-enable-dtrace구성하려면. 보다섹션 14.5추가 정보.
소스 코드에 몇 가지 표준 토토 핫 지점이 제공됩니다. (물론 특정에 필요에 따라 더 많은 것을 추가 할 수 있습니다. 문제). 이들은에 표시됩니다.표 25-3.
표 25-3. 내장 추적 포인트
이름 | 매개 변수 | 개요 |
---|---|---|
Transaction__start | (int transactionId) | 새로운 거래의 시작. |
Transaction__commit | (int transactionId) | 거래의 성공적인 완료. |
Transaction__Abort | (int transactionId) | 거래의 실패. |
lwlock__acquire | (int lockid, int mode) | LWLOCK이 인수되었습니다. |
lwlock__release | (int lockid, int mode) | LWLOCK가 출시되었습니다. |
lwlock_startwait | (int lockid, int mode) | LWLOCK을 즉시 사용할 수 없었고 a 백엔드가 자물쇠가 될 때까지 기다리기 시작했습니다. 사용 가능. |
lwlock_endwait | (int lockid, int mode) | 대기에서 백엔드가 해제되었습니다. LWLOCK. |
lwlock__condacquire | (int lockid, int mode) | 발신자 일 때 LWLOCK이 성공적으로 인수되었습니다 대기하지 않음. |
lwlock__condacquire__fail | (int lockid, int mode) | 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 [ "start"] = count (); 자기 TS = 타임 스탬프; Postgresql $ 1 ::: Transaction-Abort @abort [ "abort"] = count (); Postgresql $ 1 ::: Transaction-Commit /self ts/ @commit [ "commit"] = count (); @Time [ "총 시간 (ns)"] = sum (timestamp- self ts); 자기 TS = 0;
추적 지점 이름의 이중 밑줄이 어떻게 필요한지 확인하십시오. D 스크립트를 사용할 때 하이픈으로 교체하십시오. 실행되면 예제 D 스크립트는 다음과 같은 출력을 제공합니다.
# ./txn_count.d` pgrep -n postgres` ^c 시작 71 커밋 70 총 시간 (NS) 2312105013
토토 핫 프로그램이 신중하게해야한다는 것을 기억해야합니다. 사용하기 전에 작성 및 디버깅, 그렇지 않으면 흔적 수집 된 정보는 의미가 없을 수 있습니다. 대부분의 경우 어디에 문제가 잘못된 계측 인 것으로 나타났습니다. 기본 시스템이 아닙니다. 발견 된 정보를 논의 할 때 동적 토토 핫을 사용하여 사용 된 스크립트를 동봉하십시오. 확인하고 논의 할 수 있도록 허용합니다.
새로운 트레이스 포인트는 어디에서나 코드 내에서 정의 될 수 있습니다. 개발자는 원하지만 a 재 컴파일.
추적 중 하나를 사용하여 추적 지점을 삽입 할 수 있습니다. 매크로. 이들은 얼마나 많은 변수 의지에 따라 선택됩니다 그 추적 지점에서 검사를받을 수 있도록합니다. 트레이싱 이벤트 발생은 단일 줄로 달성 할 수 있습니다. 추적 지점 이름 만 사용 (예 :
pg_trace (my__new__trace__point);
더 복잡한 토토 핫 지점이 하나 이상 함께 제공 될 수 있습니다. 동적 토토 핫 유틸리티에 의한 검사 변수 사용 사용PG_TRACEn수에 해당하는 매크로 추적 지점 이름 다음에 매개 변수 :
pg_trace3 (my__cclex__event, varx, vary, varz);
트랜잭션 __start 추적 지점의 정의는 다음과 같습니다 아래 표시 :
정적 무효 startTransaction (void) ... /* * 새 트랜잭션 ID를 생성합니다 */ s- transactionId = getNewTransactionId (false); xactlocktableInsert (s- transactionId); pg_trace1 (transaction__start, s- transactionId); ...
트랜잭션 ID를 동적에 사용할 수있는 방법에 유의하십시오. 토토 핫 유틸리티.
동적 토토 핫 유틸리티를 사용하려면 더 이상 필요할 수 있습니다 이 토토 핫 지점을 정의하십시오. 예를 들어, DTRACE는 귀하를 요구합니다 파일에 새 프로브 추가SRC/백엔드/utils/probes.d여기에 표시된대로 :
제공자 PostgreSQL ... 프로브 트랜잭션 __start (int); ... ;
당신은 데이터 유형이 프로브 인수는 사용 된 변수의 데이터 유형과 일치합니다. 그만큼PG_TRACE매크로. 이것은 아닙니다 컴파일 시간에 확인. 새로 추가 된 것을 확인할 수 있습니다 추적 지점은 다시 컴파일 한 다음 새로운 것을 실행하여 사용할 수 있습니다. 바이너리 및 루트로 :와 같은 dtrace 명령을 실행합니다.
dtrace -l -n transaction -start