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

27.5. 동적 추적

postgresql데이터베이스 서버의 동적 추적을 지원하는 시설을 제공합니다. 이를 통해 외부 유틸리티가 코드의 특정 지점에서 호출되어 추적 실행이 가능합니다.

다수의 프로브 또는 추적 지점이 이미 소스 코드에 삽입되어 있습니다. 이 프로브는 데이터베이스 개발자 및 관리자가 사용하기위한 것입니다. 기본적으로 프로브가 컴파일되지 않습니다PostgreSQL; 사용자는 배트맨 토토를 사용할 수 있도록 구성 스크립트를 명시 적으로 알려야합니다.

현재,dtrace유틸리티가 지원되며,이 글을 쓰는 시점에서 Solaris, MacOS, FreeBSD, NetBSD 및 Oracle Linux에서 구입할 수 있습니다. 그만큼SystemTapLinux의 프로젝트는 DTRACE 동등한 것을 제공하며 사용할 수 있습니다. Macros의 정의를 변경하여 다른 동적 추적 유틸리티를 지원하는 것은 이론적으로 가능합니다.src/include/utils/probes.h.

27.5.1. 동적 추적을위한 컴파일

기본적으로 배트맨 토토를 사용할 수 없으므로 배트맨 토토를 사용할 수 있도록 구성 스크립트를 명시 적으로 알려야합니다postgresql. DTRACE 지원을 포함하려면-enable-dtrace구성하려면. 보다PostgreSQL : 문서 : 12 : 16.4. 롤 토토 절차자세한 내용은

27.5.2. 내장 배트맨 토토

여러 표준 배트맨 토토가 소스 코드에 제공됩니다.표 27.28;표 27.29배트맨 토토에 사용 된 유형이 표시됩니다. 더 많은 배트맨 토토가 확실히 추가 될 수 있습니다PostgreSQL의 관찰 가능성.

표 27.28. 내장 DTRACE 프로브

