PostgreSQL데이터베이스 서버의 동적 추적을 지원할 수있는 시설을 제공합니다. 이를 통해 외부 유틸리티가 코드의 특정 지점에서 호출되어 추적 실행이 가능합니다.
다수의 프로브 또는 추적 지점이 이미 소스 코드에 삽입되어 있습니다. 이 프로브는 데이터베이스 개발자 및 관리자가 사용하기위한 것입니다.PostgreSQL; 사용자는 범퍼카 토토를 사용할 수 있도록 구성 스크립트를 명시 적으로 알려야합니다.
현재,dtrace유틸리티가 지원되며,이 글을 쓰는 시점에서 Solaris, MacOS, FreeBSD, NetBSD 및 Oracle Linux에서 구입할 수 있습니다. 그만큼SystemTapLinux의 프로젝트는 DTRACE 동등한 것을 제공하며 사용할 수 있습니다. Macros의 정의를 변경하여 다른 동적 추적 유틸리티를 지원하는 것은 이론적으로 가능합니다.src/include/utils/probes.h
.
기본적으로 범퍼카 토토를 사용할 수 없으므로 범퍼카 토토를 사용할 수 있도록 스크립트 구성을 명시 적으로 알려야합니다PostgreSQL. DTRACE 지원을 포함하려면-enable-dtrace
구성합니다. 보다PostgreSQL : 문서 : 14 : 17.4. 토토 커뮤니티 절차자세한 내용은
여러 표준 범퍼카 토토가 소스 코드에 제공됩니다.표 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은 이제 새로 추가 된 블록의 블록 번호를 포함합니다).invalidbackendid 21562_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에는 페이지의 포크 및 블록 번호가 포함되어 있습니다.invalidbackendid 24620_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에는 페이지의 포크 및 블록 번호가 포함되어 있습니다.invalidbackendid 25374_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 |
아래 예제는 스냅 샷의 대안으로 시스템에서 트랜잭션 카운트를 분석하기위한 dtrace 스크립트를 보여줍니다PG_STAT_DATABASE
성능 테스트 전과 후에 :
#!/usr/sbin/dtrace -qs
실행되면 예제 D 스크립트는 다음과 같은 출력을 제공합니다.
# ./txn_count.d` pgrep -n postgres` 또는 ./txn_count.d
SystemTap은 기본 추적 지점이 호환 되더라도 DTRACE와 트레이스 스크립트에 대해 다른 표기법을 사용합니다. 주목할만한 한 가지 요점은이 쓰기에서 SystemTap 스크립트는 하이픈 대신 이중 밑줄을 사용하여 프로브 이름을 참조해야한다는 것입니다.
dtrace 스크립트는 신중하게 작성 및 디버깅해야한다는 것을 기억해야합니다. 그렇지 않으면 수집 된 추적 정보는 의미가 없을 수 있습니다. 문제가 발견되는 경우 대부분의 경우 기본 시스템이 아니라 결함이있는 계측입니다.
새로운 프로브는 개발자가 원하는 곳마다 코드 내에서 정의 될 수 있지만, 이는 재 컴파일이 필요합니다. 다음은 새 프로브를 삽입하는 단계입니다.
프로브를 통해 제공 할 프로브 이름과 데이터 결정
프로브 정의 추가src/backend/utils/probes.d
포함pg_trace.h
프로브 포인트가 포함 된 모듈에 아직 존재하지 않는 경우trace_postgresql
소스 코드의 원하는 위치에서 매크로를 조사
새로운 범퍼카 토토를 사용할 수 있는지 확인하고
예 :거래 ID를 통해 모든 새로운 트랜잭션을 추적하기 위해 범퍼카 토토를 추가하는 방법의 예가 있습니다.
프로브의 이름이 지정 될 것이라고 결정Transaction-Start
유형의 매개 변수가 필요합니다LocalTransactionID
프로브 정의 추가src/backend/utils/probes.d
:
Probe Transaction__start (localTransactionId);
프로브 이름의 이중 밑줄을 사용하십시오. 프로브를 사용하는 dtrace 스크립트에서 이중 밑줄을 하이픈으로 교체해야하므로Transaction-Start
사용자를 위해 문서화 할 이름입니다.
컴파일 시간에Transaction__Start
이라는 매크로로 변환trace_postgresql_transaction_start
(밑줄은 여기에 싱글이라는 것을 알 수 있음).pg_trace.h
. 소스 코드의 매크로 호출을 적절한 위치에 추가하십시오.
TRACE_POSTGRESQL_TRANSACTION_START (VXID.LOCALTRANSACTIONID);
새 바이너리를 다시 컴파일하고 실행 한 후 다음 dtrace 명령을 실행하여 새로 추가 된 프로브를 사용할 수 있는지 확인하십시오. 비슷한 출력이 보일 것입니다 :
# dtrace -ln transaction -start
C 코드에 추적 매크로를 추가 할 때 조심해야 할 몇 가지가 있습니다 :
프로브 매개 변수에 지정된 데이터 유형이 매크로에 사용되는 변수의 데이터 유형과 일치하도록주의해야합니다. 그렇지 않으면 컴파일 오류가 발생합니다.
대부분의 플랫폼에서 ifPostgreSQL-enable-dtrace
, 트레이스 매크로에 대한 인수는 대조군이 매크로를 통과 할 때마다 평가됩니다.추적이 수행되지 않더라도. 이것은 일반적으로 몇 가지 로컬 변수의 값을보고하는 경우 걱정할 가치가 없습니다.
if (trace_postgresql_transaction_start_enabled ())
각 트레이스 매크로에는 해당활성화
매크로.
문서에 올바르지 않은 내용이 있으면 일치하지 않습니다.이 양식문서 문제를보고하려면