이 문서는 지원되지 않는 버전의 PostgreSQL을위한 것입니다.
당신은에 대해 같은 페이지를 볼 수 있습니다토토 사이트 순위 PostgreSQL : 문서 : 17 : 27.5. 동적 추적버전 또는 위에 나열된 다른 지원되는 버전 중 하나입니다.

26.4. 동적 추적

PostgreSQL제공 데이터베이스 서버의 동적 추적을 지원하는 시설. 이를 통해 외부 유틸리티를 특정 지점에서 호출 할 수 있습니다. 코드에서 추적 실행.

다수의 프로브 또는 추적 지점이 이미 삽입되었습니다. 소스 코드. 이 프로브는 데이터베이스에서 사용하기위한 것입니다 개발자 및 관리자. 기본적으로 프로브는 그렇지 않습니다 편집PostgreSQL; 그만큼 사용자는 구성 스크립트를 명시 적으로 알려 주어야합니다. 사용 가능한 롤 토토.

현재,dtrace유틸리티가 지원되며 사용 가능합니다 Opensolaris, Solaris 10 및 Mac OS X Leopard. 예상됩니다 그 dtrace는 미래에 freebsd와 아마도 다른 운영 체제. 그만큼SystemTapLinux의 프로젝트는 또한 DTRACE 동등한 것을 제공합니다. 지원 다른 동적 추적 유틸리티는 이론적으로 가능합니다 매크로의 정의 변경src/include/utils/probes.h.

26.4.1. 다이나믹을위한 컴파일 트레이싱

기본적으로 롤 토토를 사용할 수 없으므로 롤 토토를 작성하도록 구성 스크립트를 명시 적으로 알려줍니다 사용 가능postgresql. 에게 dtrace 지원 포함-enable-dtrace구성하려면. 보다섹션 15.5더 정보.

26.4.2. 내장 롤 토토

소스 코드에 여러 표준 롤 토토가 제공됩니다. 에 표시된대로표 26-3. 더 많은 추가가 추가 될 수 있습니다PostgreSQL의 관찰 가능성.

표 26-3. 내장 DTRACE 프로브

