๐Ÿš€ PostgreSQL ์„ฑ๋Šฅ์˜ ํ•œ๊ณ„๋ฅผ ๋ŒํŒŒํ•˜๋Š” 4๋‹จ๊ณ„ ๋งˆ์Šคํ„ฐ ์ „๋žต: ์„ค์ • ํŒŒ์ผ ๊ทธ ์ด์ƒ์„ ๋ณด๋ผ

โ€œDB๊ฐ€ ๋А๋ ค์กŒ๋Š”๋ฐ ๋ฉ”๋ชจ๋ฆฌ ์„ค์ •์„ ์ข€ ๋Š˜๋ ค๋ณผ๊นŒ์š”?โ€

PostgreSQL ์šด์˜ ์ค‘ ์„ฑ๋Šฅ ์ด์Šˆ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ, ๊ฐ€์žฅ ๋จผ์ € postgresql.conf ํŒŒ์ผ์„ ์—ด์–ด shared_buffers๋ถ€ํ„ฐ ์ˆ˜์ •ํ•˜๊ณ  ๊ณ„์‹œ์ง„ ์•Š๋‚˜์š”?

๋ฌผ๋ก  ์„ค์ • ํŠœ๋‹์€ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ „์ฒด ์ตœ์ ํ™” ์—ฌ์ •์—์„œ ๋ณด๋ฉด ๊ทธ๊ฒƒ์€ **๊ฐ€์žฅ ๋งˆ์ง€๋ง‰ ๋‹จ๊ณ„(Last Mile)**์— ๋ถˆ๊ณผํ•ฉ๋‹ˆ๋‹ค. ์ง„์ •ํ•œ ์„ฑ๋Šฅ ํ–ฅ์ƒ์€ ๋ฐ”๋‹ฅ๋ถ€ํ„ฐ ๊ฒฌ๊ณ ํ•˜๊ฒŒ ์Œ“์•„ ์˜ฌ๋ฆฐ 4๊ณ„์ธต์˜ ์ตœ์ ํ™” ์ „๋žต์—์„œ ๋‚˜์˜ต๋‹ˆ๋‹ค.

๋ฌธ์„œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ •๋ฆฌํ•œ PostgreSQL Performance Optimization 4-Layer๋ฅผ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค.


:building_construction: Layer 1: ์ฟผ๋ฆฌ ๋ฐ SQL ์ตœ์ ํ™” (Highest ROI)

๊ฐ€์žฅ ์ ์€ ๋น„์šฉ์œผ๋กœ ๊ฐ€์žฅ ๋“œ๋ผ๋งˆํ‹ฑํ•œ ํšจ๊ณผ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋Š” ์˜์—ญ์ž…๋‹ˆ๋‹ค. ํ•˜๋“œ์›จ์–ด๋ฅผ ์ฆ์„คํ•˜๊ธฐ ์ „์— ์ฟผ๋ฆฌ๋ฅผ ๋จผ์ € ์ง„๋‹จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ์‹คํ–‰ ๊ณ„ํš์˜ ์‹œ๊ฐํ™”: EXPLAIN์œผ๋กœ ๊ณ„ํš์„ ๋ณด๊ณ , EXPLAIN ANALYZE๋กœ ์‹ค์ œ ์‹คํ–‰ ์‹œ๊ฐ„๊ณผ ๊ณ„ํš์˜ ๊ดด๋ฆฌ๋ฅผ ์ฐพ์•„๋‚ด์„ธ์š”.

  • ๋ฒ”์ธ์„ ์ฐพ์•„๋ผ (pg_stat_statements): ์„œ๋ฒ„ ์ „์ฒด์—์„œ ๊ฐ€์žฅ ๋ฆฌ์†Œ์Šค๋ฅผ ๋งŽ์ด ์†Œ๋ชจํ•˜๋Š” '๋ฌด๊ฑฐ์šด ์ฟผ๋ฆฌโ€™๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๊ฒƒ์ด ํŠœ๋‹์˜ ์‹œ์ž‘์ž…๋‹ˆ๋‹ค.

  • ์ธ๋ฑ์Šค ์ „๋žต์˜ ๋‹ค๋ณ€ํ™”: ๋‹จ์ˆœํžˆ B-Tree๋งŒ ๊ณ ์ง‘ํ•˜์ง€ ๋งˆ์„ธ์š”. GIN: JSONB๋‚˜ ๋ฐฐ์—ด ๋ฐ์ดํ„ฐ ๊ฒ€์ƒ‰. BRIN: ์‹œ๊ณ„์—ด ๋กœ๊ทธ ๋ฐ์ดํ„ฐ์ฒ˜๋Ÿผ ๋ฌผ๋ฆฌ์ ์œผ๋กœ ์ •๋ ฌ๋œ ์ดˆ๋Œ€์šฉ๋Ÿ‰ ํ…Œ์ด๋ธ”์˜ ์ตœ์†Œ/์ตœ๋Œ€๊ฐ’ ์ธ๋ฑ์‹ฑ. Partial Index: WHERE ์ ˆ์„ ํฌํ•จํ•ด ํŠน์ • ์กฐ๊ฑด(์˜ˆ: ๋ฏธ์ฒ˜๋ฆฌ ์ฃผ๋ฌธ)๋งŒ ์ธ๋ฑ์‹ฑํ•˜์—ฌ ํฌ๊ธฐ ์ตœ์ ํ™”.

