1. 목적 : Postgresql 기반 DBMS 솔루션의 성능 진단 표준 가이드 제공
OpenSource Postgresql은 출시된지 30년 가까이 되어 지속적으로 Released 되면서 현재 On Premise, Cloud, docker 등 플랫폼 상관없이 다양한 형태의 Postgres 기반 솔루션들이 Product 환경에서 사용되고 있다.
[참조] PostgreSQL derived databases(https://wiki.postgresql.org/wiki/PostgreSQL_derived_databases)
그에 따라 DBMS의 필수 요소인 성능 진단과 튜닝 분야 또한 다양한 방법론 및 솔루션들이 존재한다.
아래의 내용들은 이를 필요로 하는 DBA 또는 개발자들에게 기본적인 표준 가이드를 제공하고자 한다.
2. 개요
성능 이슈가 발생했을 때 일반적인 성능 개선 방법은 크게 서버 튜닝, 어플리케이션애플리케이션 튜닝, 쿼리 튜닝을 말한다. DBMS는 서버 상에서 실행되는 일종의 애플리케이션이고, 궁극적으로는 데이터베이스에 저장되어 있는 데이터를 질의하는 쿼리를 통해 성능 측정을 하기 때문이다. 실제로도 시스템의 성능 문제의 원인은 하드웨어(CPU, 메모리, 네트워크 등) 자원 부족, DBMS 설계, SQL 비효율 등이 대부분이다.
결론적으로 최적의 성능 진단을 위해서는 서버, 어플리케이션, 쿼리 관련 데이터를 효율적으로 수집하여 다양한 방법을 통해 분석, 활용할 수 있어야 한다.
PostgreSQL DB 서버에서는 어떤 방식으로 이를 수행할 수 있는지 살펴보자.
3. OS 모니터링
윈도우 또는 리눅스 같은 OS들은 CPU, 메모리, 네트워크, 디스크 등의 상태를 체크하는 다양한 기본 명령어 또는 유틸리티를 제공한다.
전통적으로 유닉스 계열에서는 기본 제공되는 OS 명령어를 Shell Script를 crontab에 등록하여 주기적인 모니터링을 진행했으나, 최근에는 다양한 서버 모니터링 확장 유틸리티들이 존재한다.
범위 | 기본 | 확장 | |
주요 정보 | 서버 리소스, 프로세스 정보 등 | 사용자UI / Repository 제공 (glance / sar 등) |
|
적용 범위 | 개발/운영 | 개발/운영 | |
적용방법 | OS 명령어 수행 | 패키지 매니저 명령어로 설치 (yum / rpm / apt 등) |
|
모니터링 방법 | 1. 명령어 수행을 통한 실시간 확인 2. history 로그 파일 확인 |
1. 명령어 수행을 통한 실시간 확인 2. history 로그 파일 확인 |
|
모니터링 최적화 | Shell Script(or Python) 활용 | - | |
통계수집 시작 지점 | 명령어 수행 시점 | 명령어 수행 시점 |
아래의 표는 리눅스 기준 주요 OS모니터링 Tools이다.
영역 | 구분 | default유무 | 주요 명령어 | 설명 |
User | w | 기본 | w [ username ] | 현재 시스템에 로그인한 사용자와 프로세스를 표시 |
Total | vmstat | 기본 | vmstat [3] vmstat -m |
시스템 작업, 하드웨어 및 시스템 정보. 프로세스, 메모리, 페이징, 블록 IO, 트랩 및 cpu 작업에 관한 정보를 표시 |
Total | top | 기본 | top | linx kernel을 통하여 관리되는 프로세스의 태스크 리스트들의 정보인 CPU, MEM, Process 상태정보등을 확인 단축키 : t (요약정보), m (메모리정보), A (시스템 자원 소모 프로세스 정렬), k (kill 명령어 실행) |
Total | iostat | 기본 | iostat [-x] iostat 3 |
CPU 통계 및 장치, 파티션, 네트워크 파일시스템(NFS)의 입출력 통계를 보고 |
Total | glances | 확장 | pip install glances glances |
Linux 터미널 및 웹 인터페이스를 제공하는 성능 모니터링 도구 (python3 버전에서 실행됨) |
Total | netdata | 확장 | bash <(curl -Ss https://my-netdata.io/kickstart.sh) http://192.168.1.11:19999/ |
리눅스 시스템, 응용 프로그램, SNMP 장치에 대한 성능 모니터링 (초당)을 실시간으로 제공하고 절대적를 분석하기 위해 웹 브라우저를 통해 수집 된 모든 값을 렌더링하여, 전체 대화 형 차트를 보여주는 매우 최적화 된 리눅스 유틸리티 |
Process | ps | 기본 | ps -ef ps --AlF (자세한 출력 표시) ps axjf (프로세스 트리 표시) |
현재 프로세스의 상태 표시 |
Process | pmap | 확장 | pmap -d PID | 프로세스의 메모리 지도를 표시한다. 이 명령어를 사용하여 메모리 병목현상의 원인을 찾기 위해 사용 |
OS | uptime | 기본 | uptime | 얼마나 오래 서버가 운영되고 있는지 알기 위해 사용된다. 현재 시스템이 얼마나 운영되고 있는지, 몇 명의 사용자가 로그인하고 있는지 과거 1, 5, 15분 동안의 시스템 평균 부하를 표시 |
Network | netstat | 기본 | netstat | 네트워크 상태 모니터링. 현재 시스템에 연결된 네트워크 상태, 라우팅 테이블, 인터페이스 상태 등을 확인 |
Memory | free | 기본 | free | 메모리 사용량 |
Disk | df | 기본 | df df -h |
현재 디스크의 전체 용량 및 남은 용량을 확인 |
Disk | du | 기본 | du -h du -h --max-depth=1 |
|
CPU | sar | 확장 | sar -n DEV | more (네트워크 카운터 확인) sar 4 5 (실시간 사용량 출력) |
시스템 활동 수집 및 보고 |
CPU | mpstat | 확장 | mpstat -P ALL | Multiprocessor 사용량 |
4. PostgreSQL 모니터링(Log File 기준)
Data Cluster가 기동 되면, DB에서 발생되는 주요 이벤트 정보들이 DB 파라미터에 지정된 디렉터리 안에 파일 형태로 실시간 업데이트된다. DB 성능 진단 및 튜닝에 있어 가장 기본이 되는 수집 데이터로 postgresql.conf 파라미터 옵션에 따라 다양한 정보들을 확인할 수 있다.
범위 | 기본 | 확장 | ||
pg_log | log_min_duration_statement | auto_explain.log_min_duration | ||
주요 정보 | DB Event 로그/Wal 로그 | SQL 내용 및 수행시간 | SQL 내용 및 실행계획 | |
적용 범위 | 개발/운영 | 개발/운영 | 개발 | |
적용방법 | postgresql.conf 파라미터 적용 logging_collector=on log_directory='pg_log' log_filename = 'agensgraph-%Y-%m-%d_%H%M%S.log |
postgresql.conf 파라미터 적용 log_min_duration_statement=2s |
postgresql.conf 파라미터 적용 auto_explain.log_min_duration=2s |
|
모니터링 최적화 | csvlog 출력시 DB관리 용이 |
Shell Script(or Python) 활용 | Shell Script(or Python) 활용 | |
통계수집 시작 지점 | DB 기동 | 활성화 이후 | 활성화 이후 | |
off 기능 | logging_collector=off | log_min_duration_statement=-1 | auto_explain.log_min_duration=-1 |
5. PostgreSQL 모니터링(pg_catalog 기준)
모든 DBMS는 기동 이후부터 데이터베이스에서 발생되는 오브젝트의 변동 내역, 트랜잭션 내역, 통계 정보, 메모리/디스크 사용률, SQL 수행 내역 등 가히 모든 데이터들을 수집한다. PostgreSQL도 마찬가지로 pg_catalog라는 시스템 카탈로그 정보를 통해 그 내용들을 확인할 수 있다. 그리고 다양한 extensions들을 통해 그 수집 범위를 더욱 확장시킬 수 있다.
명칭 | pg_catalog View | pg_stat_statements | pg_store_plans |
주요 정보 | DB / Object 통계 (옵티마이저 실행계획 수립의 근거 데이터가 됨) |
SQL 실행 통계 | SQL 실행 계획 통계 |
적용 범위 | 개발/운영 | 개발/운영 | 개발/운영 |
적용방법 | 기본 제공 | 1) extension 설치 2) shared_preload_libraries 적용 3) create extension |
1) tool 설치 2) shared_preload_libraries 적용 |
모니터링 방법 | SQL | SQL | SQL |
통계수집 시작 지점 | DB 기동시 | pg_stat_statements.save=on일 경우, DB가 종료되더라도 저장됨. off 지정시 DB재실행시 초기화됨 | |
수동 데이터 초기화 | SELECT pg_stat_reset(); --수행안됨 |
select pg_stat_statements_reset(); | |
off 기능 | 해당안됨 | drop extension | drop extension |
스키마 | pg_catalog | pg_catalog | pg_catalog |
주요 View | pg_stat_activity pg_stat_all_indexes pg_stat_all_tables pg_stat_archiver pg_stat_bgwriter pg_stat_database pg_stat_database_conflicts pg_stat_progress_vacuum pg_stat_replication pg_stat_ssl pg_stat_subscription pg_stat_sys_indexes pg_stat_sys_tables pg_stat_user_functions pg_stat_user_indexes pg_stat_user_tables pg_stat_wal_receiver pg_stat_xact_all_tables pg_stat_xact_sys_tables pg_stat_xact_user_functions pg_stat_xact_user_tables pg_statio_all_indexes pg_statio_all_sequences pg_statio_all_tables pg_statio_sys_indexes pg_statio_sys_sequences pg_statio_sys_tables pg_statio_user_indexes pg_statio_user_sequences pg_statio_user_tables |
pg_stat_statements | pg_store_plans |
6. PostgreSQL 모니터링(추가 스키마)
Postgresql의 특정 Extensions의 경우, 별도의 스키마를 생성하여 해당 스키마에 성능 진단에 필요한 다양한 오브젝트를 생성하여 시계열 데이터 저장을 지원한다. 대표적으로 pg_statsinfo, pg_awr이 있으며 여기서는 pg_statsinfo에 대해 소개한다. pg_statsinfo는 pg_stats_reporter라는 확장 유틸리티를 통해 UI 및 Report를 제공하는데, 아래 표는 Report에서 제공하는 내용이다.
보고서 유형 | 카테고리 이름 | 표제 | 함유량 |
Summary | Summary | Database System ID | 데이터베이스 클러스터 고유 ID |
Host | 호스트 이름 | ||
Port | PostgreSQL의 가동 포트 번호 | ||
PostgreSQL Version | PostgreSQL 버전 | ||
Snapshot Begin | 보고 기간의 시작 날짜 | ||
Snapshot End | 보고 기간의 끝 날짜 | ||
Snapshot Duration | 보고 기간의 간격 | ||
Total Database Size | 전체 데이터베이스의 크기 | ||
Total Commits | 전체 데이터베이스의 커밋 된 트랜잭션 수 | ||
Total Rollbacks | 전체 데이터베이스 롤백 된 트랜잭션 수 | ||
Alert | DateTime | 스냅 숏 시간 | |
Message | 경고 메시지 | ||
Database Statistics | Database Statistics | Database Name | 데이터베이스 이름 |
Database Size | 데이터베이스 크기 [MiB] | ||
Database Size Increase | 데이터베이스 크기의 증 분량 [MiB] | ||
Commit/s | 초당 커밋 된 트랜잭션 수 | ||
Rollback/s | 초당 롤백 된 트랜잭션 수 | ||
Cache Hit Ratio | 캐시 적중률 | ||
Block Read/s (disk+cache) | 초당 디스크와 캐시로부터 읽어 들인 블록 수 | ||
Block Read/s (disk) | 초당 디스크에서 읽은 블록 수 | ||
Rows Read/s | 초당에 테이블 + 인덱스로부터 읽어 들인 행 | ||
Temporary Files | 임시 파일의 파일 수 | ||
Temporary Bytes | 임시 파일의 파일 크기 [MiB] | ||
Deadlocks | 교착 상태의 총 | ||
Block Read Time | 데이터 파일을로드하는 데 걸린 시간 [석사] | ||
Block Write Time | 데이터 파일 쓰기에 걸린 시간 [석사] | ||
Transaction Statistics | DateTime | 스냅 숏 시간 | |
Database | 데이터베이스 이름 | ||
Commit/s | 초당 커밋 된 트랜잭션 수 | ||
Rollback/s | 초당 롤백 된 트랜잭션 수 | ||
Database Size | DateTime | 스냅 숏 시간 | |
Database | 데이터베이스 이름 | ||
Size | 데이터베이스 크기 [MiB] | ||
Recovery Conflicts | Database | 데이터베이스 이름 | |
Conflict Tablespace | 테이블 스페이스 삭제와 충돌하여 쿼리 취소 수 | ||
Conflict Lock | 락 경합에 의한 쿼리 취소 수 | ||
Conflict Snapshot | VACUUM과의 경쟁에 의한 쿼리 취소 수 (쿼리가 참조중인 행을 VACUUM이 제거 된 경우) |
||
Conflict Bufferpin | VACUUM과의 경쟁에 의한 쿼리 취소 수 (쿼리가 사용중인 페이지를 VACUUM이 제거 된 경우) |
||
Conflict Deadlock | 교착 상태와 충돌하여 쿼리 취소 수 | ||
Instance Activity | WAL Statistics (1) | WAL Write Total | WAL 출력량 총 [MiB] |
WAL Write Speed | 초당 WAL 출력량 평균 [MiB / s] | ||
WAL Archive Total | 아카이브에 성공한 WAL 파일의 수 | ||
WAL Archive Failed | 아카이브에 실패한 횟수 | ||
WAL Statistics (2) | DateTime | 스냅 숏 시간 | |
Location | WAL의 기입 위치 (LSN) | ||
Segment File | WAL 세그먼트 파일 이름 | ||
Write Size | WAL 출력량 [MiB] | ||
Write Size/s | 초당 WAL 출력량 [MiB / s] | ||
Last Archived WAL | 마지막으로 아카이브 된 WAL 파일 이름 | ||
Instance Processes | DateTime | 스냅 숏 시간 | |
Idle | 대기 중 (명령 대기 상태) 백엔드 프로세스의 비율 | ||
Idle In Xact | 트랜잭션에서 대기중인 (명령 대기 상태) 백엔드 프로세스의 비율 | ||
Waiting | 잠금 대기 상태의 백엔드 프로세스의 비율 | ||
Running | 트랜잭션 실행중인 백엔드 프로세스의 비율 | ||
BGWriter Statistics | Written Buffers By BGWriter (Average) | 백그라운드 라이터가 초당에 내 보낸 버퍼 수의 평균치 | |
Written Buffers By BGWriter (Maximum) | 백그라운드 라이터가 초당에 내 보낸 버퍼의 최대 값 | ||
Written Buffers By Backend (Average) | 백엔드가 초당에 내 보낸 버퍼 수의 평균치 | ||
Written Buffers By Backend (Maximum) | 백엔드가 초당에 내 보낸 버퍼의 최대 값 | ||
Backend Executed fsync (Average) | 백엔드가 초당 실행 된 fsync의 평균 개수 | ||
Backend Executed fsync (Maximum) | 백엔드가 초당 실행 된 fsync의 최대 값 | ||
OS Resource Usage | CPU usage + Load Average | DateTime | 스냅 숏 시간 |
User | 사용자 모드에서 CPU를 소비 한 시간의 비율 | ||
System | 시스템 모드에서 CPU를 소비 한 시간의 비율 | ||
Idle | 작업 대기 CPU를 소비 한 시간의 비율 | ||
IOwait | 입출력의 완료 대기 CPU를 소비 한 시간의 비율 | ||
Loadavg1 | 지난 1 분간의로드 애버리지 | ||
Loadavg5 | 지난 5 분간의 평균 부하 | ||
Loadavg15 | 과거 15 분간의로드 애버리지 | ||
IO usage | Device | 장치 이름 | |
Including TableSpaces | 장치에 포함 된 테이블 공간 | ||
Total Read | 읽어 들인 총 크기 [MiB] | ||
Total Write | 쓴 총 크기 [MiB] | ||
Total Read Time | 읽기에 걸린 총 시간 [석사] | ||
Total Write Time | 쓰기에 걸린 총 시간 [석사] | ||
Current IO Queue | 현재 실시중인 I / O (큐잉 된) 수 | ||
Total IO Time | 입출력에 걸린 총 시간 [석사] | ||
IO usage | DateTime | 스냅 숏 시간 | |
Device | 장치 이름 | ||
Read Size/s (Peak) | 초당에 가져온 크기와 최대 값 [KiB] | ||
Write Size/s (Peak) | 초당에 쓴 크기와 최대 값 [KiB] | ||
Read Time Rate | 초당에로드하는 데 걸린 시간의 비율 | ||
Write Time Rate | 초당 쓰기에 걸린 시간의 비율 | ||
Memory Usage | DateTime | 스냅 숏 시간 | |
Memfree | 사용 가능한 메모리 크기 [MiB] | ||
Buffers | 버퍼 캐시 크기 [MiB] | ||
Cached | 페이지 캐시에서 버퍼 캐시를 제외한 크기 [MiB] | ||
Swap | 스왑 사용량 [MiB] | ||
Dirty | 더티 페이지 크기 [MiB] | ||
Disk Usage per Tablespace | Tablespace | 테이블 공간 이름 | |
Location | 테이블 공간 저장 디렉토리 이름 | ||
Device | 테이블 공간 저장 디렉토리 장치 (디스크)의 장치 번호 | ||
Used | 테이블 공간 저장 디렉토리 장치의 사용 된 크기 [MiB] | ||
Avail | 테이블 공간 저장 디렉토리 장치의 사용 가능한 크기 [MiB] | ||
Remain | 테이블 공간 저장 디렉토리의 장치에서 사용 가능한 공간의 비율 | ||
Disk Usage per Table | Database | 데이터베이스 이름 | |
Schema | 스키마 이름 | ||
Table | 테이블 이름 | ||
Size | 테이블 크기 [MiB] | ||
Table Reads | 테이블 블록 추출 요청에서 디스크로부터 읽어 들인 블록 수 | ||
Index Reads | 인덱스 블록 추출 요청에서 디스크로부터 읽어 들인 블록 수 | ||
Toast Reads | TOAST 테이블의 블록 추출 요청에서 디스크로부터 읽어 들인 블록 수 | ||
Long Transactions | PID | 긴 트랜잭션 백엔드 프로세스의 PID | |
Client Address | 긴 트랜잭션 백엔드 프로세스의 연결 소스 (클라이언트)의 주소 | ||
Xact Start | 긴 트랜잭션의 시작 날짜 | ||
Duration | 긴 트랜잭션의 존속 기간 [초] | ||
Query | 긴 트랜잭션의 소개 문장 | ||
Notable Tables | Heavily Updated Tables | Database | 데이터베이스 이름 |
Schema | 스키마 이름 | ||
Table | 테이블 이름 | ||
INSERT Rows | 테이블에 삽입 된 행 수 | ||
UPDATE Rows | 테이블에서 업데이트 된 행 (HOT 업데이트 포함) | ||
DELETE Rows | 테이블에서 삭제 된 행 수 | ||
Total Rows | 테이블에 삽입 / 업데이트 / 삭제 된 행 수의 합계 | ||
HOT Ratio(%) | 테이블에서 업데이트 된 행 중 HOT 업데이트 된 행의 비율 | ||
Heavily Accessed Tables | Database | 데이터베이스 이름 | |
Schema | 스키마 이름 | ||
Table | 테이블 이름 | ||
Seq Scans | 순차적 검사 실행 횟수 | ||
Read Rows | 순차 검색을 통해 읽은 행 수 | ||
Read Rows/Scan | 순차 검색 1 회당 읽은 행 수 | ||
Cache Hit Ratio(%) | 캐시 적중률 | ||
Low Density Tables | Database | 데이터베이스 이름 | |
Schema | 스키마 이름 | ||
Table | 테이블 이름 | ||
Live Tuples | 테이블 내의 유효한 행 | ||
Logical Pages | 레코드 수가 논리적으로 차지하는 페이지 수 | ||
Physical Pages | 레코드 수가 실제로 차지하고있는 페이지 수 | ||
Logical Page Ratio(%) | 논리적으로 차지하는 페이지 수의 비율 | ||
Fragmented Tables | Database | 데이터베이스 이름 | |
Schema | 스키마 이름 | ||
Table | 테이블 이름 | ||
Column | 컬럼 이름 | ||
Correlation | 물리적 순서와 논리적 인 순서에 상관 | ||
Checkpoint Activity | Checkpoint Activity | Total Checkpoints | 체크 포인트가 실행 된 횟수 |
Checkpoints By Time | checkpoint_timeout 계기로 실행 된 체크 포인트의 횟수 | ||
Checkpoints By XLOG | checkpoint_segments 계기로 실행 된 체크 포인트의 횟수 | ||
Written Buffers Average | 보낸 버퍼 크기의 평균치 | ||
Written Buffers Maximum | 보낸 버퍼의 최대 크기 | ||
Write Duration Average | 처리 시간의 평균값 [초] | ||
Write Duration Maximum | 처리 시간의 최대 값 (초) | ||
Autovacuum Activity | Vacuum Basic Statistics (Average) | Table | 테이블 이름 |
Count | autovacuum이 실행 된 횟수 | ||
Removed Rows | 삭제 된 튜플 수의 평균치 | ||
Remain Rows | 잔존하는 튜플 수의 평균치 | ||
Remain Dead | 회수하지 못한 잘못된 튜플 수의 평균치 | ||
Index Scans | 인덱스 스캔의 실시 횟수의 평균값 | ||
Duration | 처리 시간의 평균값 [초] | ||
Duration(Max) | 처리 시간의 최대 값 (초) | ||
Cancels | autovacuum이 취소 된 횟수 | ||
Vacuum I/O Statistics (Average) | Table | 테이블 이름 | |
Page Hit | page_hit 평균 | ||
Page Miss | page_miss 평균 | ||
Page Dirty | page_dirty 평균 | ||
Read Rate | read_rate 평균 | ||
Write Rate | write_rate 평균 | ||
Analyze Statistics | Table | 테이블 이름 | |
Count | autoanalyze가 실행 된 횟수 | ||
Duration(Total) | 처리 시간의 합계 (초) | ||
Duration(Avg) | 처리 시간의 평균값 [초] | ||
Duration(Max) | 처리 시간의 최대 값 (초) | ||
Last Analyze Time | autoanalyze의 마지막 실행 | ||
Cancels | autoanalyze이 취소 된 횟수 | ||
Mod Rows(Max) | 마지막 analyze 이후 수정 된 튜플 수의 최대 값 | ||
Query Activity | Functions | OID | 함수의 OID |
Database | 데이터베이스 이름 | ||
Schema | 스키마 이름 | ||
Function | 함수 이름 | ||
Calls | 함수가 호출 된 횟수 | ||
Total Time | 전체 기능 (함수 내에서 호출 된 다른 함수를 포함)의 누적 소비 시간 [석사] | ||
Self Time | 함수 단위의 누적 소비 시간 [석사] | ||
Time/Call | 1 회 함수 실행 당 소비 시간 [석사] | ||
Statements | User | 문의 문을 실행 한 사용자의 이름 | |
Database | 문의 문장이 실행 된 데이터베이스 이름 | ||
Calls | 문의 문장이 실행 된 횟수 | ||
Total Time | 문의 문장의 누적 소비 시간 [초] | ||
Time/Call | 1 번 질문 문장 실행 당 소비 시간 [초] | ||
Block Read Time | SQL 문이 블록 읽기에 소요 된 총 시간 [석사] | ||
Block Write Time | SQL 문이 블록 쓰기에 걸린 총 시간 [석사] | ||
Query | 문의 문 | ||
Plans | Query ID | SQL 문 식별자 | |
Plan ID | 실행 계획의 식별자 | ||
User | 문의 문을 실행 한 사용자의 이름 | ||
Database | 문의 문장이 실행 된 데이터베이스 이름 | ||
Calls | 문의 문장이 실행 된 횟수 | ||
Total Time | 문의 문장의 누적 소비 시간 [초] | ||
Time/Call | 1 번 질문 문장 실행 당 소비 시간 [초] | ||
Block Read Time | SQL 문이 블록 읽기에 소요되는 총 시간 [석사] | ||
Block Write Time | SQL 문이 블록 쓰기에 지출 총 시간 [석사] | ||
Lock Conflicts | Lock Conflicts | Database | 잠금 대기가 발생하는 개체가 속한 데이터베이스 이름 |
Schema | 잠금 대기가 발생하는 개체가 속한 스키마 이름 | ||
Relation | 잠금 대기가 발생하는 개체 이름 | ||
Duration | 잠금 대기가 발생 후 경과 시간 | ||
Blockee PID | 잠금 대기 백엔드 PID | ||
Blocker PID | 잠금 원래 백엔드 PID | ||
Blocker GID | 잠금 원래 백엔드 GID | ||
Blockee Query | 잠금 대기 트랜잭션에서 실행되는 쿼리 | ||
Blocker Query | 잠금 원래 트랜잭션에서 실행 한 쿼리 목록 | ||
Replication Activity | Current Replication Status | User Name | 아이디 |
Application Name | 응용 프로그램 이름 | ||
Client Address | 대기의 IP 주소 | ||
Client Host | 대기의 호스트 이름 | ||
Client Port | 현재 연결된 포트 번호 | ||
Backend Start | walsender 시작 시간 | ||
WAL Sender State | walsender 상태 | ||
Current WAL Location | WAL의 현재의 기입 위치 | ||
Sent WAL Location | WAL 전송 완료 위치 | ||
Write WAL Location | 대기의 WAL 쓰기 완료 위치 (LSN 및 WAL 파일 이름) | ||
Flush WAL Location | 대기의 WAL 플래시 완료 위치 (LSN 및 WAL 파일 이름) | ||
Replay WAL Location | 대기의 WAL의 REDO 완료 위치 (LSN 및 WAL 파일 이름) | ||
Sync Priority | 동기화 복제 우선 순위 | ||
Sync State | 복제 동기화 모드 | ||
Replay Delay Average | 마스터 - 대기 간의 복구 지연 량의 평균치 | ||
Replay Delay Peak | 마스터 - 대기 간의 복구 지연 량의 피크 값 | ||
Write Lag Time | 마스터에 WAL를 플러시 후 그것이 대기의 WAL에 기록되었다는 통지를받을 때까지의 경과 시간 | ||
Flush Lag Time | 마스터에 WAL를 플러시 후 그것이 대기의 WAL에 REDO되었다는 통지를받을 때까지의 경과 시간 | ||
Replay Lag Time | 마스터에 WAL를 플러시 후 그것이 대기의 WAL 플래시되었다는 통지를받을 때까지의 경과 시간 | ||
Setting Parameters | Setting Parameters | Name | 매개 변수 이름 |
Setting | 매개 변수 값 | ||
unit | 암시 적 매개 변수의 단위 | ||
Source | 현재 매개 변수 값의 소스 (변경 방법) | ||
Schema Information | Tables | Database | 데이터베이스 이름 |
Schema | 스키마 이름 | ||
Table | 테이블 이름 | ||
Columns | 열 수 | ||
Rows | 튜플 수 | ||
Size | 테이블 크기 [MiB] | ||
Size Incr | 테이블 크기의 증 분량 [MiB] | ||
Table Scans | 시퀀셜 스캔이 실행 된 횟수 | ||
Index Scans | 인덱스 스캔이 실행 된 횟수 | ||
Indexes | Database | 데이터베이스 이름 | |
Schema | 스키마 이름 | ||
Index | 인덱스 이름 | ||
Table | 인덱스가 참조하는 테이블 이름 | ||
Size | 인덱스 크기 [MiB] | ||
Size Incr | 인덱스 크기의 증 분량 [MiB] | ||
Index Scans | 인덱스 스캔의 실행 횟수 | ||
Rows/Scan | 1 번 인덱스 스캔 당에서 반환 된 행 수 | ||
Disk Reads | 디스크로부터 읽어 들인 블록 수 | ||
Cache Reads | 캐시로부터 읽어 들인 블록 수 | ||
Index Key | 인덱스의 키 값 (컬럼 이름 또는 괄호에 둘러싸인 식) | ||
Profiles | Profiles | Processing | 처리 명 |
Executes | 작업을 수행 한 횟수 |
7. 통합 모니터링 Tools 활용
클라우드 서비스, 도커 및 쿠버네틱스, 마이크로 서비스 아키텍처가 대중화되면서 다양한 인프라 자원들을 통합적으로 모니터링할 수 있는 오픈소스 도구들이 출시 및 프로덕트 환경에서도 활용되어 가고 있다. 그 중 대표적인 도구가 프로메테우스이다. PostgreSQL도 postgres_exporter라는 Agent를 통해 데이터 수집이 가능하다. 프로메테우스에 시계열로 저장되는 데이터를 그라파나 또는 node.js를 통한 UI 개발 등을 통해 시각화하여 모니터링 툴로 활용될 수 있다. 프로메테우스의 Default DB인 TSDB를 PostgreSQL로도 변경할 수 있어, 기존의 pg_catalog 또는 확장 스키마를 통한 데이터 정보들을 프로메테우스로 수집한 정보들과 조인하여 One Query로도 활용 가능하다.
8. 결론
오픈소스 DBMS의 양대산맥은 PosgreSQL과 MySQL이라 할 수 있다. AWS, Azure, GCP 같은 글로벌 클라우드 벤더사에서도 기본적으로 이 DBMS들을 제공하고 있고, 심지어 이를 기반으로 한 완전관리형 자체 DBMS도 개발하여 제공되고 있다.
국내에서 아직까지는 OLTP 환경에 보다 특화되고, 개발자들이 보다 더 선호하는 MySQL의 점유율이 더 높긴 하나, 클라우드와 데이터 분석 시장 규모가 확장되면서 PostgreSQL에 대한 관심과 활용 빈도가 점점 높아지고 있다.
PostgreSQL의 최고 장점은 확장성에 있으며, 성능 진단 및 튜닝 분야에 활용할 수 있는 Extensions들도 무척 다양하다. 본문에 소개한 내용들은 일부일 뿐이다. 물론 상용 제품들에 비해 다소 손속이 있을 수 있으나, 우리에게 필요한 건 알지도, 쓰지도 못하는 기능들이 아니라 내가 필요로 하는 기능이 있는지 확인하고 테스트해 보는 것이다.
글 : 최광석 수석보 ( 비트나인 DB Tech팀 )
'POSTGRESQL' 카테고리의 다른 글
PostgreSQL - LogCollector (0) | 2023.08.29 |
---|---|
PostgreSQL - Vacuum의 A to the Z (0) | 2023.08.29 |
PostgreSQL을 C언어로 사용해보자. (0) | 2023.08.28 |
PostgreSQL Extension 소개 (0) | 2023.08.28 |
가장 많이 사용하는 PostgreSQL의 오픈소스 익스텐션은? (0) | 2023.08.28 |