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

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 : 문서 : 10 : 16.4. 토토 결과 절차자세한 내용은

28.5.2. 내장 젠 토토

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

표 28.23. 내장 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-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은 작성된 버퍼의 수입니다.
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 요청을 시작하기 전에..
버퍼-체크 포인트 도네 () 버퍼를 디스크에 동기화 할 때 발사되는 젠 토토.
Twophase-Checkpoint-Start () 체크 포인트의 2 상 부분이 시작될 때 발사되는 젠 토토.
Twophase-Checkpoint-done () 체크 포인트의 2 상 부분이 완료되면 발사되는 젠 토토.
버퍼 읽기 시작 (Forknumber, BlockNumber, OID, OID, OID, Int, BOOL) 버퍼 읽기가 시작될 때 발사되는 젠 토토. Arg0 및 Arg1에는 페이지의 포크 및 블록 번호가 포함되어 있지만 관계 확장 요청이면 -1이됩니다).invalidbackendid17959_18054
버퍼 읽기 도네 (Forknumber, BlockNumber, OID, OID, OID, Int, BOOL, BOOL) 버퍼 읽기가 완료되면 발사되는 젠 토토. Arg0 및 Arg1에는 페이지의 포크 및 블록 번호가 포함되어 있습니다 (관계 확장 요청 인 경우 Arg1은 이제 새로 추가 된 블록의 블록 번호를 포함합니다).invalidbackendid19364_19523
버퍼-플러시 시작 (Forknumber, BlockNumber, OID, OID, OID) 공유 버퍼에 대한 쓰기 요청을 발행하기 전에 발사되는 젠 토토. Arg0 및 Arg1에는 페이지의 포크 및 블록 번호가 포함되어 있습니다.
버퍼 플러시 도네 (Forknumber, BlockNumber, OID, OID, OID) 쓰기 요청이 완료되면 발사되는 젠 토토. (이것은 단지 데이터를 커널에 전달할 시간을 반영합니다. 일반적으로 아직 실제로 디스크에 기록되지 않았습니다.) 인수는와 동일합니다.버퍼-플러시 시작.
버퍼-쓰레기-내장 시작 (Forknumber, BlockNumber, OID, OID, OID) 서버 프로세스가 더러운 버퍼를 쓰기 시작하면 발사되는 젠 토토. (이런 일이 자주 발생하면shared_buffers너무 작거나 배경 작성자 제어 매개 변수는 조정이 필요합니다.) Arg0 및 Arg1에는 페이지의 포크 및 블록 번호가 포함되어 있습니다. Arg2, Arg3 및 Arg4에는 테이블 스페이스, 데이터베이스 및 관계를 식별하는 관계 OID가 포함되어 있습니다.
버퍼-쓰레기-다이티 폰 (Forknumber, BlockNumber, OID, OID, OID) 더러운 버퍼 쓰기가 완료되면 발사되는 젠 토토. 인수는와 동일합니다.버퍼-쓰레기-내장 시작.
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 (Forknumber, BlockNumber, OID, OID, OID, Int) 관계에서 블록을 읽기 시작할 때 발사되는 젠 토토. Arg0 및 Arg1에는 페이지의 포크 및 블록 번호가 포함되어 있습니다.invalidbackendid(-1) 공유 버퍼의 경우
smgr-md-Read-done (Forknumber, BlockNumber, OID, OID, OID, Int, Int, Int) 블록 읽기가 완료되면 발사되는 젠 토토. Arg0 및 Arg1에는 페이지의 포크 및 블록 번호가 포함되어 있습니다.invalidbackendid21762_21912
SMGR-MD-WRITE-Start (Forknumber, BlockNumber, OID, OID, OID, Int) 관계에 블록을 쓰기 시작할 때 발사되는 젠 토토. Arg0 및 Arg1에는 페이지의 포크 및 블록 번호가 포함되어 있습니다.invalidbackendid(-1) 공유 버퍼의 경우
SMGR-MD-WRITE-DONE (Forknumber, BlockNumber, OID, OID, OID, Int, Int, Int) 블록 쓰기가 완료되면 발사되는 젠 토토. Arg0 및 Arg1에는 페이지의 포크 및 블록 번호가 포함되어 있습니다.invalidbackendid22384_22537
Sort-Start (int, bool, int, int, bool) 정렬 작업이 시작될 때 발사되는 젠 토토. Arg0은 힙, 인덱스 또는 데이텀 정렬을 나타냅니다.
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.24. 프로브 매개 변수에 사용 된 정의 유형

타입 정의
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/백엔드/utils/probes.d

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

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

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

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

  2. 프로브 정의 추가SRC/백엔드/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 코드에 추적 매크로를 추가 할 때 조심해야 할 몇 가지 사항이 있습니다 :

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

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

    if (trace_postgresql_transaction_start_enabled ())

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