Postgresql/์„ค์น˜

์œ ์šฉํ•œ extension ์ •๋ฆฌ

dbavayne 2025. 3. 13. 15:55

์ •๋ฆฌ ๐Ÿ“Œ
pg_stat_statements SQL ์ฟผ๋ฆฌ ์„ฑ๋Šฅ ๋ถ„์„ (์‹คํ–‰ ํšŸ์ˆ˜, ํ‰๊ท  ์‹คํ–‰ ์‹œ๊ฐ„ ๋“ฑ)
pg_store_plans SQL ์‹คํ–‰ ๊ณ„ํš ์ €์žฅ ๋ฐ ๋ถ„์„
pg_stat_kcache ์ฟผ๋ฆฌ๋ณ„ CPU, ๋ฉ”๋ชจ๋ฆฌ, ๋””์Šคํฌ I/O ์‚ฌ์šฉ๋Ÿ‰ ํ™•์ธ
pg_buffercache ์บ์‹œ์—์„œ ์–ด๋–ค ํ…Œ์ด๋ธ”์ด ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š”์ง€ ํ™•์ธ
pg_prewarm PostgreSQL ์žฌ์‹œ์ž‘ ํ›„ ์ค‘์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฏธ๋ฆฌ ๋กœ๋“œ
pg_cron ์ž๋™ํ™”๋œ ๋ฐ์ดํ„ฐ ์ •๋ฆฌ ๋ฐ ๋ฐฑ์—… ์Šค์ผ€์ค„๋ง
pg_bloat_check ํ…Œ์ด๋ธ”๊ณผ ์ธ๋ฑ์Šค์˜ ๋ธ”๋กœํŠธ(๋ถˆํ•„์š”ํ•œ ๊ณต๊ฐ„) ํ™•์ธ
pg_repack ๋‹ค์šดํƒ€์ž„ ์—†์ด ํ…Œ์ด๋ธ” ์ตœ์ ํ™”
auto_explain ์‹คํ–‰ ์‹œ๊ฐ„์ด ๊ธด ์ฟผ๋ฆฌ์˜ ์‹คํ–‰ ๊ณ„ํš ์ž๋™ ๋กœ๊น…
pg_stat_io PostgreSQL 16+์—์„œ ๋””์Šคํฌ I/O ๋ถ„์„


์šด์˜ ํ™˜๊ฒฝ์—์„œ PostgreSQL์„ ํšจ์œจ์ ์œผ๋กœ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋ ค๋ฉด
โœ… ์ฟผ๋ฆฌ ๋ถ„์„: pg_stat_statements, pg_store_plans, auto_explain
โœ… ๋ฆฌ์†Œ์Šค ๋ชจ๋‹ˆํ„ฐ๋ง: pg_stat_kcache, pg_stat_io, pg_buffercache
โœ… ๊ณต๊ฐ„ ๊ด€๋ฆฌ: pg_bloat_check, pg_repack
โœ… ์šด์˜ ์ž๋™ํ™”: pg_cron, pg_prewarm


1. pg_stat_statements (์ฟผ๋ฆฌ ์„ฑ๋Šฅ ๋ถ„์„)

โœ… ์ฃผ์š” ๊ธฐ๋Šฅ:

์‹คํ–‰๋œ SQL ์ฟผ๋ฆฌ์˜ ํ†ต๊ณ„๋ฅผ ์ €์žฅํ•˜๊ณ  ๋ถ„์„ํ•  ์ˆ˜ ์žˆ์Œ.
์ฟผ๋ฆฌ ์‹คํ–‰ ํšŸ์ˆ˜, ํ‰๊ท  ์‹คํ–‰ ์‹œ๊ฐ„, ๋ฒ„ํผ ์‚ฌ์šฉ๋Ÿ‰ ๋“ฑ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Œ.
๋Š๋ฆฐ ์ฟผ๋ฆฌ๋ฅผ ์ฐพ์•„ ์„ฑ๋Šฅ ํŠœ๋‹ํ•  ๋•Œ ํ•„์ˆ˜์ ์ธ ํ™•์žฅ.