이름 매개 변수 설명
Transaction-Start (LocalTransactionID) 새로운 거래 시작시 발사되는 배트맨 토토. Arg0은 트랜잭션 ID입니다.
트랜잭션 커미트 (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.상태. Arg0은 새로운 상태 문자열입니다.
Checkpoint-Start (int) 체크 포인트가 시작될 때 발사되는 배트맨 토토. Arg0은 셧다운, 즉각 또는 힘과 같은 다른 체크 포인트 유형을 구별하는 데 사용되는 비트 플래그를 보유합니다.
Checkpoint-done (int, int, int, int, int) 체크 포인트가 완료되면 발사되는 프로브. (체크 포인트 처리 중에 다음 화재를 순서대로 나열된 프로브.) Arg0은 작성된 버퍼의 수입니다. Arg1은 총 버퍼의 총 수입니다. Arg2, Arg3 및 Arg4는 각각 추가, 제거 및 재활용 된 WAL 파일의 수를 포함합니다.
Clog-Checkpoint-Start (bool) 체크 포인트의 막힘 부분이 시작될 때 발사되는 배트맨 토토. Arg0은 정상 체크 포인트에 대해 참입니다. 셧다운 체크 포인트의 경우
Clog-Checkpoint-Done (bool) 체크 포인트의 막힘 부분이 완료되면 발사되는 배트맨 토토. Arg0은와 같은 의미를 갖습니다.Clog-Checkpoint-Start.
서브 트랜스 체크 포인트 스타트 (bool) 체크 포인트의 서브 트랜스 부분이 시작될 때 발사되는 배트맨 토토. Arg0은 정상 체크 포인트에 대해 참입니다. 셧다운 체크 포인트의 경우
서브 트랜스-체크 포인트 도네 (bool) 체크 포인트의 서브 트랜스 부분이 완료되면 발사되는 배트맨 토토. Arg0은와 같은 의미를 갖습니다.서브 트랜스-체크 포인트 스타트.
Multixact-Checkpoint-Start (bool) 체크 포인트의 다단계 부분이 시작될 때 발사되는 배트맨 토토. Arg0은 정상 체크 포인트에 대해 참입니다. 셧다운 체크 포인트의 경우
Multixact-Checkpoint-Done (bool) 체크 포인트의 다단계 부분이 완료되면 발사되는 배트맨 토토. Arg0은와 같은 의미를 갖습니다.Multixact-Checkpoint-Start.
Buffer-Checkpoint-Start (int) 체크 포인트의 버퍼 작성 부분이 시작될 때 발사되는 배트맨 토토. Arg0은 셧다운, 즉각 또는 힘과 같은 다른 체크 포인트 유형을 구별하는 데 사용되는 비트 플래그를 보유합니다.
Buffer-Sync-Start (int, int) 체크 포인트 중에 더러운 버퍼를 쓰기 시작할 때 발사되는 프로브 (어떤 버퍼를 작성 해야하는지 확인한 후). Arg0은 총 버퍼 수입니다. Arg1은 현재 더럽고 작성해야 할 번호입니다.
Buffer-Sync-Written (int) 체크 포인트 중에 각 버퍼가 작성된 후 발사되는 배트맨 토토. Arg0은 버퍼의 ID 번호입니다.
Buffer-Sync-done (int, int, int) 모든 더러운 버퍼가 작성되었을 때 발사되는 배트맨 토토. Arg0은 총 버퍼 수입니다. ARG1은 실제로 체크 포인트 프로세스에서 작성한 버퍼 수입니다. arg2는 작성 될 것으로 예상되는 숫자입니다 (arg1 ofBuffer-Sync-Start); 모든 차이는 검사 점에서 다른 프로세스 플러싱 버퍼를 반영합니다.
Buffer-Checkpoint-Sync-Start () 더러운 버퍼가 커널에 쓰여진 후 발사되는 배트맨 토토와 fsync 요청을 시작하기 전에..
버퍼-체크 포인트 도네 () 버퍼를 디스크에 동기화 할 때 발생하는 배트맨 토토.
Twophase-Checkpoint-Start () 체크 포인트의 2 상 부분이 시작될 때 발사되는 배트맨 토토.
Twophase-Checkpoint-done () 체크 포인트의 2 상 부분이 완료되면 발사되는 배트맨 토토.
버퍼 읽기 시작 (Forknumber, BlockNumber, OID, OID, OID, Int, BOOL) 버퍼 읽기가 시작될 때 발사되는 배트맨 토토. Arg0 및 Arg1에는 페이지의 포크 및 블록 번호가 포함되어 있지만 관계 확장 요청이면 -1이됩니다). Arg2, Arg3 및 Arg4에는 테이블 스페이스, 데이터베이스 및 관계를 식별하는 관계 OID가 포함되어 있습니다. Arg5는 로컬 버퍼의 임시 관계를 생성 한 백엔드의 ID입니다.invalidbackendid23680_23778
버퍼 읽기 도네 (Forknumber, BlockNumber, OID, OID, OID, Int, BOOL, BOOL) 버퍼 읽기가 완료되면 발사되는 배트맨 토토. Arg0 및 Arg1에는 페이지의 포크 및 블록 번호가 포함되어 있습니다 (관계 확장 요청 인 경우 Arg1은 이제 새로 추가 된 블록의 블록 번호를 포함합니다). Arg2, Arg3 및 Arg4에는 테이블 스페이스, 데이터베이스 및 관계를 식별하는 관계 OID가 포함되어 있습니다. Arg5는 로컬 버퍼의 임시 관계를 생성 한 백엔드의 ID입니다.invalidbackendid24461_24623
버퍼-플러시 시작 (Forknumber, BlockNumber, OID, OID, OID) 공유 버퍼에 대한 쓰기 요청을 발행하기 전에 발사되는 배트맨 토토. Arg0 및 Arg1에는 페이지의 포크 및 블록 번호가 포함되어 있습니다. Arg2, Arg3 및 Arg4에는 테이블 스페이스, 데이터베이스 및 관계를 식별하는 관계 OID가 포함되어 있습니다.
버퍼 플러시 도네 (Forknumber, BlockNumber, OID, OID, OID) 쓰기 요청이 완료되면 발사되는 배트맨 토토. (이것은 단지 데이터를 커널에 전달할 시간을 반영합니다. 일반적으로 아직 실제로 디스크에 기록되지 않았습니다.) 인수는와 동일합니다.버퍼 플러시 스타트.
버퍼-쓰레기-디르티티 스타트 (Forknumber, BlockNumber, OID, OID, OID) 서버 프로세스가 더러운 버퍼를 쓰기 시작하면 발사되는 배트맨 토토. (이런 일이 자주 발생하면shared_buffers너무 작거나 배경 작성자 제어 매개 변수는 조정이 필요합니다.) Arg0 및 Arg1에는 페이지의 포크 및 블록 번호가 포함되어 있습니다. Arg2, Arg3 및 Arg4에는 테이블 스페이스, 데이터베이스 및 관계를 식별하는 관계 OID가 포함되어 있습니다.
버퍼-쓰레기-디티 폰 (Fornumber, BlockNumber, OID, OID, OID) 더러운 버퍼 쓰기가 완료되면 발사되는 배트맨 토토. 인수는와 동일합니다.버퍼-쓰레기-디틀 스타트.
Wal-Buffer-Write-Dirty-Start () 서버 프로세스가 더 이상 월 버퍼 공간을 사용할 수 없기 때문에 서버 프로세스가 더러운 월 버퍼를 쓰기 시작하면 발사되는 배트맨 토토. (이런 일이 자주 발생하면Wal_buffers너무 작습니다.)
Wal-Buffer-Write-Dirty-done () 더러운 월 버퍼 쓰기가 완료되면 발사되는 배트맨 토토.
WAL-INSERT (서명되지 않은 숯, 부호없는 문자) WAL 레코드가 삽입 될 때 발사되는 배트맨 토토. ARG0은 레코드의 RESPARE MANAGER (RMID)입니다. ARG1에는 정보 플래그가 포함되어 있습니다.
Wal-Switch () WAL 세그먼트 스위치가 요청 될 때 발사되는 배트맨 토토.
smgr-md-Read-Start (Forknumber, BlockNumber, OID, OID, OID, Int) 관계에서 블록을 읽기 시작할 때 발사되는 배트맨 토토. Arg0 및 Arg1에는 페이지의 포크 및 블록 번호가 포함되어 있습니다. Arg2, Arg3 및 Arg4에는 테이블 스페이스, 데이터베이스 및 관계를 식별하는 관계 OID가 포함되어 있습니다. Arg5는 로컬 버퍼의 임시 관계를 생성 한 백엔드의 ID입니다.invalidbackendid(-1) 공유 버퍼의 경우
smgr-md-Read-done (Forknumber, BlockNumber, OID, OID, OID, Int, Int, Int) 블록 읽기가 완료되면 발사되는 배트맨 토토. Arg0 및 Arg1에는 페이지의 포크 및 블록 번호가 포함되어 있습니다. Arg2, Arg3 및 Arg4에는 테이블 스페이스, 데이터베이스 및 관계를 식별하는 관계 OID가 포함되어 있습니다. Arg5는 로컬 버퍼의 임시 관계를 생성 한 백엔드의 ID입니다.invalidbackendid29056_29209
SMGR-MD-WRITE- 시작 (Forknumber, BlockNumber, OID, OID, OID, Int) 관계에 블록을 쓰기 시작할 때 발사되는 배트맨 토토. Arg0 및 Arg1에는 페이지의 포크 및 블록 번호가 포함되어 있습니다. Arg2, Arg3 및 Arg4에는 테이블 스페이스, 데이터베이스 및 관계를 식별하는 관계 OID가 포함되어 있습니다. Arg5는 로컬 버퍼의 임시 관계를 생성 한 백엔드의 ID입니다.invalidbackendid(-1) 공유 버퍼의 경우
SMGR-MD-WRITE-DONE 29973_30030 블록 쓰기가 완료되면 발사되는 배트맨 토토. Arg0 및 Arg1에는 페이지의 포크 및 블록 번호가 포함되어 있습니다. Arg2, Arg3 및 Arg4에는 테이블 스페이스, 데이터베이스 및 관계를 식별하는 관계 OID가 포함되어 있습니다. Arg5는 로컬 버퍼의 임시 관계를 생성 한 백엔드의 ID입니다.invalidbackendid30403_30559
sort-start (int, bool, int, int, bool, int) 정렬 작업이 시작될 때 발사되는 배트맨 토토. Arg0은 힙, 인덱스 또는 데이텀 정렬을 나타냅니다. ARG1은 고유 한 가치 시행에 해당됩니다. Arg2는 키 열의 수입니다. Arg3은 허용되는 작업 메모리의 킬로바이트 수입니다. 정렬 결과에 대한 임의의 액세스가 필요한 경우 ARG4가 사실입니다. arg5는 시리얼을 나타냅니다.0, 병렬 작업자1또는 Parallel Leader2.
Sort-Done (bool, long) 정렬이 완료되면 발사되는 배트맨 토토. ARG0은 외부 정렬에 맞으며 내부 정렬의 경우 FALSE입니다. Arg1은 외부 정렬에 사용되는 디스크 블록 또는 내부 정렬에 사용되는 킬로바이트의 수입니다.
LWLOCK-ACQUIRE (char *, lwlockmode) LWLOCK을 인수했을 때 발사되는 배트맨 토토. Arg0은 LWLOCK의 트랜치입니다. Arg1은 독점적이거나 공유 된 요청 된 잠금 모드입니다.
LWLOCK-RELEASE (char *) LWLOCK이 풀려 났을 때 발사되는 배트맨 토토 (그러나 출시 된 웨이터는 아직 깨어나지 않았다는 점에 유의하십시오). Arg0은 LWLOCK의 트랜치입니다.
lwlock-wait-start (char *, lwlockmode) LWLOCK을 즉시 사용할 수없고 서버 프로세스가 잠금을 사용할 수있을 때까지 기다리기 시작했습니다. Arg0은 LWLOCK의 트랜치입니다. Arg1은 독점적이거나 공유 된 요청 된 잠금 모드입니다.
LWLOCK-WAIT-DONE (char *, lwlockmode) 서버 프로세스가 LWLOCK 대기에서 해제되었을 때 발사되는 배트맨 토토 (실제로 잠금 장치가 없음). Arg0은 LWLOCK의 트랜치입니다. Arg1은 독점적이거나 공유 된 요청 된 잠금 모드입니다.
lwlock-condacquire (char *, lwlockmode) 발신자가 대기하지 않으면 LWLOCK을 성공적으로 획득했을 때 발사되는 배트맨 토토. Arg0은 LWLOCK의 트랜치입니다. Arg1은 독점적이거나 공유 된 요청 된 잠금 모드입니다.
LWLOCK-CONDACQUIRE-FAIL (char *, lwlockmode) 발신자가 대기하지 않으면 LWLOCK을 성공적으로 얻지 못했을 때 발사되는 배트맨 토토. Arg0은 LWLOCK의 트랜치입니다. 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 잠금)이 대기를 완료했을 때 (즉, 잠금을 인수 함) 발사되는 배트맨 토토. 인수는와 동일합니다.Lock-Wait-Start.
교착 상태 () 교착 상태 감지기가 교착 상태를 발견했을 때 발사되는 프로브.

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

