About
home
Tmax OpenSQL
home
๐Ÿ’Ž

16. PostgreSQL์˜ Virtual File Descriptor

์ž‘์„ฑ์ž
SJH

Overview

PostgreSQL์˜ ๊ฒฝ์šฐ ํ…Œ์ด๋ธ” ์˜ค๋ธŒ์ ํŠธ(table object) ๋งˆ๋‹ค ์ตœ์†Œ ํ•œ ๊ฐœ์˜ ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— Oracle์ด๋‚˜ Tibero์— ๋น„ํ•ด ์ƒ๋Œ€์ ์œผ๋กœ ๋งŽ์€ ์ˆ˜์˜ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ(file descriptor, ์ดํ›„ FD)๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” OS๋‚˜ ์ปค๋„ ์„ค์ •์— ๋”ฐ๋ผ โ€œToo many open filesโ€ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— PostgreSQL์—์„œ๋Š” ๊ฐ€์ƒ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ(virtual file descriptor, ์ดํ›„ VFD) ๋ชจ๋“ˆ์„ ํ†ตํ•ด FD์— ๋Œ€ํ•œ ๊ด€๋ฆฌ๋ฅผ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

Virtual file descriptor

PostgreSQL์—์„œ FD๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด VFD ๋ชจ๋“ˆ์—์„œ๋Š” ํš๋“ํ•œ FD๋ฅผ ์บ์‹ฑ(caching)ํ•˜๊ณ , ํ”„๋กœ์„ธ์Šค๋งˆ๋‹ค ๋™์‹œ์— ์–ป์„ ์ˆ˜ ์žˆ๋Š” FD์˜ ์ˆ˜๋ฅผ ์ œํ•œํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์š”์ฒญ๋œ ํŒŒ์ผ์˜ ์ˆ˜๊ฐ€ ์ œํ•œ๋œ ์ˆ˜๋ฅผ ๋„˜์„ ๊ฒฝ์šฐ VFS ๋‚ด๋ถ€์—์„œ๋Š” LRU(least recently used) ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ด ๊ธฐ์กด์— ์บ์‹ฑ๋˜์—ˆ๋˜ FD๋ฅผ ์ •๋ฆฌํ•˜๊ณ  ์ƒˆ๋กœ์šด FD๋ฅผ ํš๋“ํ•ฉ๋‹ˆ๋‹ค. ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ๋ชจ๋“ˆ์—์„œ๋Š” VFD ๋ชจ๋“ˆ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ํŒŒ์ผ์„ ์—ด๊ณ , ๋‹ซ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

max_files_per_process

PostgreSQL์€ ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค์—์„œ ๋™์‹œ์— ์—ด ์ˆ˜ ์žˆ๋Š” ํŒŒ์ผ์˜ ์ตœ๋Œ€ ์ˆ˜๋ฅผ max_files_per_process ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ํ†ตํ•ด ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 1000์ด๋ฉฐ, 64๋ถ€ํ„ฐ INT_MAX(2147483647)๊นŒ์ง€ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ˆ˜์ •ํ•œ ๊ฐ’์„ ์ ์šฉํ•˜๋ ค๋ฉด PostgreSQL ์„œ๋ฒ„๋ฅผ ์žฌ์‹œ์ž‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ…Œ์ŠคํŠธ ๋ฐ ๊ฒ€์ฆ

