개발 버전 :Devel
지원되지 않는 버전 :12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2

28.5. 동적 추적

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

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

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

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

기본적으로 범퍼카 토토를 사용할 수 없으므로 범퍼카 토토를 사용할 수 있도록 스크립트 구성을 명시 적으로 알려야합니다PostgreSQL. DTRACE 지원을 포함하려면-enable-dtrace구성합니다. 보다PostgreSQL : 문서 : 14 : 17.4. 토토 커뮤니티 절차자세한 내용은

28.5.2. 내장 범퍼카 토토

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

표 28.45. 내장 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 () 쿼리 실행이 완료되면 발사되는 범퍼카 토토.
Statement-Status (const char *) 서버 프로세스가 업데이트 될 때마다 발사되는 범퍼카 토토pg_stat_activity.상태. Arg0은 새로운 상태 문자열입니다.
Checkpoint-Start (int) 체크 포인트가 시작될 때 발사되는 범퍼카 토토. Arg0은 셧다운, 즉각 또는 힘과 같은 다른 체크 포인트 유형을 구별하는 데 사용되는 비트 플래그를 보유합니다.
Checkpoint-done (int, int, int, int, int) 체크 포인트가 완료되면 발사되는 프로브. (체크 포인트 처리 중에 다음 화재를 순서대로 나열된 프로브.) Arg0은 작성된 버퍼의 수입니다.
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은 총 버퍼 수입니다.
Buffer-Sync-Written (int) 체크 포인트 중에 각 버퍼가 작성된 후 발사되는 범퍼카 토토. Arg0은 버퍼의 ID 번호입니다.
Buffer-Sync-done (int, int, int) 모든 더러운 버퍼가 작성되었을 때 발사되는 범퍼카 토토. Arg0은 총 버퍼 수입니다.Buffer-Sync-Start); 모든 차이는 검사 점에서 다른 프로세스 플러싱 버퍼를 반영합니다.
Buffer-Checkpoint-Sync-Start () 더러운 버퍼가 커널에 쓰여진 후 발사되는 범퍼카 토토, 그리고 fsync 요청을 시작하기 전에.
Buffer-Checkpoint-Done () 버퍼를 디스크에 동기화 할 때 발생하는 범퍼카 토토.
Twophase-Checkpoint-Start () 체크 포인트의 2 상 부분이 시작될 때 발사되는 범퍼카 토토.
Twophase-Checkpoint-Done () 체크 포인트의 2 상 부분이 완료되면 발사되는 범퍼카 토토.
버퍼 읽기 시작 (Forknumber, BlockNumber, OID, OID, OID, Int, BOOL) 버퍼 읽기가 시작될 때 발사되는 범퍼카 토토. Arg0 및 Arg1에는 페이지의 포크 및 블록 번호가 포함되어 있지만 관계 확장 요청이면 -1이됩니다).invalidbackendid(-1) 공유 버퍼. arg6은 관계 확장 요청에 대해 참입니다. 정상 읽기의 경우
버퍼 읽기 도네 (Forknumber, BlockNumber, OID, OID, OID, Int, BOOL, BOOL) 버퍼 읽기가 완료되면 발사되는 범퍼카 토토. Arg0 및 Arg1에는 페이지의 포크 및 블록 번호가 포함되어 있습니다 (관계 확장 요청 인 경우 Arg1은 이제 새로 추가 된 블록의 블록 번호를 포함합니다).invalidbackendid21562_21721
버퍼-플러시 시작 공유 버퍼에 대한 쓰기 요청을 발행하기 전에 발사되는 범퍼카 토토. Arg0 및 Arg1에는 페이지의 포크 및 블록 번호가 포함되어 있습니다.
버퍼 플러시 도네 쓰기 요청이 완료되면 발사되는 범퍼카 토토. (이것은 단지 데이터를 커널에 전달할 시간을 반영합니다. 일반적으로 아직 실제로 디스크에 기록되지 않았습니다.) 인수는와 동일합니다.버퍼-플러시 시작.
버퍼-쓰레기-디르티티 스타트 서버 프로세스가 더러운 버퍼를 쓰기 시작하면 발사되는 범퍼카 토토. (이런 일이 자주 발생하면shared_buffers너무 작거나 배경 작성자 제어 매개 변수는 조정이 필요합니다.) Arg0 및 Arg1에는 페이지의 포크 및 블록 번호가 포함되어 있습니다. Arg2, Arg3 및 Arg4에는 테이블 스페이스, 데이터베이스 및 관계를 식별하는 관계 OID가 포함되어 있습니다.
Buffer-Write-Dirty-done 더러운 버퍼 쓰기가 완료되면 발사되는 범퍼카 토토. 인수는와 동일합니다.버퍼-쓰레기-디르티티 스타트.
Wal-Buffer-Write-Dirty-Start () 서버 프로세스가 더 이상 월 버퍼 공간을 사용할 수 없기 때문에 서버 프로세스가 더러운 월 버퍼를 쓰기 시작하면 발사되는 범퍼카 토토. (이런 일이 자주 발생하면Wal_buffers너무 작습니다.)
Wal-Buffer-Write-Dirty-done () Dirty Wal 버퍼 쓰기가 완료되면 발사되는 범퍼카 토토.
Wal-Insert (서명되지 않은 문자, 부호없는 문자) WAL 레코드가 삽입 될 때 발사되는 범퍼카 토토. ARG0은 레코드의 RESPARE MANAGER (RMID)입니다.
Wal-Switch () WAL 세그먼트 스위치가 요청 될 때 발생하는 범퍼카 토토.
smgr-md-Read-Start (Fornumber, BlockNumber, OID, OID, OID, Int) 관계에서 블록을 읽기 시작할 때 발사되는 범퍼카 토토. Arg0 및 Arg1에는 페이지의 포크 및 블록 번호가 포함되어 있습니다.invalidbackendid(-1) 공유 버퍼의 경우
smgr-md-Read-done (Fornumber, BlockNumber, OID, OID, OID, Int, Int, Int) 블록 읽기가 완료되면 발사되는 범퍼카 토토. Arg0 및 Arg1에는 페이지의 포크 및 블록 번호가 포함되어 있습니다.invalidbackendid24620_24770
SMGR-MD-WRITE-Start (Fornumber, BlockNumber, OID, OID, OID, Int) 관계에 블록을 쓰기 시작할 때 발사되는 범퍼카 토토. Arg0 및 Arg1에는 페이지의 포크 및 블록 번호가 포함되어 있습니다.invalidbackendid(-1) 공유 버퍼의 경우
SMGR-MD-WRITE-DONE (Fornumber, BlockNumber, OID, OID, OID, Int, Int, Int) 블록 쓰기가 완료되면 발사되는 범퍼카 토토. Arg0 및 Arg1에는 페이지의 포크 및 블록 번호가 포함되어 있습니다.invalidbackendid25374_25527
정렬 시작 (int, bool, int, int, bool, int) 정렬 작업이 시작될 때 발사되는 범퍼카 토토. Arg0은 힙, 인덱스 또는 데이텀 정렬을 나타냅니다.0, 평행 작업자1또는 Parallel Leader2.
Sort-Done (bool, long) 정렬이 완료되면 발사되는 범퍼카 토토. ARG0은 외부 정렬에 맞으며 내부 정렬의 경우 FALSE입니다.
lwlock-acquire (char *, lwlockmode) LWLOCK을 인수했을 때 발사되는 범퍼카 토토. Arg0은 LWLOCK의 트랜치입니다.
LWLOCK-RELEASE (char *) LWLOCK이 풀려 났을 때 발사되는 범퍼카 토토 (그러나 출시 된 웨이터는 아직 깨어나지 않았다는 점에 유의하십시오). Arg0은 LWLOCK의 트랜치입니다.
LWLOCK-WAIT-Start (char *, lwlockmode) LWLOCK을 즉시 사용할 수없고 서버 프로세스가 잠금을 사용할 수있을 때까지 기다리기 시작했습니다. Arg0은 LWLOCK의 트랜치입니다.
LWLOCK-WAIT-DONE (char *, lwlockmode) 서버 프로세스가 LWLOCK 대기에서 해제되었을 때 발사되는 범퍼카 토토 (실제로 잠금 장치가 없음). Arg0은 LWLOCK의 트랜치입니다.
LWLOCK-CONDACQUIRE (char *, lwlockmode) 발신자가 대기하지 않으면 LWLOCK을 성공적으로 취득했을 때 발사되는 범퍼카 토토. Arg0은 LWLOCK의 트랜치입니다.
LWLOCK-CONDACQUIRE-FAIL (char *, lwlockmode) 발신자가 대기하지 않으면 LWLOCK을 성공적으로 얻지 못했을 때 발사되는 범퍼카 토토. Arg0은 LWLOCK의 트랜치입니다.
Lock-Wait-Start (부호없는 int, 부호없는 int, 부호없는 int, 부호없는 int, 부호없는 int, lockmode) 잠금 잠금 장치 (LMGR 잠금)에 대한 요청이 잠금을 사용할 수 없기 때문에 대기하기 시작했을 때 발사되는 범퍼카 토토. Arg3을 통한 Arg0은 잠금되는 물체를 식별하는 태그 필드입니다.
Lock-Wait-Done (부호없는 int, 부호없는 int, 부호없는 int, 부호없는 int, 부호없는 int, lockmode) 헤비급 잠금 요청 (LMGR 잠금)이 대기를 완료했을 때 (즉, 잠금을 인수 함) 발사되는 범퍼카 토토. 인수는와 동일합니다.Lock-Wait-Start.
교착 상태 () 교착 상태 탐지기가 교착 상태를 발견했을 때 발사되는 프로브.

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