타입 정의
LocalTransactionID 부호없는 int
lwlockmode int
Lockmode int
BlockNumber 서명되지 않은 int
OID 서명되지 않은 int
Forknumber int
bool 부호없는 char

27.5.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

Note

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

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

27.5.4. 새 프로브 정의

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

  1. 프로브를 통해 제공 할 프로브 이름과 데이터 결정

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

  3. 포함pg_trace.h프로브 포인트가 포함 된 모듈에 아직 존재하지 않는 경우trace_postgresql소스 코드의 원하는 위치에있는 매크로를 배트맨 토토 매크로

  4. 새로운 배트맨 토토를 사용할 수 있는지 확인하고 확인

예 :거래 ID를 통해 모든 새로운 트랜잭션을 추적하기 위해 배트맨 토토를 추가하는 방법의 예가 있습니다.

  1. 프로브의 이름이 지정 될 것이라고 결정Transaction-Start유형의 매개 변수가 필요합니다LocalTransactionID

  2. 프로브 정의 추가src/backend/utils/probes.d:

    Probe Transaction__Start (localTransactionId);

    프로브 이름의 이중 밑줄을 사용하십시오. 프로브를 사용하는 dtrace 스크립트에서 이중 밑줄을 하이픈으로 교체해야하므로Transaction-Start사용자를 위해 문서화 할 이름입니다.

  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 (...));

    각 트레이스 매크로에는 해당활성화매크로.