이름 매개 변수 설명
Transaction-Start (LocalTransactionID) 새로운 거래 시작시 발사되는 롤 토토. Arg0은 트랜잭션 ID입니다.
Transaction-Commit (LocalTransactionID) 트랜잭션이 완료되면 발사되는 롤 토토 성공적으로. Arg0은 트랜잭션 ID입니다.
Transaction-Abort (LocalTransactionID) 트랜잭션이 완료되면 발사되는 롤 토토 실패합니다. Arg0은 트랜잭션 ID입니다.
Query-Start (const char *) 쿼리 처리가있을 때 발생하는 롤 토토 시작. arg0은 쿼리 문자열입니다.
Query-done (const char *) 쿼리 처리가있을 때 발생하는 롤 토토 완벽한. arg0은 쿼리 문자열입니다.
Query-Parse-Start (const char *) 쿼리의 구문 분석이있을 때 발생하는 롤 토토 시작. arg0은 쿼리 문자열입니다.
Query-Parse-done (const char *) 쿼리의 구문 분석이있을 때 발사되는 롤 토토 완벽한. arg0은 쿼리 문자열입니다.
Query-Lewrite-Start (const char *) 쿼리를 다시 쓰면 발사되는 롤 토토 시작. arg0은 쿼리 문자열입니다.
Query-Lewrite-done (const char *) 쿼리를 다시 쓰면 발사되는 롤 토토 완벽한. arg0은 쿼리 문자열입니다.
Query-Plan-Start () 쿼리 계획이있을 때 발생하는 롤 토토 시작.
Query-Plan-done () 쿼리 계획이있을 때 발생하는 롤 토토 완벽한.
Query-Execute-Start () 쿼리 실행이있을 때 발생하는 롤 토토 시작.
query-execute-done () 쿼리 실행이있을 때 발생하는 롤 토토 완벽한.
State-Status (const char *) 서버 프로세스가 업데이트 될 때마다 발사되는 롤 토토 그것은pg_stat_activity.current_query상태. Arg0은입니다 새 상태 문자열.
Checkpoint-Start (int) 체크 포인트가 시작될 때 발사되는 롤 토토. Arg0 다른 것을 구별하는 데 사용되는 비트 깃발을 보유합니다 셧다운, 즉시 또는와 같은 체크 포인트 유형 힘.
Checkpoint-done (int, int, int, int, int) 체크 포인트가 완료되면 발사되는 프로브. (프로브는 다음으로 순서대로 나열되었습니다 체크 포인트 처리.) Arg0은 버퍼 수입니다 쓴. Arg1은 총 버퍼의 총 수입니다. arg2, Arg3 및 Arg4에는 추가 된 Xlog 파일의 수가 포함되어 있습니다. 각각 제거 및 재활용.
Clog-Checkpoint-Start (bool) 막힘 부분이 a 체크 포인트가 시작되었습니다. Arg0은 정상에 맞습니다 검사 점, 셧다운 체크 포인트의 거짓.
Clog-Checkpoint-Done (bool) 막힘 부분이 a 체크 포인트가 완료되었습니다. Arg0은 같은 의미를 갖습니다 막힘 체크 포인트 스타트 용
서브 트랜스-체크 포인트 스타트 (bool) 서브 트랜스 부분이 a 체크 포인트가 시작되었습니다. Arg0은 정상에 맞습니다 검사 점, 셧다운 체크 포인트의 거짓.
서브 트랜스-체크 포인트 도네 (bool) 서브 트랜스 부분이 a 체크 포인트가 완료되었습니다. Arg0은 같은 의미를 갖습니다 서브 트랜스 체크 포인트 시작.
Multixact-Checkpoint-Start (bool) 다단계 부분이있을 때 발사되는 롤 토토 체크 포인트가 시작되었습니다. Arg0은 정상에 맞습니다 검사 점, 셧다운 체크 포인트의 거짓.
Multixact-Checkpoint-Done (bool) a의 다중 공장 부분이있을 때 발사되는 프로브 체크 포인트가 완료되었습니다. Arg0은 같은 의미를 갖습니다 Multixact-Checkpoint-Start.
Buffer-Checkpoint-Start (int) 버퍼 작성 부분이 발생할 때 발사되는 롤 토토 체크 포인트가 시작되었습니다. Arg0은 비트 깃발을 담고 있습니다 다른 체크 포인트 유형을 구별하는 데 사용됩니다 셧다운, 즉각 또는 힘.
Buffer-Sync-Start (int, int) 더러운 글을 쓰기 시작할 때 발사되는 프로브 체크 포인트 중 버퍼 (확인 후 버퍼를 작성해야합니다). Arg0은 총 수입니다 버퍼. Arg1은 현재 더럽고 숫자입니다 작성해야합니다.
Buffer-Sync-Written (int) 각 버퍼가 작성된 후 발사되는 롤 토토 체크 포인트 중. Arg0은 ID의 ID 번호입니다 완충기.
Buffer-Sync-Done (int, int, int) 모든 더러운 버퍼가있을 때 발사되는 롤 토토 쓴. Arg0은 총 버퍼 수입니다. arg1입니다 실제로 작성된 버퍼 수 체크 포인트 프로세스. Arg2는 숫자입니다 작성 될 것으로 예상됩니다 (버퍼-동시-시작의 Arg1); 어느 차이는 다른 프로세스 플러싱 버퍼를 반영합니다 체크 포인트 중.
Buffer-Checkpoint-Sync-Start () 더러운 버퍼가 발생한 후 발사되는 롤 토토 커널에 작성되고 발행하기 전에 fsync 요청.
Buffer-Checkpoint-Done () 버퍼를 디스크에 동기화 할 때 발생하는 롤 토토 완벽한.
Twophase-Checkpoint-Start () a의 2 상 부분이있을 때 발사되는 롤 토토 체크 포인트가 시작되었습니다.
Twophase-Checkpoint-Done () a의 2 상 부분이있을 때 발사되는 롤 토토 체크 포인트가 완료되었습니다.
버퍼-읽기 시작 bool) 버퍼 읽기가 시작될 때 발사되는 롤 토토. Arg0 및 Arg1에는 포크 및 블록 번호가 포함됩니다. 페이지 (그러나 이것이 관계 인 경우 arg1은 -1입니다. 확장 요청). Arg2, arg3 및 arg4는 테이블 스페이스, 데이터베이스 및 관계 OID를 식별합니다 관계. Arg5는 로컬 버퍼의 경우 사실입니다. 공유 버퍼. Arg6은 관계 확장에 맞습니다 요청, 정상 읽기에 대한 거짓.
버퍼 읽기 도네 부, 부) 버퍼 읽기가 완료되면 발사되는 롤 토토. Arg0 및 Arg1에는 포크 및 블록 번호가 포함됩니다. 페이지 (이것이 관계 확장 요청 인 경우 Arg1 지금 새로 추가 된 블록의 블록 번호를 포함합니다). Arg2, Arg3 및 Arg4에는 테이블 스페이스, 데이터베이스, 관계를 식별하는 관계 OID. arg5입니다 로컬 버퍼의 경우, 공유 버퍼의 경우 False. Arg6은 관계 확장 요청, false에 대해 참입니다 정상적인 읽기. 버퍼가 발견되면 Arg7이 사실입니다 수영장에서, 그렇지 않으면 거짓.
버퍼-플러시 시작 (Forknumber, BlockNumber, OID, OID, OID) 쓰기 요청을 발행하기 전에 발사되는 롤 토토 공유 버퍼 용. Arg0 및 Arg1은 포크를 포함합니다 페이지 번호를 차단합니다. Arg2, Arg3 및 Arg4를 포함합니다 테이블 스페이스, 데이터베이스 및 관계 OID 식별 관계.
버퍼 플러시 도네 (Forknumber, BlockNumber, OID, OID, OID) 쓰기 요청이 완료되면 발사되는 롤 토토. (이것은 단지 데이터를 전달할 시간을 반영합니다. 커널에; 일반적으로 실제로 쓰여지지 않았습니다 아직 디스크에.) 인수는 버퍼 플러시 시작.
버퍼-쓰레기-디틀 스타트 (Forknumber, BlockNumber, OID, OID, OID) 서버 프로세스가 시작될 때 발사되는 롤 토토 더러운 버퍼를 작성하십시오. (이런 일이 자주 발생하면 암시한다shared_buffers너무 작거나 BGWriter 제어 매개 변수가 필요합니다 조정.) Arg0 및 Arg1에는 포크 및 블록이 포함되어 있습니다 페이지 번호. Arg2, arg3 및 arg4는 테이블 스페이스, 데이터베이스 및 관계 OID를 식별합니다 관계.
버퍼-쓰레기-다이틀 핀 (Forknumber, BlockNumber, OID, OID, OID) 더러운 버퍼 쓰기가있을 때 발사되는 롤 토토 완벽한. 인수는 동일합니다 버퍼 쓰레기-디르티티 스타트.
Wal-Buffer-Write-Dirty-Start () 서버 프로세스가 시작될 때 발생하는 롤 토토 더 이상 월 버퍼가 없기 때문에 더러운 월 버퍼를 작성하려면 공간을 사용할 수 있습니다. (이것이 자주 발생한다면, 그것은 암시합니다 저것Wal_buffers너무 작습니다.)
Wal-Buffer-Write-Dirty-done () 더러운 월 버퍼 쓰기가있을 때 발사되는 롤 토토 완벽한.
xlog-insert (서명되지 않은 문자, 부호없는 문자) WAL 레코드가 삽입 될 때 발사되는 롤 토토. ARG0은 레코드의 RESPARE MANAGER (RMID)입니다. ARG1에는 정보 플래그가 포함되어 있습니다.
xlog-switch () WAL 세그먼트 스위치가있을 때 발사되는 롤 토토 요청.
smgr-md-Read-Start 블록을 읽기 시작할 때 발사되는 롤 토토 관계에서. Arg0 및 Arg1은 포크를 포함합니다 페이지 번호를 차단합니다. Arg2, Arg3 및 Arg4를 포함합니다 테이블 스페이스, 데이터베이스 및 관계 OID 식별 관계.
smgr-md-Read-done int) 블록 읽기가 완료되면 발사되는 롤 토토. Arg0 및 Arg1에는 포크 및 블록 번호가 포함됩니다. 페이지. Arg2, Arg3 및 Arg4에는 테이블 스페이스가 포함되어 있습니다. 데이터베이스 및 관계를 식별하는 관계 OID. Arg5는 실제로 읽는 바이트 수이며 Arg6 요청한 번호입니다 (이 경우 다른 경우 문제를 나타냅니다).
SMGR-MD-WRITE- 시작 (Forknumber, BlockNumber, OID, OID, OID) 블록을 쓰기 시작할 때 발사되는 롤 토토 관계. Arg0 및 Arg1에는 포크 및 블록이 포함되어 있습니다 페이지 번호. Arg2, arg3 및 arg4는 테이블 스페이스, 데이터베이스 및 관계 OID를 식별합니다 관계.
SMGR-MD-WRITE-DONE int) 블록 쓰기가 완료되면 발사되는 롤 토토. Arg0 및 Arg1에는 포크 및 블록 번호가 포함됩니다. 페이지. Arg2, Arg3 및 Arg4에는 테이블 스페이스가 포함되어 있습니다. 데이터베이스 및 관계를 식별하는 관계 OID. Arg5는 실제로 작성된 바이트 수입니다 arg6은 요청한 숫자입니다 (이것들이 다른 경우 문제를 나타냅니다).
Sort-St-Start (int, bool, int, int, bool) 정렬 작업이 시작될 때 발사되는 롤 토토. Arg0은 힙, 인덱스 또는 데이텀 정렬을 나타냅니다. Arg1은 사실입니다 고유 한 가치 집행을 위해. Arg2는 키 수입니다 열. Arg3은 작업 메모리의 킬로바이트 수입니다 허용된. 무작위로 정렬에 액세스하면 Arg4가 사실입니다 결과가 필요합니다.
Sort-done (bool, lo롤 토토) 정렬이 완료되면 발사되는 롤 토토. Arg0입니다 외부 정렬의 경우, 내부 정렬의 경우 FALSE. arg1 외부 정렬에 사용되는 디스크 블록의 수입니다. 또는 내부 정렬에 사용되는 메모리의 킬로바이트.
LWLOCK-ACQUIRE (lwlockid, lwlockmode) LWLOCK을 인수했을 때 발사되는 롤 토토. Arg0은 LWLOCK의 ID입니다. Arg1은 요청 된 잠금 장치입니다 독점 또는 공유 모드.
LWLOCK-RELEASE (lwlockid) LWLOCK이 출시 될 때 발사되는 롤 토토 (그러나 석방 된 웨이터는 아직 깨어났다). Arg0은 LWLOCK의 ID입니다.
lwlock-wait-start (lwlockid, lwlockmode) LWLOCK이 즉시 없을 때 발사되는 롤 토토 사용 가능하고 서버 프로세스가 기다리기 시작했습니다. 사용 가능한 자물쇠. Arg0은 LWLOCK의 ID입니다. Arg1은 요청 된 잠금 모드 (독점 또는)입니다 공유.
LWLOCK-WAIT-DONE (lwlockid, lwlockmode) 서버 프로세스가있을 때 발사되는 롤 토토 LWLOCK의 대기에서 풀려 나서 실제로 잠금 장치가 있습니다). Arg0은 LWLOCK의 ID입니다. Arg1은 요청 된 잠금 모드 (독점 또는)입니다 공유.
LWLOCK-CONDACQUIRE (lwlockid, lwlockmode) LWLOCK이 성공적으로 발생했을 때 발사되는 롤 토토 발신자가 대기하지 않으면 획득했습니다. Arg0입니다 LWLOCK의 ID. Arg1은 요청 된 잠금 모드이며 독점적이거나 공유.
LWLOCK-CONDACQUIRE-FAIL (lwlockid, lwlockmode) LWLOCK이 아닌 경우 발사되는 롤 토토 발신자가 NO를 지정했을 때 성공적으로 획득했습니다 대기 중. Arg0은 LWLOCK의 ID입니다. Arg1이 요청 된 것입니다 잠금 모드, 독점 또는 공유.
Lock-Wait-Start (서명되지 않은 int, 서명되지 않은 int, 서명되지 않은 int, 부호없는 int, 부호없는 int, lockmode) 헤비급 요청시 발사되는 롤 토토 잠금 (LMGR 잠금)은 잠금이이기 때문에 대기하기 시작했습니다. 사용할 수 없습니다. Arg3을 통한 Arg0은 태그 필드입니다 잠긴 물체를 식별합니다. arg4를 나타냅니다 잠긴 물체의 유형. Arg5는 잠금을 나타냅니다 요청중인 유형.
Lock-Wait-Done (서명되지 않은 int, 서명되지 않은 int, 서명되지 않은 int, 부호없는 int, 부호없는 int, lockmode) 헤비급 요청시 발사되는 롤 토토 잠금 (LMGR 잠금)은 대기를 마쳤습니다 (즉, 자물쇠를 획득했습니다). 인수는 동일합니다 자물쇠-시작.
교착 상태 () 교착 상태가 발견 될 때 발사되는 프로브 교착 상태 탐지기.