타입 정의
LocalTransactionID 부호없는 int
lwlockmode int
Lockmode int
BlockNumber 부호없는 int
OID 부호없는 int
Forknumber int
bool 부호없는 char

28.5.3. 범퍼카 토토 사용

아래 예제는 스냅 샷의 대안으로 시스템에서 트랜잭션 카운트를 분석하기위한 dtrace 스크립트를 보여줍니다PG_STAT_DATABASE성능 테스트 전과 후에 :

#!/usr/sbin/dtrace -qs

실행되면 예제 D 스크립트는 다음과 같은 출력을 제공합니다.

# ./txn_count.d` pgrep -n postgres` 또는 ./txn_count.d 

Note

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

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

28.5.4. 새 프로브 정의

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

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

  2. 프로브 정의 추가src/backend/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

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

  • 프로브 매개 변수에 지정된 데이터 유형이 매크로에 사용되는 변수의 데이터 유형과 일치하도록주의해야합니다. 그렇지 않으면 컴파일 오류가 발생합니다.

  • 대부분의 플랫폼에서 ifPostgreSQL-enable-dtrace, 트레이스 매크로에 대한 인수는 대조군이 매크로를 통과 할 때마다 평가됩니다.추적이 수행되지 않더라도. 이것은 일반적으로 몇 가지 로컬 변수의 값을보고하는 경우 걱정할 가치가 없습니다.

    if (trace_postgresql_transaction_start_enabled ())

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

정정 제출

문서에 올바르지 않은 내용이 있으면 일치하지 않습니다.이 양식문서 문제를보고하려면