๐Ÿ’ก ์„ค์น˜ ๋ฐ ํ™œ์„ฑํ™”:

CREATE EXTENSION pg_stat_statements;

๐Ÿ’ก ์ฃผ์š” ์กฐํšŒ ๋ฐฉ๋ฒ•:

SELECT * FROM pg_stat_statements ORDER BY total_exec_time DESC LIMIT 10;

โ†’ ์‹คํ–‰ ์‹œ๊ฐ„์ด ๊ฐ€์žฅ ๊ธด ์ฟผ๋ฆฌ 10๊ฐœ๋ฅผ ์กฐํšŒ

2. pg_store_plans (์‹ค์ œ ์‹คํ–‰ ๊ณ„ํš ์ €์žฅ)

โœ… ์ฃผ์š” ๊ธฐ๋Šฅ:

์‹คํ–‰๋œ SQL์˜ ์‹ค์ œ ์‹คํ–‰ ๊ณ„ํš(EXPLAIN ANALYZE) ์„ ์ €์žฅํ•จ.
pg_stat_statements์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ์ฟผ๋ฆฌ ํŠœ๋‹์— ๊ฐ•๋ ฅํ•œ ๋„์›€์ด ๋จ.

๐Ÿ’ก ์„ค์น˜ ๋ฐ ํ™œ์„ฑํ™”:

CREATE EXTENSION pg_store_plans;

๐Ÿ’ก ์ฃผ์š” ์กฐํšŒ ๋ฐฉ๋ฒ•:

SELECT query, plan FROM pg_store_plans ORDER BY total_exec_time DESC LIMIT 5;

โ†’ ์‹คํ–‰ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฐ ์ฟผ๋ฆฌ๋“ค์˜ ์‹คํ–‰ ๊ณ„ํš์„ ํ™•์ธ.

3. pg_stat_kcache (์ฟผ๋ฆฌ๋ณ„ OS ๋ ˆ๋ฒจ ์„ฑ๋Šฅ ๋ชจ๋‹ˆํ„ฐ๋ง)

โœ… ์ฃผ์š” ๊ธฐ๋Šฅ:

๊ฐ ์ฟผ๋ฆฌ์˜ CPU ์‚ฌ์šฉ๋Ÿ‰, ๋””์Šคํฌ I/O, ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ์ธก์ •.
PostgreSQL ๋‚ด๋ถ€ ์ •๋ณด๋ฟ๋งŒ ์•„๋‹ˆ๋ผ OS ๋ ˆ๋ฒจ์—์„œ ์‚ฌ์šฉ๋œ ๋ฆฌ์†Œ์Šค๊นŒ์ง€ ํ™•์ธ ๊ฐ€๋Šฅ.

๐Ÿ’ก ์„ค์น˜ ๋ฐ ํ™œ์„ฑํ™”:

CREATE EXTENSION pg_stat_kcache;

๐Ÿ’ก ์ฃผ์š” ์กฐํšŒ ๋ฐฉ๋ฒ•:

SELECT * FROM pg_stat_kcache ORDER BY calls DESC LIMIT 10;

โ†’ ๊ฐ€์žฅ ๋งŽ์ด ํ˜ธ์ถœ๋œ ์ฟผ๋ฆฌ์™€ ๊ทธ์— ๋”ฐ๋ฅธ ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ๋Ÿ‰์„ ํ™•์ธ.

4. pg_buffercache (๋ฒ„ํผ ์บ์‹œ ์‚ฌ์šฉ๋Ÿ‰ ๋ถ„์„)

โœ… ์ฃผ์š” ๊ธฐ๋Šฅ:

PostgreSQL์ด ๊ด€๋ฆฌํ•˜๋Š” ๋ฒ„ํผ ์บ์‹œ์˜ ํ˜„์žฌ ์ƒํƒœ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Œ.
๋””์Šคํฌ I/O๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•œ ์บ์‹œ ์ตœ์ ํ™”์— ์œ ์šฉํ•จ.