:triangular_ruler: Layer 2: ์•„ํ‚คํ…์ฒ˜ ๊ฐœ์„  (Scalability)

ํ…Œ์ด๋ธ” ํ–‰(Row) ์ˆ˜๊ฐ€ ์ˆ˜์‹ญ์–ต ๊ฑด์„ ๋„˜์–ด๊ฐ€๋ฉด, ๋‹จ์ผ ํ…Œ์ด๋ธ” ๊ตฌ์กฐ๋กœ๋Š” ํ•œ๊ณ„๊ฐ€ ์˜ต๋‹ˆ๋‹ค. ๋ฌผ๋ฆฌ์ ์ธ ๊ตฌ์กฐ ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•œ ์‹œ์ ์ž…๋‹ˆ๋‹ค.

  • ํŒŒํ‹ฐ์…”๋‹ (Partitioning): ๊ฑฐ๋Œ€ ํ…Œ์ด๋ธ”์„ ์‹œ๊ฐ„(Range), ์ง€์—ญ(List), ํ•ด์‹œ(Hash) ๊ธฐ์ค€์œผ๋กœ ์ชผ๊ฐœ์„ธ์š”. ์ฟผ๋ฆฌ ํ”Œ๋ž˜๋„ˆ๊ฐ€ ๋ถˆํ•„์š”ํ•œ ํŒŒํ‹ฐ์…˜์„ ์Šค์บ” ๋Œ€์ƒ์—์„œ ์ œ์™ธํ•˜๋Š” โ€˜ํŒŒํ‹ฐ์…˜ ํ”„๋ฃจ๋‹(Partition Pruning)โ€™ ํšจ๊ณผ๋กœ I/O๋ฅผ ํš๊ธฐ์ ์œผ๋กœ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ฝ๊ธฐ ๋ณต์ œ (Read Replicas): ํŠธ๋žœ์žญ์…˜(INSERT/UPDATE)์€ Primary๊ฐ€, ์กฐํšŒ(SELECT)๋Š” ๋ณต์ œ๋ณธ์ด ์ฒ˜๋ฆฌํ•˜๋„๋ก ๋ถ€ํ•˜๋ฅผ ๋ถ„์‚ฐ์‹œ์ผœ ์ „์ฒด ์ฒ˜๋ฆฌ๋Ÿ‰(Throughput)์„ ๋Š˜๋ฆฌ์„ธ์š”.

:high_voltage: Layer 3: ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ ํ™œ์šฉ (Modern Hardware)

์ตœ์‹  ์„œ๋ฒ„ ํ•˜๋“œ์›จ์–ด์˜ ์ŠคํŽ™์„ 100% ํ™œ์šฉํ•˜๊ณ  ๊ณ„์‹ ๊ฐ€์š”? PostgreSQL์˜ ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ์„ ์ผœ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ๋ณ‘๋ ฌ ์ฟผ๋ฆฌ (Parallel Query): ๋‹จ์ผ ์ฟผ๋ฆฌ๋ฅผ ์—ฌ๋Ÿฌ CPU ์ฝ”์–ด๊ฐ€ ๋‚˜๋ˆ ์„œ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋งŒ๋“œ์„ธ์š”. max_parallel_workers_per_gather ํŠœ๋‹์„ ํ†ตํ•ด ๋Œ€๊ทœ๋ชจ ์ง‘๊ณ„ ์ฟผ๋ฆฌ ์†๋„๋ฅผ ๋น„์•ฝ์ ์œผ๋กœ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • NUMA-Aware ๋ฐฐํฌ: ๋ฉ€ํ‹ฐ ์†Œ์ผ“ CPU ํ™˜๊ฒฝ์—์„œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์›๊ฒฉ ๋ฉ”๋ชจ๋ฆฌ์— ์ ‘๊ทผํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์ง€์—ฐ(Latency)์„ ๋ง‰๊ธฐ ์œ„ํ•ด numactl --interleave=all์„ ํ™œ์šฉํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ธํ„ฐ๋ฆฌ๋น™ํ•˜์„ธ์š”.

  • TOAST & ์••์ถ•: 2KB๊ฐ€ ๋„˜๋Š” ํ…์ŠคํŠธ๋‚˜ JSON ๋ฐ์ดํ„ฐ๋Š” ์ž๋™์œผ๋กœ ์••์ถ• ์ €์žฅํ•˜์—ฌ ๋ฉ”์ธ ํ…Œ์ด๋ธ”์˜ ์บ์‹œ ํšจ์œจ์„ ๋†’์ž…๋‹ˆ๋‹ค.

