| PostgreSQL 9.2.24 문서 | ||||
|---|---|---|---|---|
| 토토 사이트 추천 : 문서 : 9.2 : 잠금보기 | 위로 | 27장. 데이터베이스 활동 모니터링 | PostgreSQL : 문서 : 9.2 : 디스크 사용 메이저 토토 사이트 | |
포스트그레SQL제공 데이터베이스 서버의 동적 추적을 지원하는 기능입니다. 이를 통해 특정 지점에서 외부 유틸리티를 호출할 수 있습니다. 코드에서 실행을 추적합니다.
여러 개의 프로브 또는 추적 지점이 이미 삽입되어 있습니다. 소스 코드. 이 프로브는 데이터베이스에서 사용하도록 고안되었습니다. 개발자와 관리자. 기본적으로 프로브는 그렇지 않습니다. 로 컴파일됨PostgreSQL; 그만큼 사용자는 구성 스크립트에 명시적으로 지시하여 토토 캔를 사용할 수 있습니다.
현재는 오직DTrace유틸리티가 지원되며 다음에서 사용할 수 있습니다. OpenSolaris, Solaris 10 및 Mac OS X Leopard. 예상된다 DTrace는 향후 FreeBSD에서 사용할 수 있으며 아마도 다른 운영 체제일 수도 있습니다. 그만큼SystemTap10549_10726src/include/utils/probes.h.
기본적으로 프로브를 사용할 수 없으므로 다음을 수행해야 합니다. 프로브를 만들도록 구성 스크립트에 명시적으로 지시합니다. 에서 사용 가능포스트그레SQL. 에게 DTrace 지원 포함 지정--활성화-dtrace구성합니다. 보다섹션 15.4더 자세히 알아보기 정보.
소스 코드에는 다수의 표준 토토 캔가 제공됩니다. 에 표시된 대로표 27-15; 표 27-16은 토토 캔에 사용된 유형을 표시합니다. 더 많은 토토 캔가 확실히 가능합니다. 강화하기 위해 추가됨포스트그레SQL의 관측 가능성.
표 27-15. 내장 DTrace 프로브
| 이름 | 매개변수 | 설명 | 
|---|---|---|
| 거래 시작 | (LocalTransactionId) | 새 트랜잭션 시작 시 실행되는 토토 캔. arg0은 트랜잭션 ID입니다. | 
| 트랜잭션-커밋 | (LocalTransactionId) | 트랜잭션이 완료되면 실행되는 토토 캔 성공적으로. arg0은 트랜잭션 ID입니다. | 
| 트랜잭션 중단 | (LocalTransactionId) | 트랜잭션이 완료되면 실행되는 토토 캔 실패했습니다. arg0은 트랜잭션 ID입니다. | 
| 쿼리-시작 | (const char *) | 질의 처리가 다음과 같을 때 실행되는 프로브 시작되었습니다. arg0은 쿼리 문자열입니다. | 
| 쿼리 완료 | (const char *) | 질의 처리가 다음과 같을 때 실행되는 프로브 완벽한. arg0은 쿼리 문자열입니다. | 
| 쿼리-분석-시작 | (const char *) | 질의 구문 분석 시 실행되는 토토 캔 시작되었습니다. arg0은 쿼리 문자열입니다. | 
| 쿼리-분석 완료 | (const char *) | 질의 구문 분석 시 실행되는 토토 캔 완벽한. arg0은 쿼리 문자열입니다. | 
| 쿼리-재작성-시작 | (const char *) | 쿼리 재작성 시 실행되는 토토 캔 시작되었습니다. arg0은 쿼리 문자열입니다. | 
| 쿼리-재작성-완료 | (const char *) | 쿼리 재작성 시 실행되는 토토 캔 완벽한. arg0은 쿼리 문자열입니다. | 
| 쿼리-계획-시작 | () | 질의 계획이 있을 때 실행되는 토토 캔 시작했습니다. | 
| 쿼리-계획-완료 | () | 질의 계획이 있을 때 실행되는 토토 캔 완벽한. | 
| 쿼리-실행-시작 | () | 쿼리 실행 시 실행되는 토토 캔 시작했습니다. | 
| 쿼리-실행-완료 | () | 쿼리 실행 시 실행되는 토토 캔 완벽한. | 
| 진술-상태 | (const char *) | 서버 프로세스가 업데이트될 때마다 실행되는 토토 캔 그것은pg_stat_activity.상태. arg0은 새로운 상태입니다. 끈. | 
| 체크포인트-시작 | (int) | 체크포인트가 시작될 때 실행되는 토토 캔. 인수0 서로 다른 것을 구별하는 데 사용되는 비트 단위 플래그를 보유합니다. 종료, 즉시 또는 종료와 같은 체크포인트 유형 힘. | 
| 체크포인트 완료 | (정수, 정수, 정수, 정수, 정수) | 체크포인트가 완료되면 실행되는 프로브. (다음에 나열된 프로브는 다음 동안 순차적으로 실행됩니다. 체크포인트 처리.) arg0은 버퍼 수입니다. 쓴. arg1은 총 버퍼 수입니다. 인수2, arg3 및 arg4에는 추가된 xlog 파일 수가 포함됩니다. 각각 제거되고 재활용되었습니다. | 
| clog-checkpoint-start | (부울) | CLOG 부분이 CLOG일 때 실행되는 토토 캔 체크포인트가 시작되었습니다. arg0은 보통의 경우 true입니다. 체크포인트, 종료 체크포인트의 경우 false입니다. | 
| clog-checkpoint-done | (부울) | CLOG 부분이 CLOG일 때 실행되는 프로브 체크포인트가 완료되었습니다. arg0은 다음과 같은 의미를 갖습니다. 막힘 체크포인트 시작을 위해. | 
| subtrans-checkpoint-start | (부울) | 의 SUBTRANS 부분이 있을 때 실행되는 토토 캔 체크포인트가 시작되었습니다. arg0은 보통의 경우 true입니다. 체크포인트, 종료 체크포인트의 경우 false입니다. | 
| subtrans-checkpoint-done | (부울) | 의 SUBTRANS 부분이 있을 때 실행되는 프로브 체크포인트가 완료되었습니다. arg0은 다음과 같은 의미를 갖습니다. 하위 전송 체크포인트 시작의 경우. | 
| multixact-checkpoint-start | (부울) | MultiXact 부분이 체크포인트가 시작되었습니다. arg0은 보통의 경우 true입니다. 체크포인트, 종료 체크포인트의 경우 false입니다. | 
| multixact-checkpoint-done | (부울) | MultiXact 부분이 체크포인트가 완료되었습니다. arg0은 다음과 같은 의미를 갖습니다. multixact-checkpoint-start의 경우. | 
| 버퍼-체크포인트-시작 | (int) | 버퍼 쓰기 부분이 체크포인트가 시작됩니다. arg0은 비트 플래그를 보유합니다. 다음과 같은 다양한 체크포인트 유형을 구별하는 데 사용됩니다. 종료, 즉시 또는 강제. | 
| 버퍼-동기화-시작 | (정수, 정수) | 우리가 더러운 글을 쓰기 시작할 때 실행되는 프로브 체크포인트 중 버퍼링(어느 것인지 확인한 후) 버퍼를 작성해야 합니다). arg0은 총 개수입니다. 버퍼. arg1은 현재 더티된 숫자입니다. 작성해야 합니다. | 
| 버퍼-동기화-작성 | (int) | 각 버퍼가 작성된 후 실행되는 토토 캔 체크포인트 중. arg0은 ID 번호입니다. 완충기. | 
| 버퍼-동기화 완료 | (정수, 정수, 정수) | 모든 더티 버퍼가 삭제되었을 때 실행되는 프로브 쓴. arg0은 총 버퍼 수입니다. arg1은 실제로 작성된 버퍼 수 체크포인트 프로세스. arg2는 다음과 같은 숫자입니다. 기록될 것으로 예상됩니다(buffer-sync-start의 arg1). 어느 차이점은 버퍼를 플러시하는 다른 프로세스를 반영합니다. 검문소 동안. | 
| 버퍼-체크포인트-동기화-시작 | () | 더티 버퍼가 삭제된 후 실행되는 토토 캔 커널에 기록되고 발행을 시작하기 전에 fsync 요청. | 
| 버퍼-체크포인트-완료 | () | 버퍼를 디스크에 동기화할 때 실행되는 토토 캔는 완벽한. | 
| 2단계-체크포인트-시작 | () | 2상 부분이 체크포인트가 시작되었습니다. | 
| 2단계-체크포인트-완료 | () | 2상 부분이 체크포인트가 완료되었습니다. | 
| 버퍼-읽기-시작 | (ForkNumber, BlockNumber, Oid, Oid, Oid, int, 부울) | 버퍼 읽기가 시작될 때 실행되는 토토 캔입니다. arg0과 arg1에는 포크와 블록 번호가 포함되어 있습니다. 페이지(그러나 이것이 관계인 경우 arg1은 -1이 됩니다) 연장 요청). arg2, arg3 및 arg4에는 테이블스페이스, 데이터베이스 및 관계 OID를 식별합니다. 관계. arg5는 생성된 백엔드의 ID입니다. 로컬 버퍼에 대한 임시 관계, 또는 공유 버퍼의 경우 InvalidBackendId(-1)입니다. arg6은 참입니다 관계 확장 요청의 경우, 정상인 경우 false 읽다. | 
| 버퍼 읽기 완료 | (ForkNumber, BlockNumber, Oid, Oid, Oid, int, bool, 부울) | 버퍼 읽기가 완료되면 실행되는 프로브입니다. arg0과 arg1에는 포크와 블록 번호가 포함되어 있습니다. 페이지(관계 확장 요청인 경우 이제 arg1 새로 추가된 블록의 블록 번호를 포함합니다). arg2, arg3 및 arg4에는 테이블스페이스, 데이터베이스, 및 관계를 식별하는 관계 OID. arg5는 임시 관계를 생성한 백엔드의 ID 로컬 버퍼의 경우 InvalidBackendId(-1) 공유 버퍼. arg6은 관계 확장에 대해 true입니다. 요청, 일반 읽기의 경우 false입니다. arg7은 다음과 같은 경우 참입니다. 풀에서 버퍼가 발견되었습니다. 그렇지 않으면 false입니다. | 
| 버퍼 플러시 시작 | (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 버퍼가 없기 때문에 더티 WAL 버퍼를 작성합니다. 공간을 이용할 수 있습니다. (이런 일이 자주 발생한다면 저것wal_buffers너무 작습니다.) | 
| 월-버퍼-쓰기-더티-완료 | () | 더티 WAL 버퍼 쓰기가 다음과 같을 때 실행되는 프로브 완벽한. | 
| xlog-삽입 | (부호 없는 문자, 부호 없는 문자) | WAL 레코드가 삽입될 때 실행되는 프로브. arg0은 레코드에 대한 리소스 관리자(rmid)입니다. arg1에는 정보 플래그가 포함되어 있습니다. | 
| xlog-스위치 | () | 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, 정수) | 블록 읽기가 완료되면 실행되는 프로브입니다. arg0과 arg1에는 포크와 블록 번호가 포함되어 있습니다. 페이지. arg2, arg3 및 arg4에는 테이블스페이스가 포함되어 있습니다. 데이터베이스 및 관계를 식별하는 관계 OID입니다. arg5는 다음을 생성한 백엔드의 ID입니다. 로컬 버퍼에 대한 임시 관계 또는 공유 버퍼의 경우 InvalidBackendId(-1)입니다. arg6은 실제로 읽은 바이트 수, arg7은 숫자입니다. 요청됨(이것이 다른 경우 다음을 나타냄) 문제). | 
| smgr-md-write-start | (ForkNumber, BlockNumber, Oid, Oid, Oid, int) | 블록 쓰기를 시작할 때 실행되는 토토 캔 관계. arg0 및 arg1에는 포크와 블록이 포함되어 있습니다. 페이지 번호. arg2, arg3 및 arg4에는 테이블스페이스, 데이터베이스 및 관계 OID를 식별합니다. 관계. arg5는 생성된 백엔드의 ID입니다. 로컬 버퍼에 대한 임시 관계, 또는 공유 버퍼의 경우 InvalidBackendId(-1)입니다. | 
| smgr-md-write-done | (ForkNumber, BlockNumber, Oid, Oid, Oid, int, int, 정수) | 블록 쓰기가 완료되면 실행되는 프로브. arg0과 arg1에는 포크와 블록 번호가 포함되어 있습니다. 페이지. arg2, arg3 및 arg4에는 테이블스페이스가 포함되어 있습니다. 데이터베이스 및 관계를 식별하는 관계 OID입니다. arg5는 다음을 생성한 백엔드의 ID입니다. 로컬 버퍼에 대한 임시 관계 또는 공유 버퍼의 경우 InvalidBackendId(-1)입니다. arg6은 실제로 쓰여진 바이트 수이고 arg7은 요청된 번호(다른 경우 다음을 나타냄) 문제). | 
| 정렬-시작 | (int, bool, int, int, bool) | 정렬 작업이 시작될 때 실행되는 토토 캔. arg0은 힙, 인덱스 또는 데이텀 정렬을 나타냅니다. arg1은 참입니다 고유 값 적용을 위해. arg2는 키의 번호입니다. 열. arg3은 작업 메모리의 킬로바이트 수입니다. 허용된. 정렬에 대한 무작위 액세스인 경우 arg4는 true입니다. 결과가 필요합니다. | 
| 정렬 완료 | (부울, 긴) | 정렬이 완료되면 실행되는 토토 캔입니다. arg0은 외부 정렬의 경우 true이고 내부 정렬의 경우 false입니다. 인수1 외부 정렬에 사용되는 디스크 블록 수입니다. 또는 내부 정렬에 사용되는 메모리의 킬로바이트. | 
| lwlock-획득 | (LWLockId, LWLockMode) | LWLock이 획득되었을 때 실행되는 토토 캔. arg0은 LWLock의 ID입니다. arg1은 요청된 잠금입니다. 모드(독점 또는 공유). | 
| lwlock-release | (LWLockId) | LWLock이 해제될 때 실행되는 토토 캔 (그러나 해제된 웨이터는 아직 해제되지 않았습니다. 깨어났다). arg0은 LWLock의 ID입니다. | 
| lwlock-대기-시작 | (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이 아닐 때 실행되는 토토 캔 호출자가 아니요를 지정했을 때 성공적으로 획득되었습니다. 대기 중. arg0은 LWLock의 ID입니다. arg1은 요청된 것입니다. 잠금 모드(독점 또는 공유). | 
| 잠금-대기-시작 | (부호 없는 정수, 부호 없는 정수, 부호 없는 정수, 부호 없는 정수, 부호 없는 정수, LOCKMODE) | 헤비급 요청 시 실행되는 프로브 잠금(lmgr 잠금)이 잠금 상태이므로 대기를 시작했습니다. 사용할 수 없습니다. arg0부터 arg3까지가 태그 필드입니다. 잠겨 있는 객체를 식별합니다. arg4는 다음을 나타냅니다. 잠긴 객체의 유형입니다. arg5는 잠금을 나타냅니다. 요청되는 유형입니다. | 
| 잠금-대기-완료 | (부호 없는 정수, 부호 없는 정수, 부호 없는 정수, 부호 없는 정수, 부호 없는 정수, LOCKMODE) | 헤비급 요청 시 실행되는 프로브 잠금(lmgr 잠금)이 대기를 완료했습니다(즉, 잠금을 획득했습니다.) 인수는 다음과 같습니다. 잠금 대기 시작. | 
| 교착상태 발견 | () | 교착 상태가 발견되면 실행되는 프로브 교착 상태 감지기. | 
아래 예는 분석을 위한 DTrace 스크립트를 보여줍니다. 대신 시스템의 거래 수를 계산합니다. 스냅샷 찍기pg_stat_database성능 테스트 전후:
#!/usr/sbin/dtrace -qs
postgresql$1:::트랜잭션-시작
      @start["시작"] = 개수();
      자체-ts = 타임스탬프;
postgresql$1:::트랜잭션-중단
      @abort["중단"] = count();
postgresql$1:::트랜잭션-커밋
/자신-ts/
      @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 스크립트는 주의 깊게 작성해야 한다는 점을 기억해야 합니다. 작성 및 디버깅되며, 그렇지 않으면 추적 정보가 수집됩니다. 의미가 없을 수도 있습니다. 문제가 발견되는 경우가 대부분입니다. 결함이 있는 기기는 기본 기기가 아니라 기기입니다. 체계. 동적을 사용하여 찾은 정보를 논의할 때 추적을 허용하는 데 사용되는 스크립트도 포함해야 합니다. 확인하고 논의해야 합니다.
PgFoundry에서 더 많은 예제 스크립트를 찾을 수 있습니다.dtrace 프로젝트.
새 프로브는 코드 내에서 정의될 수 있습니다. 개발자가 원하지만 이를 위해서는 재컴파일이 필요합니다. 다음은 새 프로브를 삽입하는 단계입니다.
사용할 수 있는 프로브 이름과 데이터 결정 프로브를 통해
다음에 프로브 정의 추가src/backend/utils/probes.d
포함pg_trace.h그렇다면 프로브가 포함된 모듈에 아직 존재하지 않습니다. 포인트 및 삽입TRACE_POSTGRESQL토토 캔 매크로를 소스 코드에서 원하는 위치
새 토토 캔가 제대로 작동하는지 다시 컴파일하고 확인하세요. 사용 가능
예:여기에 트랜잭션 ID로 모든 새로운 트랜잭션을 추적하는 토토 캔입니다.
탐색 이름을 정할지 결정거래 시작매개변수가 필요합니다. LocalTransactionId 유형
다음에 프로브 정의 추가src/backend/utils/probes.d:
프로브 transaction__start(LocalTransactionId);
탐색에서 이중 밑줄 사용에 유의하세요. 이름. 프로브를 사용하는 DTrace 스크립트에서 이중 밑줄을 하이픈으로 바꿔야 하므로거래 시작이름은 ~입니다 사용자를 위한 문서입니다.
컴파일 시,transaction__start매크로로 변환됩니다 라고 불리는TRACE_POSTGRESQL_TRANSACTION_START(공지 여기서 밑줄은 단일입니다). 포함pg_trace.h. 추가 소스의 적절한 위치에 대한 매크로 호출 암호. 이 경우 다음과 같습니다.
TRACE_POSTGRESQL_TRANSACTION_START(vxid.localTransactionId);
새 바이너리를 다시 컴파일하고 실행한 후 다음을 확인하세요. 다음을 실행하여 새로 추가된 프로브를 사용할 수 있는지 확인하세요. DTrace 명령을 따릅니다. 비슷한 걸 봐야 해 산출:
# dtrace -ln 트랜잭션 시작 ID 제공자 모듈 기능 이름 18705 postgresql49878 postgres StartTransactionCommand 트랜잭션 시작 18755 postgresql49877 postgres StartTransactionCommand 트랜잭션 시작 18805 postgresql49876 postgres StartTransactionCommand 트랜잭션 시작 18855 postgresql49875 postgres StartTransactionCommand 트랜잭션 시작 18986 postgresql49873 postgres StartTransactionCommand 트랜잭션 시작
추적을 추가할 때 주의해야 할 몇 가지 사항이 있습니다. C 코드에 대한 매크로:
당신은 다음에 대해 지정된 데이터 유형에 주의해야 합니다. 프로브의 매개변수가 변수의 데이터 유형과 일치합니다. 매크로에 사용됩니다. 그렇지 않으면 컴파일이 발생합니다. 오류.
대부분의 플랫폼에서 다음과 같은 경우PostgreSQL다음으로 구축됨--활성화-dtrace, 추적에 대한 인수 매크로는 제어가 통과할 때마다 평가됩니다. 매크로,아니더라도 추적 중입니다.. 이것은 일반적으로 가치가 없습니다 단지 값만 보고하는 것인지 걱정됩니다. 지역 변수가 거의 없습니다. 하지만 비싼 것을 넣는 것을 조심하세요 함수는 인수를 호출합니다. 꼭 그렇게 해야 한다면, 확인을 통해 매크로를 보호하는 것이 좋습니다. 추적이 실제로 활성화되었습니다.
if (TRACE_POSTGRESQL_TRANSACTION_START_ENABLED())
    TRACE_POSTGRESQL_TRANSACTION_START(some_function(...));
        각 추적 매크로에는 해당하는활성화됨매크로.