๐Ÿ’ก ์„ค์น˜ ๋ฐ ํ™œ์„ฑํ™”:

CREATE EXTENSION pg_buffercache;

๐Ÿ’ก ์ฃผ์š” ์กฐํšŒ ๋ฐฉ๋ฒ•:

SELECT c.relname, count(*) AS buffers
FROM pg_buffercache b
JOIN pg_class c ON b.relfilenode = c.relfilenode
GROUP BY c.relname
ORDER BY buffers DESC LIMIT 10;

โ†’ ์บ์‹œ์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ํ…Œ์ด๋ธ” ํ™•์ธ.

5. pg_prewarm (๋ฐ์ดํ„ฐ ๋ฏธ๋ฆฌ ๋กœ๋“œ)

โœ… ์ฃผ์š” ๊ธฐ๋Šฅ:

PostgreSQL์ด ์žฌ์‹œ์ž‘๋  ๋•Œ, ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ฏธ๋ฆฌ ๋ฒ„ํผ ์บ์‹œ์— ๋กœ๋“œ.
์žฅ๊ธฐ์ ์œผ๋กœ ์„ฑ๋Šฅ์„ ์•ˆ์ •ํ™”ํ•˜๋Š” ๋ฐ ์œ ์šฉํ•จ.

๐Ÿ’ก ์„ค์น˜ ๋ฐ ํ™œ์„ฑํ™”:

CREATE EXTENSION pg_prewarm;

๐Ÿ’ก ํŠน์ • ํ…Œ์ด๋ธ”์„ ๋ฏธ๋ฆฌ ๋กœ๋“œํ•˜๋Š” ๋ฐฉ๋ฒ•:

SELECT pg_prewarm('your_table');

6. pg_cron (PostgreSQL ๋‚ด๋ถ€์—์„œ ํฌ๋ก  ์ž‘์—… ์‹คํ–‰)

โœ… ์ฃผ์š” ๊ธฐ๋Šฅ:

PostgreSQL์—์„œ ์ •๊ธฐ์ ์ธ ์ž๋™ ๋ฐฑ์—…, ๋ฐ์ดํ„ฐ ์ •๋ฆฌ, ํ†ต๊ณ„ ๊ฐฑ์‹  ์ž‘์—… ๋“ฑ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Œ.
์šด์˜ ์ž‘์—…์„ ์ž๋™ํ™”ํ•  ๋•Œ ๋งค์šฐ ์œ ์šฉ.

๐Ÿ’ก ์„ค์น˜ ๋ฐ ํ™œ์„ฑํ™”:

CREATE EXTENSION pg_cron;

๐Ÿ’ก ํŠน์ • ์ž‘์—…์„ ์˜ˆ์•ฝ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•:

SELECT cron.schedule('0 3 * * *', 'VACUUM ANALYZE');

โ†’ ๋งค์ผ ์ƒˆ๋ฒฝ 3์‹œ์— VACUUM ANALYZE ์‹คํ–‰.

7. pg_bloat_check (์ธ๋ฑ์Šค์™€ ํ…Œ์ด๋ธ” ๋ธ”๋กœํŠธ ํ™•์ธ)

โœ… ์ฃผ์š” ๊ธฐ๋Šฅ:

PostgreSQL ํ…Œ์ด๋ธ”๊ณผ ์ธ๋ฑ์Šค์— ๋ถˆํ•„์š”ํ•œ ๋ธ”๋กœํŠธ(Bloat, ์“ธ๋ฐ์—†์ด ์ฐจ์ง€ํ•˜๋Š” ๊ณต๊ฐ„)๊ฐ€ ์žˆ๋Š”์ง€ ๊ฒ€์‚ฌ.
๋””์Šคํฌ ๊ณต๊ฐ„์„ ์ค„์ด๊ณ  ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Œ.
๐Ÿ’ก ์ฃผ์š” ์กฐํšŒ ๋ฐฉ๋ฒ•:

SELECT * FROM bloat_check();

โ†’ ๋ธ”๋กœํŠธ๊ฐ€ ๋ฐœ์ƒํ•œ ํ…Œ์ด๋ธ”๊ณผ ์ธ๋ฑ์Šค๋ฅผ ํ™•์ธ.

8. pg_repack (๋‹ค์šดํƒ€์ž„ ์—†์ด ํ…Œ์ด๋ธ” ์žฌ๊ตฌ์„ฑ)

โœ… ์ฃผ์š” ๊ธฐ๋Šฅ:

VACUUM FULL ์—†์ด ํ…Œ์ด๋ธ”๊ณผ ์ธ๋ฑ์Šค๋ฅผ ์žฌ๊ตฌ์„ฑ(๋ฆฌํŒฉํ† ๋ง)ํ•˜์—ฌ ์„ฑ๋Šฅ ์ตœ์ ํ™”.
์šด์˜ ์ค‘์ธ ์„œ๋น„์Šค์—์„œ๋„ ํ…Œ์ด๋ธ”์„ ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด ๋งค์šฐ ์œ ์šฉ.

๐Ÿ’ก ์„ค์น˜ ๋ฐ ํ™œ์„ฑํ™”:

pg_repack -h localhost -U postgres -d your_database -t your_table

โ†’ your_table์„ ์žฌ๊ตฌ์„ฑํ•˜์—ฌ ์„ฑ๋Šฅ ์ตœ์ ํ™”.

9. auto_explain (์ž๋™์œผ๋กœ ์‹คํ–‰ ๊ณ„ํš ๋กœ๊ทธ ์ €์žฅ)

โœ… ์ฃผ์š” ๊ธฐ๋Šฅ:

ํŠน์ • ์‹คํ–‰ ์‹œ๊ฐ„์ด ์ดˆ๊ณผํ•˜๋Š” ์ฟผ๋ฆฌ์˜ ์‹คํ–‰ ๊ณ„ํš์„ ์ž๋™์œผ๋กœ ๋กœ๊น….
๋Š๋ฆฐ ์ฟผ๋ฆฌ๋ฅผ ์ถ”์ ํ•˜๋Š” ๋ฐ ๋งค์šฐ ์œ ์šฉ.
๐Ÿ’ก ์„ค์ • ๋ฐฉ๋ฒ• (postgresql.conf ์ˆ˜์ •)

shared_preload_libraries = 'auto_explain'
log_min_duration_statement = 1000  # 1์ดˆ ์ด์ƒ ๊ฑธ๋ฆฌ๋Š” ์ฟผ๋ฆฌ ๋กœ๊น…

๐Ÿ’ก ํ™œ์„ฑํ™” ํ›„ ์‹คํ–‰ ๊ณ„ํš ํ™•์ธ

SHOW auto_explain.log_min_duration;

10. pg_stat_io (PostgreSQL 16+ ๋ฒ„์ „์—์„œ I/O ๋ชจ๋‹ˆํ„ฐ๋ง)

โœ… ์ฃผ์š” ๊ธฐ๋Šฅ:

PostgreSQL 16๋ถ€ํ„ฐ ์ถ”๊ฐ€๋œ ํ™•์žฅ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋””์Šคํฌ I/O ์‚ฌ์šฉ๋Ÿ‰์„ ์ถ”์ .
๋””์Šคํฌ ์„ฑ๋Šฅ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ์œ ์šฉ.
๐Ÿ’ก ์„ค์น˜ ๋ฐ ํ™œ์„ฑํ™”:

CREATE EXTENSION pg_stat_io;

๐Ÿ’ก ์ฃผ์š” ์กฐํšŒ ๋ฐฉ๋ฒ•:

SELECT * FROM pg_stat_io ORDER BY total_read DESC LIMIT 10;

โ†’ ๊ฐ€์žฅ ๋งŽ์ด ์ฝํžŒ ํ…Œ์ด๋ธ” ๋ฐ ์ธ๋ฑ์Šค ํ™•์ธ.