:gear: Layer 4: ๊ตฌ์„ฑ ํŠœ๋‹ (Fine-Tuning)

์œ„์˜ ๋‹จ๊ณ„๋“ค์ด ์„ ํ–‰๋œ ํ›„, ๋งˆ์ง€๋ง‰์œผ๋กœ ์‹œ์Šคํ…œ ๋ฆฌ์†Œ์Šค๋ฅผ ๋ฏธ์„ธ ์กฐ์ •ํ•˜์—ฌ ๋‚จ์€ 10%์˜ ์„ฑ๋Šฅ์„ ๋Œ์–ด์˜ฌ๋ฆฝ๋‹ˆ๋‹ค.

  • ๋ฉ”๋ชจ๋ฆฌ ์ตœ์ ํ™”: shared_buffers: ์ „์ฒด RAM์˜ 25% ๊ถŒ์žฅ (๋„ˆ๋ฌด ํฌ๋ฉด OS ์บ์‹œ์™€ ๊ฒฝ์Ÿ). work_mem: ์ •๋ ฌ/ํ•ด์‹œ ์ž‘์—…์šฉ ๋ฉ”๋ชจ๋ฆฌ. ์—ฐ๊ฒฐ ์ˆ˜์— ๋”ฐ๋ผ ๊ณฑ์ ˆ๋กœ ์‚ฌ์šฉ๋˜๋ฏ€๋กœ OOM(Out of Memory)์— ์ฃผ์˜ํ•˜๋ฉฐ ๋ณด์ˆ˜์ ์œผ๋กœ ์„ค์ •ํ•˜์„ธ์š”.

  • Autovacuum์€ ์ ˆ๋Œ€ ๋„์ง€ ๋งˆ์„ธ์š”: ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ์ด์œ ๋กœ Autovacuum์„ ๋„๋Š” ๊ฒƒ์€ ์ž์‚ดํ–‰์œ„์ž…๋‹ˆ๋‹ค. ์˜คํžˆ๋ ค autovacuum_vacuum_scale_factor๋ฅผ ๋‚ฎ์ถฐ์„œ(0.01~0.05) โ€˜๋” ์ž์ฃผ, ์กฐ๊ธˆ์”ฉโ€™ ์ฒญ์†Œํ•˜๊ฒŒ ๋งŒ๋“ค์–ด ๋ธ”๋กœํŠธ(Bloat)๋ฅผ ์˜ˆ๋ฐฉํ•˜๋Š” ๊ฒƒ์ด ์ •์„์ž…๋‹ˆ๋‹ค.


:light_bulb: ๊ฒฐ๋ก 

PostgreSQL์˜ ์„ฑ๋Šฅ ์ตœ์ ํ™”๋Š” '์„ค์ •(Config)'์ด ์•„๋‹ˆ๋ผ '์ง„๋‹จ(Analysis)'์—์„œ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์ฟผ๋ฆฌ ๋ ˆ๋ฒจ์—์„œ ๋น„ํšจ์œจ์„ ์ œ๊ฑฐํ•˜๊ณ , ์•„ํ‚คํ…์ฒ˜๋กœ ํ™•์žฅ์„ฑ์„ ํ™•๋ณดํ•œ ๋’ค, ํ•˜๋“œ์›จ์–ด ๊ธฐ๋Šฅ์„ ๊ทน๋Œ€ํ™”ํ•˜๊ณ  ๋‚˜์„œ์•ผ ๋น„๋กœ์†Œ ํŒŒ๋ผ๋ฏธํ„ฐ ํŠœ๋‹์ด ๋น›์„ ๋ฐœํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ๋ถ„์˜ DB๋Š” ์ง€๊ธˆ ์–ด๋–ค ๋ ˆ์ด์–ด์—์„œ ๋ณ‘๋ชฉ์„ ๊ฒช๊ณ  ์žˆ๋‚˜์š”?

2 Likes

@myoungsig.youn ์ƒ๋ฌด๋‹˜! ์—ญ์‹œ DB ์ „๋ฌธ๊ฐ€ ์ธ์‚ฌ์ดํŠธ ๊ธฐ๊ณ  ๊ณต์œ ์— ๋„ˆ๋ฌด ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. :slight_smile: