์ด ๋ฌธ์์์๋ Cloud SQL ์ธ์คํด์ค์ ๋์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ํ์ธํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช ํ๊ณ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ จ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ๋ํ ๊ถ์ฅ์ฌํญ์ ์ ๊ณตํฉ๋๋ค.
Cloud SQL ์ธ์คํด์ค์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ๊ตฌ์ฑํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด๋ ค๋ฉด ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ๊ด๋ฆฌ ๊ถ์ฅ์ฌํญ์ ์ฐธ๊ณ ํ์ธ์.
๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ๋ง์ ํญ๋ชฉ ์๋ณ
๋ค์ ์น์ ์์๋ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ๋ง์ ์๋๋ฆฌ์ค๋ฅผ ์ค๋ช ํฉ๋๋ค.
์ธก์ ํญ๋ชฉ ํ์๊ธฐ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ์๋ณ
์ธก์ ํญ๋ชฉ ํ์๊ธฐ์ database/memory/components.usage
์ธก์ ํญ๋ชฉ์ ์ฌ์ฉํ์ฌ ์ธ์คํด์ค์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ๊ฒํ ํ ์ ์์ต๋๋ค.
์ฟผ๋ฆฌ ํต๊ณ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฆฌ์์ค ์ฌ์ฉ๋์ด ๋ง์ ์ฟผ๋ฆฌ์ ์ค๋ช ๊ณํ ๋ถ์
์ฟผ๋ฆฌ ํต๊ณ๋ Cloud SQL ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฟผ๋ฆฌ ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ๊ฐ์งํ๊ณ ์ง๋จํ๊ณ ๋ฐฉ์งํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. ์ฟผ๋ฆฌ ํต๊ณ์์๋ ์ฅ๊ธฐ ์คํ ์ฟผ๋ฆฌ ๋ชฉ๋ก๊ณผ ํจ๊ป ์ค๋ช ๊ณํ(PostgreSQL ๋ฌธ์)์ ์ ๊ณตํฉ๋๋ค. ์ค๋ช ๊ณํ์ ๊ฒํ ํ๊ณ ๋์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ์ค์บ ๋ฉ์๋๊ฐ ์๋ ์ฟผ๋ฆฌ ๋ถ๋ถ์ ์๋ณํฉ๋๋ค. ์ฟผ๋ฆฌ ์คํ ์๊ฐ์ ๊ด๊ณ์์ด ์ฟผ๋ฆฌ ํต๊ณ๋ ๋ชจ๋ ์ฟผ๋ฆฌ์ ์คํ ๊ณํ์ ์ ๊ณตํฉ๋๋ค. ๋ ๋ง์ ์๊ฐ์ด ์์๋๋ ๋ณต์กํ ์ฟผ๋ฆฌ๋ฅผ ์๋ณํ์ฌ ์ด๋ค ์ฟผ๋ฆฌ๊ฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ค๋ซ๋์ ์ฐจ๋จํ๋์ง ํ์ ํฉ๋๋ค.
๋ง์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ์ผ๋ฐ์ ์ธ PostgreSQL ์ค์บ ๋ฉ์๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ๋นํธ๋งต ํ ์ค์บ
- ๋น ๋ฅธ ์ ๋ ฌ
- ํด์ ์กฐ์ธ ๋๋ ํด์
Gemini ์ง์ ์ธ์คํด์ค์ ๋์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ๋ฐ ๊ด๋ จ ๋ก๊ทธ
๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ค์ดํ์์ผ๋ก ์ด์ด์ง๋ ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ(OOM) ๋์ Gemini๊ฐ ์ฌ์ฉ ์ค์ ๋ ๊ฒฝ์ฐ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ๋์ ์ฟผ๋ฆฌ ์คํ ์ฐ๊ฒฐ์ ์ข ๋ฃํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ค์ดํ์์ ๋ฐฉ์งํฉ๋๋ค. ๋ฌธ์ ์์ธ์ด ๋๋ ์ฟผ๋ฆฌ๋ฅผ ์ฐพ์ผ๋ ค๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ก๊ทธ์์ ๋ค์ ํญ๋ชฉ์ ํ์ธํ ์ ์์ต๋๋ค.
(...timestampโฆ.) db=postgres, user=customer FATAL: terminating connection due to administrator command
OOM ๋ฐฉ์ง๋ฅผ ์ํด ์ข ๋ฃ๋ ๋์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ ์ฟผ๋ฆฌ๋ฅผ ์บก์ฒํ๋ ๋ค์ PostgreSQL์ฉ Cloud SQL ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ก๊ทธ๊ฐ ํ์๋ฉ๋๋ค. ์ฟผ๋ฆฌ๋ ์๋ ์ฟผ๋ฆฌ๊ฐ ์ ๊ทํ๋ ๋ฒ์ ์ ๋๋ค.
db=postgres,user=customer LOG: postgres process with PID 1734 for the query "SELECT COUNT(product) AS item_count FROM test_table WHERE product_type = $1 AND product LIKE $2 AND c6_2 IN ($3,$4,$5,$6,$7)" has been cancelled.
๋ค์ ์ด๋ฒคํธ์ ๊ฒฝ์ฐ Cloud SQL ์ธ์คํด์ค ํ์ด์ง์๋ ์๋ฆผ์ด ํ์๋ฉ๋๋ค.
- ์ง๋ 24์๊ฐ ๋์ ์ธ์คํด์ค์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋
- ์ง๋ 24์๊ฐ ๋ด์ ์ทจ์๋ ์ ๊ทํ๋ ์ฟผ๋ฆฌ ๋ชฉ๋ก
- ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ์ต์ ํ์ ๋ํ Google ๋ฌธ์ ๋งํฌ
๋์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ - ๊ถ์ฅ์ฌํญ
๋ค์ ๊ถ์ฅ์ฌํญ์ ์ผ๋ฐ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ จ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค.
์ธ์คํด์ค์์ ๊ณ์ ๋์ ๋ฉ๋ชจ๋ฆฌ ์ฉ๋์ ์ฌ์ฉํ๋ฉด ๊ฒฐ๊ตญ out of memory
๋ฌธ์ ๊ฐ ๋ฐ์ํ์ ํ๋ฅ ์ด ๋์ต๋๋ค.
PostgreSQL ๋๋ ๋ค๋ฅธ ํ๋ก์ธ์ค์ ๋ฉ๋ชจ๋ฆฌ ์์๋ก ์ธํด ์์คํ
๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํด์ง๋ฉด PostgreSQL ๋ก๊ทธ์ Out of Memory
์ปค๋ ๋ฉ์์ง๊ฐ ํ์๋๊ณ PostgreSQL ์ธ์คํด์ค๊ฐ ๊ฒฐ๊ตญ ์ค์ง๋ฉ๋๋ค.
์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
Out of Memory: Killed process 12345 (postgres)
OOM ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ๋ ํ์ฑ ์ฐ๊ฒฐ ์๊ฐ ๋ง์ work_mem
๊ฐ์ด ๋์ ๋์
๋๋ค.
๋ฐ๋ผ์ OOM์ด ์์ฃผ ๋ฐ์ํ๋ ๊ฒฝ์ฐ ๋๋ PostgreSQL์ฉ Cloud SQL ์ธ์คํด์ค์์ OOM์ ๋ฐฉ์งํ๊ธฐ ์ํด์๋ ๋ค์ ๊ถ์ฅ์ฌํญ์ ๋ฐ๋ฅด๋ ๊ฒ์ด ์ข์ต๋๋ค.
work_mem
์ค์ ๋น ๋ฅธ ์ ๋ ฌ์ ์ฌ์ฉํ๋ ์ฟผ๋ฆฌ๊ฐ ์ธ๋ถ ๋ณํฉ ์ ๋ ฌ์ ์ฌ์ฉํ๋ ์ฟผ๋ฆฌ๋ณด๋ค ๋น ๋ฆ ๋๋ค. ํ์ง๋ง ์ ์๋ ๋ฉ๋ชจ๋ฆฌ ์์ง์ ์ผ์ผํฌ ์ ์์ต๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด ๋ฉ๋ชจ๋ฆฌ์ ๋์คํฌ์์ ์ด๋ฃจ์ด์ง๋ ์ ๋ ฌ ์์ ์ด ๋ชจ๋ ๊ท ํ์ ์ด๋ฃฐ ์ ๋๋ก
work_mem
๊ฐ์ ์ถฉ๋ถํ ์ค์ ํฉ๋๋ค. ๋ํ ์ ์ฒด ์ธ์คํด์ค์ ๋ํด ์ค์ ํ์ง ์๊ณ ์ธ์ ์์ค์์work_mem
์ ์ค์ ํ ์ ์์ต๋๋ค.ํ์ฑ ์ธ์ ๋ชจ๋ํฐ๋ง
๊ฐ ์ฐ๊ฒฐ์ ํน์ ๋ฉ๋ชจ๋ฆฌ ์ฉ๋์ ์ฌ์ฉํฉ๋๋ค. ๋ค์ ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํด์ ํ์ฑ ์ฐ๊ฒฐ ์๋ฅผ ํ์ธํฉ๋๋ค.
SELECT state, usename, count(1) FROM pg_stat_activity WHERE pid <> pg_backend_pid() GROUP BY state, usename ORDER BY 1;
ํ์ฑ ์ธ์ ์ด ๋ง์ ๊ฒฝ์ฐ ํ์ฑ ์ธ์ ์๊ฐ ๋ง์ ๊ทผ๋ณธ ์์ธ(์: ํธ๋์ญ์ ์ ๊ธ)์ ๋ถ์ํฉ๋๋ค.
shared_buffers
์ค์ shared_buffers
๊ฐ ๋์ ๊ฐ์ผ๋ก ์ค์ ๋ ๊ฒฝ์ฐwork_mem
๊ณผ ๊ฐ์ ๋ค๋ฅธ ์์ ์ด๋ ์ ์ฐ๊ฒฐ ์ค์ ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ ์ ์๋๋กshared_buffers
๊ฐ์ ์ค์ด๋ ๊ฒ์ด ์ข์ต๋๋ค.์บ์ ์ ์ค๋ฅ
PostgreSQL์ ์ผ๋ฐ์ ์ผ๋ก ๊ฐ์ฅ ์์ฃผ ์ก์ธ์คํ๋ ๋ฐ์ดํฐ๋ฅผ ์บ์์ ๋ณด๊ดํ๋ ค๊ณ ํฉ๋๋ค. ํด๋ผ์ด์ธํธ์์ ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ ๋ ๋ฐ์ดํฐ๊ฐ ์ด๋ฏธ ๊ณต์ ๋ฒํผ์ ์บ์๋ ๊ฒฝ์ฐ ํด๋น ํด๋ผ์ด์ธํธ์ ์ง์ ์ ๊ณต๋ฉ๋๋ค. ์ด๊ฒ์ ์บ์ ์ ์ค์ด๋ผ๊ณ ํฉ๋๋ค. ๊ณต์ ๋ฒํผ์ ๋ฐ์ดํฐ๊ฐ ์๋ ๊ฒฝ์ฐ์๋ ๋จผ์ ๋ฐ์ดํฐ๋ฅผ ๋์คํฌ์ ๊ณต์ ๋ฒํผ๋ก ๊ฐ์ ธ์จ ๋ค์ ํด๋ผ์ด์ธํธ์ ์ ๊ณตํฉ๋๋ค. ์ด๋ฅผ ์บ์ ๋ถ์ ์ค์ด๋ผ๊ณ ๋ถ๋ฆ ๋๋ค. ์บ์ ์ ์ค๋ฅ ์ ์บ์๊ฐ ์ฒ๋ฆฌํ ์ฝํ ์ธ ์์ฒญ์ ์์ ๋ ์์ฒญ๊ณผ ๋น๊ตํด์ ์ธก์ ํฉ๋๋ค. PostgreSQL ์ธ์คํด์ค์ ํ ์ด๋ธ ์์ฒญ์ ๋ํ ์บ์ ์ ์ค๋ฅ ์ ํ์ธํ๋ ค๋ฉด ๋ค์ ์ฟผ๋ฆฌ๋ฅผ ์คํํฉ๋๋ค.
SELECT sum(heap_blks_read) as heap_read, sum(heap_blks_hit) as heap_hit, sum(heap_blks_hit) / (sum(heap_blks_hit) + sum(heap_blks_read)) as ratio FROM pg_statio_user_tables;
PostgreSQL ์ธ์คํด์ค์ ์์ธ ์์ฒญ์ ๋ํ ์บ์ ์ ์ค๋ฅ ์ ํ์ธํ๋ ค๋ฉด ๋ค์ ์ฟผ๋ฆฌ๋ฅผ ์คํํฉ๋๋ค.
SELECT sum(idx_blks_read) as idx_read, sum(idx_blks_hit) as idx_hit, (sum(idx_blks_hit) - sum(idx_blks_read)) / sum(idx_blks_hit) as ratio FROM pg_statio_user_indexes;
์ผ๋ฐ์ ์ผ๋ก 95~99%์ ์บ์ ์ ์ค๋ฅ ์ด ์ ์ ํ ๊ฐ์ผ๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
PostgreSQL์ฉ Cloud SQL์์๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ๊ฐ์ ํ๊ธฐ ์ํด
huge_pages
ํ๋๊ทธ๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ฉ ์ค์ ๋์ด ์์ต๋๋ค.huge_pages
์ ๋ํ ์์ธํ ๋ด์ฉ์ PostreSQL ๋ฌธ์๋ฅผ ์ฐธ์กฐํ์ธ์.max_locks_per_transaction
์ค์ max_locks_per_transaction
๊ฐ์ ๋์์ ์ ๊ธ ์ ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ฐ์ฒด ์๋ฅผ ๋ํ๋ ๋๋ค. ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ๊ธฐ๋ณธ๊ฐ์ธ 64๊ฐ๋ฉด ์ถฉ๋ถํฉ๋๋ค. ํ์ง๋ง ์์ ์ค์ธ ๋ฐ์ดํฐ ์ธํธ ๊ท๋ชจ๊ฐ ํฌ๋ฉด OOM์ด ๋ฐ์ํ ์ ์์ต๋๋ค. OOM์ ๋ฐฉ์งํ ์ ์๋๋กmax_locks_per_transaction
๊ฐ์ ์ถฉ๋ถํ ๋์ด๋ ๊ฒ์ด ์ข์ต๋๋ค.max_locks_per_transaction
๊ฐ์max_locks_per_transaction
* (max_connections
+max_prepared_transactions
)๊ฐ์ ๊ฐ์ฒด์ฌ์ผ ํฉ๋๋ค. ์ฆ, ๊ฐ์ฒด๊ฐ 300,000๊ฐ์ด๊ณmax_connections
๊ฐ์ด 200์ด๋ฉดmax_locks_per_transaction
์ 1,500์ด์ด์ผ ํฉ๋๋ค.max_pred_locks_per_transaction
์ค์ ์ง๋ ฌํ ๊ฐ๋ฅํ ๋จ์ผ ํธ๋์ญ์ ์์ ์ฌ๋ฌ ํ ์ด๋ธ์ ๋ค๋ฃจ๋ ํด๋ผ์ด์ธํธ๊ฐ ์๋ ๊ฒฝ์ฐ ํธ๋์ญ์ ์ด ์คํจํ ์ ์์ต๋๋ค. ์ด ์๋๋ฆฌ์ค์์๋
max_pred_locks_per_transaction
์ ์๋นํ ๋์ ๊ฐ์ผ๋ก ๋๋ฆฌ๋ ๊ฒ์ด ์ข์ต๋๋ค.max_locks_per_transaction
๊ณผ ๋ง์ฐฌ๊ฐ์ง๋กmax_pred_locks_per_transaction
๋ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฏ๋ก ์ง๋์น๊ฒ ๋์ ๊ฐ์ ์ค์ ํ์ง๋ ๋ง์ธ์.๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ์ฌ์ ํ ๋๊ณ ์ฟผ๋ฆฌ๊ฐ ํ๋นํ ํธ๋ํฝ์ด๋ผ๊ณ ์๊ฐ๋๋ฉด ์ธ์คํด์ค์ ๋ฉ๋ชจ๋ฆฌ ๋ฆฌ์์ค ์๋ฅผ ๋๋ ค ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋น์ ์ ์ข ๋ฃ๋ ๋ค์ดํ์์ ๋ฐฉ์งํ์ธ์.