Shared Memory
데이터베이스 기동 시 공용 메모리 공간인 Shared Memory가 할당
모든 backend 프로세스들에 의해 공유되는 공간
1) Shared Buffers
데이터 변경 사항을 Block 단위로 저장하여 물리적 I/O를 하지 않아 데이터 처리를 빠르게 함
postgres=# show shared_buffers;
shared_buffers
----------------
128MB
--* Shared buffer 크기 : 128MB = 16384 * 8KB
postgres=# select name, setting from pg_settings where name = 'shared_buffers';
name | setting
----------------+---------
shared_buffers | 16384
* DB 정보로부터 물리적 읽기 개수와 논리적 읽기 개수 조회
postgres=# select datname as "database",
postgres-# blks_hit as "메모리읽기",
postgres-# blks_read as "물리적읽기"
postgres-# from pg_stat_database;
database | 메모리읽기 | 물리적읽기
-------------+------------+------------
| 1414 | 14
postgres | 3435 | 159
pgbenchtest | 3144 | 134
template1 | 3996 | 71
template0 | 0 | 0
(5 rows)
데이터를 조회하면서 한번도 access하지 않은 데이터는 디스크로 부터 읽고 읽은 데이터는 Shared Buffers에 읽어
데이터를 클라이언트에게 전송함
2) WAL Buffers
데이터변경에 대한 트랜잭션 정보를 저장하며, 이후 WAL FILE에 저장되어 데이터베이스 복구시 사용된다.
WAL 파일은 WAL Writer에 의해 저장되며 많은 트랜잭션 발생시, 주기적 저장, commit 발생시 저장된다.
postgresql.conf 파일에 wal_buffers = -1 설정은 디폴트 값이다. shared buffer 값에 따라 자동 설정됨을 의미
postgres=# show wal_buffers;
wal_buffers
-------------
4MB
postgres=# select name, setting from pg_settings where name = 'wal_buffers';
name | setting
-------------+---------
wal_buffers | 512
--*WAL Buffers 크기 : 4MB = 512 * 8KB
select - shared buffer / dml - shared buffer, wal log
변경된 데이터는 shared buffer에 저장되고 , 변경된 데이터의 트랜잭션로그는 wal buffer에 저장
3) CLOG Buffers
각 트랜잭션의 상태 정보를 저장하는 공간
4) lock space
트랜잭션을 보호하기 위해 lock정보 저장하는 shared memory 내 프로세스
* Blocking, Blocked 쿼리 확인
SELECT blocked.pid,
blocked.usename,
blocked.query AS blocked_query,
blocking.pid AS blocking_pid,
blocking.query AS blocking_query
FROM pg_stat_activity AS blocked
JOIN pg_stat_activity AS blocking ON blocking.pid = ANY(pg_blocking_pids(blocked.pid))
WHERE CARDINALITY(pg_blocking_pids(blocked.pid)) > 0;
Local Memory
클라이언트가 데이터베이스 접속 요청시 Backend 프로세스를 위한 Local Memory도 할당한다.
Local Memory는 세션별로 SQL문을 처리할 수 있는 메모리를 할당한다.
1) Maintenance_work_memory
Vacuum 관련 작업, 인덱스 생성, 테이블 변경, FK 추가(존재여부 확인하는 공간) 등의 작업에 사용되는 공간
2) Temp_buffers
세션단위로 처리할 수 있는 temporary 테이블에 대한 공간으로 세션 종료시 자동 삭제된다.
3) work_mem
sql문에서 group by 와 order by, sort와 hash 작업을 하기위한 메모리 공간이다.
work_memory 공간부족시 Temp 파일을 사용
4) Catalog_cache
DB정보와 DB 구조와 상태에 대한 정보인 메타 데이터를 조회 할 때 사용하는 시스템 카탈로그를 이용하기 위한 공간
5) Optimize / executor
수행된 SQL문에 대한 최적의 실행계획 수립, 실행계획에 따른 실행 담당 메모리 공간
* 시스템 자원 사용량 확인 (vmstat)
Local Memory 할당에 따른 Memory 변화 실습
( 세션1,2,3 명령어 순차 실행 )
###세션1
postgres@ubuntu:~$ vmstat 1 100
procs -----------memory---------- ---swap-- -----io---- -system-- -------cpu-------
r b swpd free buff cache si so bi bo in cs us sy id wa st gu
1 0 0 3150904 23672 380196 0 0 121 20 148 0 1 1 98 0 0 0
0 0 0 3150652 23680 380200 0 0 0 40 120 173 0 1 99 0 0 0
10 0 0 3089716 23692 417556 0 0 12292 13656 9322 15572 37 50 10 4 0 0
11 0 0 3058820 23692 456000 0 0 12560 15288 10855 17627 36 60 4 1 0 0
10 0 0 3022032 23700 501656 0 0 15176 18616 11684 21022 43 53 3 2 0 0
7 3 0 2994568 23708 529996 0 0 9544 11912 8576 13745 36 60 3 1 0 0
8 0 0 2906376 23724 619920 0 0 7560 8624 6656 10722 31 65 4 1 0 0
8 0 0 2885460 23724 640300 0 0 7008 8160 5968 10693 32 61 6 1 0 0
9 0 0 2866812 23724 660312 0 0 7104 8016 7332 10759 30 63 5 2 0 0
0 0 0 2747252 23756 792972 0 0 0 1064 279 193 0 2 98 0 0 0
0 0 0 2747000 23756 793000 0 0 0 1024 275 190 0 2 98 0 0 0
##세션2
#10개 작업에 4개 스레드 1000트랜잭션
postgres@ubuntu:~$ pgbench -c 10 -j 4 -t 1000 pgbenchtest
pgbench (15.8 (Ubuntu 15.8-1.pgdg24.04+1))
starting vacuum...end.
transaction type: <builtin: TPC-B (sort of)>
scaling factor: 50
query mode: simple
number of clients: 10
number of threads: 4
maximum number of tries: 1
number of transactions per client: 1000
number of transactions actually processed: 10000/10000
number of failed transactions: 0 (0.000%)
latency average = 17.099 ms
initial connection time = 25.987 ms
tps = 584.837868 (without initial connection time)
postgres@ubuntu:~$
##세션3
postgres@ubuntu:~$ ps -ef | grep postgres
..
postgres 2114 1757 27 23:18 pts/3 00:00:00 /usr/lib/postgresql/15/bin/pgbench -c 10 -j 4 -t 1000 pgbenchtest
postgres 2119 1083 14 23:18 ? 00:00:00 postgres: 15/main: postgres pgbenchtest [local] UPDATE
postgres 2120 1083 16 23:18 ? 00:00:00 postgres: 15/main: postgres pgbenchtest [local] idle
postgres 2121 1083 14 23:18 ? 00:00:00 postgres: 15/main: postgres pgbenchtest [local] UPDATE
postgres 2122 1083 16 23:18 ? 00:00:00 postgres: 15/main: postgres pgbenchtest [local] idle in transaction
postgres 2123 1083 15 23:18 ? 00:00:00 postgres: 15/main: postgres pgbenchtest [local] UPDATE
postgres 2124 1083 15 23:18 ? 00:00:00 postgres: 15/main: postgres pgbenchtest [local] UPDATE
postgres 2125 1083 16 23:18 ? 00:00:00 postgres: 15/main: postgres pgbenchtest [local] COMMIT
postgres 2126 1083 15 23:18 ? 00:00:00 postgres: 15/main: postgres pgbenchtest [local] idle in transaction
postgres 2127 1083 15 23:18 ? 00:00:00 postgres: 15/main: postgres pgbenchtest [local] UPDATE
postgres 2128 1083 16 23:18 ? 00:00:00 postgres: 15/main: postgres pgbenchtest [local] UPDATE
postgres 2129 1912 80 23:18 pts/5 00:00:00 ps -ef
Process
데이터베이스가 기동되면 데이터와 트랜잭션을 처리할 수 있는 메모리가 할당되며, 세션에서 요청한 SQL문에 대하여 처리하기 위한 프로세스 그리고 세션의 트랜잭션에 대하여 변경된 데이터처리와 종료된 트랜잭션의 데이터처리를 위한 프로세스가 기동된다.
1) Daemon Process
OS에서 확인 : ps -ef | grep postgres
서버가 시작될 때 가장 먼저 실행되는 프로세스는 postgres ( 과거 버전 postmaster, 15버전부터 postgres )
Postgres(Daemon)프로세스는 System 프로세스로부터 만들어지고, Postgres (Daemon) 프로세스는 Background 프로세스를 만든다.
2) Backend Process
client가 요청한 sql 및 command 처리하는 프로세스로 client와 연결이 끊어지면 종료된다.
max_connections 수치만큼 client 동시 연결 가능하다
3) BG Writer
변경된 데이터들은 모두 Shared Buffer에 적용되며, 변경 데이터들은 어느 시점에 프로세스 BG Writer에 의해 Disk상에 존재하는 테이블에 WRITE 된다.
오라클의 DBWR 프로세스와 유사
bgwriter_delay(200ms) 주기로 최대 bgwriter_lru_maxpages(100 pages) 를 디스크에 기록함
주기적으로 BG Writer가 Dirty Block을 디스크에 기록하면, checkpoint 발생시 Flush해야하는 dirty block의 양을 줄일 수 있어 안정적인 I/O 유지가능하다
4) Checkpointer
많은 세션으로부터 요청된 데이터변경에 대하여 데이터베이스의 동기화를 위해 체크포인트를 발생시켜 Checkpointer 프로세스가 데이터변경에 대한 동기화정보를 Data File과 pg_control 영역에 저장한다.(해당 시점까지의 체크포인트 레코드를 파일에 기록
ㅇCheckpoint 발생 조건
- 이전 Checkpoint 발생 이후 check_timeout(5분)의 시간이 지난 경우 (기록된 WAL 있는 경우)
- WAL 파일의 크기가 max_wal_size를 초과하는 경우
- smart 또는 fast 모드로 Database Server 종료하는 경우
- pg_basebackup 또는 pg_start_backup으로 백업을 시작하는 경우
- super 유저에 의해 checkpoint Command 실행한 경우
5) WAL Writer
WAL Buffers에 있는 트랜잭션에 대한 정보는 WAL Writer 프로세스에 의해 WAL File에 저장된다.
WAL Writer는 트랜잭션 commit, 로그파일 공간이 모두 다 찼을 때 WAL Buffer를 디스크(WAL 파일)에 내려쓰며, WAL 파일은 Database를 복구하는데 사용한다.
* WAL Files 확인
postgres@ip-10:~/15/main/pg_wal$ cd $PGDATA/pg_wal
postgres@ip-10:~/15/main/pg_wal$ ls
000000010000000000000016 000000010000000000000019 00000001000000000000001C 00000001000000000000001F 000000010000000000000022
000000010000000000000017 00000001000000000000001A 00000001000000000000001D 000000010000000000000020 000000010000000000000023
000000010000000000000018 00000001000000000000001B 00000001000000000000001E 000000010000000000000021 archive_status
postgres@ip-10:~/15/main/pg_wal$ pwd
/var/lib/postgresql/15/main/pg_wal
* iotop 활용한 wal writer확인
##세션1
root@ip-10:~# apt install iotop
..
##세션2
postgres@ip-10:~/15/main/pg_wal$ pgbench -i -s 50 pgbenchtest
##세션1
root@ip-10:~# iotop -o -a
6) Archiver
데이터베이스가 아카이브모드일 경우 WAL File 쓰기가 마치면 Archiver 프로세스에 의해 Archive File로 COPY된다.
Database 전체 백업이 있으면 Archive 파일을 이용하여 데이터베이스 CRASH시점 또는 특정 시점(PITR: Point-In-Time-Recovery)으로 복구 가능하다
7) stats collector
인스턴스의 사용 통계를 수집하는 작업 담당
8) wal receiver
복제본에서 WAL 항목을 받는 작업 담당
9) autovacuum
테이블과 인덱스에서 오래된 데이터를 제거하는 작업 담당
각 프로세스는 설정 파라미터에 의해 관리되며, 때때로 수십 개의 파라미터에 의해 조정된다.
이런 프로세스 중 일부는 작업이 완료되면 종료되며, 일부는 계속해서 백그라운드에서 실행된다.
출처 : 위데이터랩 ( PostgreSQL Admin 과정 ), https://blog.ex-em.com/1645
'DATABASE > Postgresql' 카테고리의 다른 글
[PostgreSQL] routines ( function, procedure ..) 기본 권한 설정과 관리 (3) | 2024.09.30 |
---|