max_file_per_process๋ฅผ 64๋กœ ์„ค์ •ํ•˜๊ณ  PSQL๋กœ ์ ‘์†ํ•œ ๋ฐฑ์—”๋“œ ํ”„๋กœ์„ธ์Šค(backend process)๊ฐ€ ์ตœ๋Œ€๋กœ ํš๋“ํ•œ FD์˜ ์ˆ˜๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
1. max_files_per_process ํŒŒ๋ผ๋ฏธํ„ฐ ์„ค์ •
โ€ข
์ผ๋‹จ max_files_per_process๋ฅผ ์ตœ์†Œ๊ฐ’์ธ 64๋กœ ์„ค์ •ํ•œ ํ›„, PostgreSQL ์„œ๋ฒ„๋ฅผ ์žฌ๊ธฐ๋™ํ•ฉ๋‹ˆ๋‹ค.
$ vi $PGDATA/postgresql.conf # ์•„๋ž˜ ํŒŒ๋ผ๋ฏธํ„ฐ ์„ค์ •์„ ์ถ”๊ฐ€ max_files_per_process = 64 $ pg_ctl restart
Bash
๋ณต์‚ฌ
2. max_files_per_process๋ฅผ ์ดˆ๊ณผํ•œ FD๋ฅผ ์–ป๋„๋ก SQL ์‹คํ–‰
โ€ข
๋ฐฑ์—”๋“œ ํ”„๋กœ์„ธ์Šค๊ฐ€ max_files_per_process๋ฅผ ์ดˆ๊ณผํ•œ FD๋ฅผ ์š”์ฒญํ•˜๋Š” ์ƒํ™ฉ์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด 100๊ฐœ์˜ ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•˜๊ณ , ์ด์— ๋Œ€ํ•œ ์ปค์„œ๋ฅผ ๊ฐ๊ฐ ์—ด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
# CREATE CREATE TABLE T1(C1 NUMERIC, ... C100 NUMERIC); ... CREATE TABLE T100(C1 NUMERIC, ... C100 NUMERIC); # INSERT INSERT INTO T1 SELECT generate_series(1, 1000), ... generate_series(1, 1000); ... INSERT INTO T100 SELECT generate_series(1, 1000), ... generate_series(1, 1000); COMMIT; # DECLARE CURSOR DECLARE C1 CURSOR FOR SELECT * FROM T1; ... DECLARE C100 CURSOR FOR SELECT * FROM T100; # FETCH CURSOR FETCH 1 FROM C1; ... FETCH 1 FROM C100;
SQL
๋ณต์‚ฌ
3. ๋ฐฑ์—”๋“œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ํš๋“ํ•œ FD ํ™•์ธ
โ€ข
์•„๋ž˜ PGDATA ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์ด๋™ํ•ด์„œ ๋ฐฑ์—”๋“œ ํ”„๋กœ์„ธ์Šค๊ฐ€ FD๋ฅผ ํš๋“ํ•œ ๋ฐ์ดํ„ฐ ํŒŒ์ผ(data file)์˜ ์ˆ˜๋ฅผ ํ™•์ธํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
โ€ข
2์—์„œ ์ž‘์„ฑํ•œ SQL์„ ํ•˜๋‚˜์”ฉ ์ˆ˜ํ–‰ํ•˜๋ฉด์„œ ํ™•์ธ์„ ํ•ด๋„ 64๋ฅผ ๋„˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
$ cd $PGDATA $ lsof +D . | grep [BACKEND_PROC_PID] | wc -l
Bash
๋ณต์‚ฌ
4. max_safe_fds ๋ณ€์ˆ˜
โ€ข
์œ„์˜ ์˜ˆ์‹œ๋ฅผ ๋ฐ˜๋ณตํ•ด๋ณด๋ฉด FD์˜ ์ˆ˜๊ฐ€ 64๋ฅผ ๋„˜์ง€ ์•Š์„ ๋ฟ ์•„๋‹ˆ๋ผ 64์— ๋ฏธ์น˜์ง€ ์•Š๋Š” ํŠน์ • ์ˆซ์ž๋ฅผ ๋„˜์ง€ ์•Š๋Š” ํ˜„์ƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
โ€ข
PostgreSQL์€ ์‹œ์Šคํ…œ ์ฝœ์ด๋‚˜ dynamic loader ํ˜น์€ VFD๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  ์ง์ ‘ FD๋ฅผ ์–ป๋Š” ์ฝ”๋“œ๋ฅผ ์œ„ํ•ด ํ™•๋ณดํ•ด ๋†“์€ FD์˜ ์ˆ˜, ๊ทธ๋ฆฌ๊ณ  VFD๊ฐ€ ๋งŒ๋“ค์–ด์ง€๊ธฐ ์ „์— ๋ฏธ๋ฆฌ ์—ด์–ด๋†“์€ FD์˜ ์ˆ˜๋ฅผ max_files_per_process์—์„œ ์ฐจ๊ฐํ•œ ๊ฐ’์„ ๋ฐฑ์—”๋“œ ํ”„๋กœ์„ธ์Šค์˜ ์ „์—ญ ๋ณ€์ˆ˜์ธ max_safe_fds์— ์ €์žฅํ•˜์—ฌ VFD๋ฅผ ์šด์˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
์ง€๊ธˆ๊นŒ์ง€ PPostgreSQL์˜ Virtual File Descriptor์— ๊ด€ํ•ด ์•Œ์•„๋ณด์•˜์Šต๋‹ˆ๋‹ค
โ€˜PostgreSQL์˜ Background Process ๊ด€๋ฆฌ๋ฅผ ๋ฐ”๋กœ ์ด์–ด์„œ ํ™•์ธํ•ด๋ณด์„ธ์š”!
PostgreSQL์˜ Background Process ๊ด€๋ฆฌ
PostgreSQL ์€ ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์šด์˜ํ•˜๊ธฐ ์œ„ํ•œ ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. PostgreSQL ํ”„๋กœ์„ธ์Šค์˜ ๊ธฐ๋Šฅ ๋ฐ ์•„ํ‚คํ…์ณ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ €ํฌ ๋ธ”๋กœ๊ทธ์˜ โ€œPostgreSQL์˜ ํ”„๋กœ์„ธ์Šค์™€ ๋ฉ”๋ชจ๋ฆฌ ์•„ํ‚คํ…์ฒ˜โ€ ๊ฒŒ์‹œ๊ธ€์„ ์ฐธ๊ณ ํ•ด ์ฃผ์„ธ์š”. postgres ํ”„๋กœ์„ธ์Šค๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์šด์˜ํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ๋Ÿฌ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜์ง€๋งŒ ๋ชจ๋“  ๋ฐฑ์—”๋“œ ํ”„๋กœ์„ธ์Šค, ๋ฐฑ๊ทธ๋ผ์šด๋“œ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์—ญํ• ๋„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋ฐฑ์—”๋“œ ํ”„๋กœ์„ธ์Šค, ๋ฐฑ๊ทธ๋ผ์šด๋“œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋น„์ •์ƒ์ ์œผ๋กœ ์ข…๋ฃŒ๋˜์—ˆ์„ ๋•Œ postgres ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ด๋ฅผ ์ธ์ง€ํ•˜๊ณ  ์ ์ ˆํ•œ ์ฒ˜๋ฆฌ์™€ ํ•จ๊ป˜ ํ•ด๋‹น ํ”„๋กœ์„ธ์Šค๋ฅผ ์žฌ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฒˆ ์žฅ์—์„œ๋Š” postgres ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋ฅผ ์–ด๋–ป๊ฒŒ ๊ด€๋ฆฌํ•˜๋Š”์ง€ ์ž์„ธํžˆ ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. postmaster๋ผ๋Š” ์šฉ์–ด๋„ ๋งŽ์ด ์‚ฌ์šฉ๋˜์ง€๋งŒ PostgreSQL ๊ณต์‹ ๋ฌธ์„œ์—์„œ postgres ํ”„๋กœ์„ธ์Šค๋ผ๋Š” ์šฉ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ๋ณธ ๊ธ€์—์„œ๋Š” postgres ํ”„๋กœ์„ธ์Šค๋ผ๊ณ  ํ‘œ๊ธฐํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์ž์œ ๋กญ๊ฒŒ ๋Œ“๊ธ€์„ ๋‚จ๊ฒจ์ฃผ์„ธ์š”