표 26-4. 프로브에 사용 된 정의 유형 매개 변수

타입 정의
LocalTransactionID 서명되지 않은 int
lwlockid int
lwlockmode int
Lockmode int
BlockNumber 서명되지 않은 int
OID 서명되지 않은 int
Forknumber int
bool char

26.4.3. 롤 토토 사용

아래 예제는 분석을위한 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 스크립트는 그러한 출력을 제공합니다 처럼:

# ./txn_count.d` pgrep -n postgres` 또는 ./txn_count.d <pid
^c

시작 71
커밋 70
총 시간 (NS) 2312105013

참고 :SystemTap은 다른 표기법을 사용합니다 기본이지만 dtrace보다 스크립트를 추적합니다 추적 지점은 호환됩니다. 주목할만한 한 가지 요점은 그 것입니다 이 쓰기에서 SystemTap 스크립트는 프로브를 참조해야합니다 하이픈 대신 이중 밑줄을 사용하는 이름. 이것은 향후 SystemTap 릴리스에서 고정 될 것으로 예상됩니다.

dtrace 스크립트가 신중하게해야한다는 것을 기억해야합니다. 서면 및 디버깅, 그렇지 않으면 수집 된 추적 정보 의미가 없을 수도 있습니다. 문제가 발견되는 대부분의 경우 기본이 아니라 잘못된 계측입니다. 체계. Dynamic을 사용하여 발견 된 정보를 논의 할 때 추적, 스크립트를 허용하는 데 사용하는 스크립트를 반드시 동봉하십시오. 점검하고 논의 할 것입니다.

