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 ๊ด๋ฆฌ๋ฅผ ๋ฐ๋ก ์ด์ด์ ํ์ธํด๋ณด์ธ์!