더 많은 예제 스크립트는 pgfoundry에서 찾을 수 있습니다dtrace 프로젝트.

26.4.4. 새 프로브 정의

새로운 프로브는 어디에서나 코드 내에서 정의 될 수 있습니다. 개발자는 요청하지만, 이는 재 컴파일이 필요합니다. 다음은 새 프로브를 삽입하는 단계입니다.

  1. 사용 가능한 프로브 이름 및 데이터 결정 프로브를 통해

  2. 프로브 정의 추가SRC/백엔드/utils/probes.d

  3. 포함pg_trace.h프로브를 포함하는 모듈에 아직 존재하지 않습니다 포인트 및 삽입trace_postgresql소스 코드의 원하는 위치

  4. 다시 컴파일하고 새 롤 토토가 있는지 확인하십시오 사용 가능

예 :여기에 추가 방법의 예가 있습니다. 거래 ID에 의해 모든 새로운 트랜잭션을 추적하는 롤 토토

  1. 프로브의 이름이 지정 될 것이라고 결정거래 시작매개 변수가 필요합니다 LocalTransactionID 형식

  2. 프로브 정의 추가SRC/백엔드/utils/probes.d:

    Probe Transaction__start (localTransactionId);

    프로브의 이중 밑줄 사용에 유의하십시오. 이름. 프로브를 사용하여 dtrace 스크립트에서 더블 밑줄을 하이픈으로 교체해야하므로트랜잭션 시작이름입니다 사용자를위한 문서.

  3. 컴파일 시간에Transaction__start는 매크로로 변환됩니다 라고 불리는trace_postgresql_transaction_start(통지 밑줄은 여기에서 단일입니다) 포함pg_trace.h. 추가 매크로 소스의 적절한 위치로 호출합니다 암호. 이 경우 다음과 같습니다.

    TRACE_POSTGRESQL_TRANSACTION_START (VXID.localTransactionId);
  4. 새 바이너리를 다시 컴파일하고 실행 한 후 확인하십시오 새로 추가 된 롤 토토는 DTRACE 명령을 따릅니다. 당신은 비슷하게 보일 것입니다 산출:

    # dtrace -ln transaction -start
       ID 제공자 모듈 함수 이름
    18705 PostgreSQL49878 Postgres StartTransactionCommand Transaction-Start
    18755 PostgreSQL49877 Postgres StartTransactionCommand Transaction-Start
    18805 PostgreSQL49876 Postgres StartTransactionCommand Transaction-Start
    18855 PostgreSQL49875 Postgres StartTransactionCommand Transaction-Start
    18986 PostgresQL49873 Postgres StartTransactionCommand Transaction-Start

추적을 추가 할 때 조심해야 할 몇 가지가 있습니다. C 코드에 대한 매크로 :

  • 당신은 데이터 유형이 프로브의 매개 변수는 변수의 데이터 유형과 일치합니다 매크로에서 사용됩니다. 그렇지 않으면 편집을받습니다 오류.

  • 대부분의 플랫폼에서, ifPostgreSQL-enable-dtrace, 추적에 대한 인수 매크로는 제어가 통과 할 때마다 평가됩니다 매크로,아니요 추적이 이루어지고 있습니다. 이것은 일반적으로 가치가 없습니다 당신이 단지 값을보고하는지 걱정하고 있습니다. 로컬 변수는 거의 없습니다. 그러나 비싸지 않도록주의하십시오 기능은 인수로 호출됩니다. 그렇게해야한다면 수표로 매크로를 보호하는 것을 고려하여 추적은 실제로 활성화되어 있습니다 :

    if (trace_postgresql_transaction_start_enabled ())
            trace_postgresql_transaction_start (some_function (...));

    각 트레이스 매크로는 해당입니다.활성화매크로.