[PostgreSQL] Vacuum ํ๋
https://blog.naver.com/sssang97/222939603415
์ด๋ ์ ๋ ์จ๋ณธ ์ฌ๋์ ์๊ฒ ์ง๋ง, PostgreSQL์ Auto Vacuum์ด๋ผ๋ ํ๋ก์ธ์ค๋ฅผ ํตํด ๊ณผ๊ฑฐ์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฆฌํ๋ ์์
์ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์ฃผ๊ธฐ์ ์ผ๋ก ์ํํ๋ค.
Vacuum์ด ์ ๋๋ก ๋์์ผ์ง ๋์คํฌ ๊ณต๊ฐ์ด ์ ์ฝ๋๊ณ , ์ธ๋ฑ์ค ์ ํ๋๋ ์ฟผ๋ฆฌ ํ๋์ ์ํ ํต๊ณ ์ ๋ณด๊ฐ ์ปดํฉํธํ๊ฒ ๋ง์ถฐ์ง ์ ์๋ค.
์์ ์ฌ์ฉ ๊ท๋ชจ์์๋ ๊ทธ๋ฅ auto vacuum ๋๋๋๋ก๋ง ๋ฌ๋ ๋ฑํ ์ฑ๋ฅ์์ ๋ฌธ์ ๊ฐ ๋์ง๋ ์์ง๋ง, ์ฌ์ฉ๋์ด ์๊ณ์ ์ ๋์ด๊ฐ๊ฒ ๋๋ฉด vacuum์ผ๋ก ์ธํ ๋ฌธ์ ๊ฐ ์กฐ๊ธ์ฉ ๋ฐ์ํ๊ณ auto vacuum๋ง ๋ฏฟ์ ์๊ฐ ์๊ฒ ๋๋ค.
Auto Vacuum์ด ์คํ๋์ง ์์์ ๊ฒฝ์ฐ
PostgreSQL์ MVCC ๊ธฐ๋ฐ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ฒ์ ๋จ์๋ก ๊ด๋ฆฌํ๋ค.
๊ทธ๋์ update/delete๊ฐ ์ผ์ด๋์ ์ฌ๋ผ์ง ๋ฐ์ดํฐ์ ๋ํด์๋ ์ผ๋จ ๋ณด๊ด์ ํ๋๋ฐ, ์ด๋ฐ ์ฐ๋ ๊ธฐ ๋ฐ์ดํฐ๋ฅผ dead tuple์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
์ด๊ฑธ ์ง์ฐ๋๊ฒ auto vacuum์ ์ฃผ๋ ์ญํ ์ด๋ผ ํ ์ ์๊ฒ ๋ค.
๊ทธ๋ฆฌ๊ณ auto vacuum์ด ์ ๋ ๋์ง ์์์ dead tuple์ด ๊ฐ๋ ์์ฌ์๋ค๋ฉด, ์ฟผ๋ฆฌ ์ฑ๋ฅ์ด๋ ๋์คํฌ ๊ณต๊ฐ์ด ๋ฏธ์ณ๋ ๋ฐ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค.
๊ทน๋จ์ ์ธ ์์ง๋ง, ์๋ฅผ ๋ค์ด ํ
์ด๋ธ์ ์ค์ ์กด์ฌํ๋ ๋ฐ์ดํฐ๋ 1๊ฐ์ธ๋ฐ dead tuple์ด 100๋ง๊ฐ๊ฐ ์์ผ๋ฉด
select * from foo;
์ด๋ฐ ๋จ์ํ ์ฟผ๋ฆฌ๋ ๋ช์ด์ฉ ๊ฑธ๋ฆด ์๊ฐ ์๋ ๊ฒ์ด๋ค.
๊ทธ๋์ auto vacuum์ด ์๋ํ๋ ๋ฐฉ์์ ์ด๋์ ๋ ์์๋๋ ๊ฒ์ด ์ค์ํ๋ค.
Auto Vacuum ํธ๋ฆฌ๊ฑฐ ์กฐ๊ฑด: dead tuple
Auto Vacuum์ ํญ์ ๋ง๋ฒ์ฒ๋ผ ์๋ฒฝํ ํ์ด๋ฐ์ ์ํ๋์ง๋ ์๋๋ค.
autovacuum ์ ์ด์ฉ ํ๋ผ๋ฏธํฐ๋ ๋ํ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ด 2๊ฐ์ง๊ฐ ์๋ค.
autovacuum_vacuum_thresholdย =ย 50ย # ๊ธฐ๋ณธ๊ฐ
autovacuum_vacuum_scale_factorย =ย 0.2 # ๊ธฐ๋ณธ๊ฐ
autovacuum_vacuum_scale_factor๋ dead tuple์ด ์์ด๋ ์๊ณ์น๊ณ , autovacuum_vacuum_threshold๋ ์๊ณ์น ๊ธฐ์ค์ผ๋ก ๋ช๊ฐ๋ฅผ ๋์์๋ autovacuum์ ์คํํ ์ง๋ฅผ ๊ฒฐ์ ํ๋ ์ต์ ์ด๋ค.
๊ทธ๋ฌ๋๊น ์ ๊ธฐ๋ณธ ์ต์ ๋๋ก๋ผ๋ฉด dead tuple์ ๋น์จ์ด ํ ์ด๋ธ์ ๋ชจ๋ row ์ค์์ 20%+50๊ฐ๋ฅผ ์ด๊ณผํ๋ ๊ฒฝ์ฐ์ auto vacuum์ด ์คํ๋๋ ๊ฒ์ด๋ค.
์ด ๋น์จ์ ๋ํด์๋ ๋ฑํ ์ ๋ต์ด ์๋ค.
vacuum์ด ๋๋ฌด ๋๋ฌผ๊ฒ ๋๋ฉด ์ฐ๋ ๊ธฐ๊ฐ ํ๋ฒ์ ์์๋ค๊ฐ ๋๊ท๋ชจ๋ก ์ฒ๋ฆฌ๋๊ธฐ ๋๋ฌธ์ ํ๋ฒ ๋๋๋ง๋ค ๋ง๋ํ ๋ถํ๋ฅผ ๊ฐ๋ดํด์ผํ ์ ์๋ค.
๊ทธ๋ ๋ค๊ณ ๋๋ฌด ๋น๋ฒํ๊ฒ ๋๋ฉด autovacuum์ด ๊ณ์ํด์ ๋ฑ
๋ฑ
๋๋ฉด์ ์ฟผ๋ฆฌ๋ฅผ ๋ฐฉํดํ ์๋ ์๋ค.
Auto Vacuum ํธ๋ฆฌ๊ฑฐ ์กฐ๊ฑด: age
์ด๊ฑด dead tuple์ ๋นํด์ ์กฐ๊ธ ๋ณต์กํ๋ค. ๊ทธ๋ ์ง๋ง ๊ผญ ์์์ผ ํ๋ ๋ด์ฉ์ด๊ธฐ๋ ํ๋ค.
์ด๊ฒ ์๋ชป๋๋ฉด ๊ณผ๊ฑฐ ๋ฐ์ดํฐ๊ฐ ์ ๋ถ ๋ ๋ผ๊ฐ๋ ๋์ฐํ ์ผ์ด ์ผ์ด๋๊ฑฐ๋, write๊ฐ ์ ๋ถ ๋ธ๋ฝ๋ ์๋ ์๊ธฐ ๋๋ฌธ์ด๋ค.
์๋ค์ํผ, postgresql์์์ update๋ ์ฌ์ค update๊ฐ ์๋ ์ ๋ฒ์ ์ insert๋ค.
https://techblog.woowahan.com/9478/
๊ฐ tuple์๋ age๋ผ๋ ํ๋๊ฐ ์๋๋ฐ, 1๋ถํฐ ์์ํด์ ์
๋ฐ์ดํธ๋ ๋๋ง๋ค +1์ฉ ์ฆ๊ฐ๋๋ ๊ฐ์ด๋ค.
๊ทธ๋ฆฌ๊ณ xmin, xmax๊ฐ transaction ID๋ผ๊ณ ๋ถ๋ฅด๋ ํ๋๋ค.
select๋ฅผ ๋ ๋ฆด ๋์๋ transaction ID๊ฐ ์ ์ผ ํฐ ๊ฒ์ ๊ธฐ์ค์ผ๋ก ํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ๋๋ฌธ์, ์๋ ๋ฒ์ ๋ฐ์ดํฐ๊ฐ ์๋ฉ ์์ฌ์์ด๋ ์ต์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ ๊ฒ์ด๋ค.
๊ทผ๋ฐ ๋ฌธ์ ๋ transaction ID์ ํ ๋น๋์ด ๋ฌดํํ์ง ์๋ค๋ ๊ฒ์ด๋ค. xmin์ xmax๋ 4๋ฐ์ดํธ ์ ์๋ผ์ ์ฝ 40์ต๊ฐ๋ฅผ ์ฌ์ฉํ ์ ์๊ณ , 20์ต์ ๊ณผ๊ฑฐ, 20์ต์ ๋ฏธ๋๋ฅผ ์ํด ์ฌ์ฉํ๋ค.
์ฌ๊ธฐ์ ํ ๋น๋์ ๋ค ์ฐ๊ฒ ๋๋ค๋ฉด, transaction ID๋ ๋ค์ 1๋ถํฐ ์์ํ๋ค. ๊ทธ๋ฌ๋ฉด 1 ์ดํ์ ๊ฐ๋ค์ ์ค์ ๋ก๋ ๊ณผ๊ฑฐ ๋ฐ์ดํฐ์ธ๋ฐ ๋ฏธ๋์ ๋ฐ์ดํฐ์ฒ๋ผ ๋ณด์ด๋ ์ฐธ์ฌ๊ฐ ์ผ์ด๋๋ค. ์ด ๋ฌธ์ ๋ฅผ Transaction ID Wraparound๋ผ๊ณ ํ๋ค.
PostgreSQL์ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด transaction ID ์์ง์์ Anti Wraparound Vacuum๋ผ๋ ๊ฒ์ ๋๋ฆฐ๋ค.
https://techblog.woowahan.com/9478/
๊ทธ๋ฅ ๊ธฐ์กด์ transaction ID๋ฅผ ๋ค ๋ ๋ ค๋ฒ๋ฆฌ๊ณ ํ๋์ฝ๋ฉ๋ frozen ๊ฐ(2)๋ก ๋ฎ์ด์์๋ฒ๋ฆฌ๋ ๊ฒ์ด๋ค.
์ด๊ฑด GC์ stop the world์ฒ๋ผ ํด๋น ํ
์ด๋ธ์ ๊ฑฐ์ ํต์งธ๋ก freezing์ํจ๋ค.
์ฑ๋ฅ์ ์ผ๋ก ์ฅ์ ์ ์คํ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ผ ์ ์๊ธฐ ๋๋ฌธ์, ๋น์ฐํ ๊ฐ๊ธ์ ํธ๋ฆฌ๊ฑฐ๋์ง ์๋ ๊ฒ์ด ์ข๋ค.
Anti Wraparound Vacuum์ ๋ค์๊ณผ ๊ฐ์ ์ต์ ์ ํตํด ์ ์ดํ ์ ์๋ค.
autovacuum_freeze_max_age = 200000000 # 2์ต
vacuum_freeze_min_age = 50000000 # 5000๋ง
vacuum_freeze_table_age = 150000000 # 1์ต 5000๋ง
transaction id๋ฅผ ๊ธฐ์ค์ผ๋ก ํธ๋ฆฌ๊ฑฐ๋๋๊ฒ ์๋๋ผ age๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํธ๋ฆฌ๊ฑฐ๋จ์ ์ ์ํ๋ค.
-
autovacuum_freeze_max_age
์ด๊ฑธ ์ค์ ํ๋ฉด ํด๋น ๊ฐ์ ์ด๊ณผํ๋ age์ ๊ฐ์ง ํ ์ด๋ธ์ ๋ํด Anti Wraparound AutoVacuum์ ์ํํ๋ค. ๊ทธ๋ฌ๋๊น ๊ธฐ๋ณธ๊ฐ์์๋ 2์ต์ ๋์ด์ผ ํธ๋ฆฌ๊ฑฐ๋๋ ๊ฒ์ด๋ค.
์ด๊ฑด autovacuum์ ๊บผ๋ ๊ฐ์ ๋ก ์คํ๋๋ค. -
vacuum_freeze_min_age
vacuum ๋๋, ์ด ๊ฐ์ ์ด๊ณผํ๋ age์ Tuple์ Anti Wraparound Vacuum ์์ ์ ๋์์ผ๋ก ํ๋ค.
autovacuum_freeze_max_age๋ก ์ธํ ์ ์ฒด ํ๋ฆฌ์ง์ด ๋ฐ์ํ๊ธฐ ์ ์ ์ฌ๋งํด์๋ ์ฒ๋ฆฌ๋๋๋ก ์ ๋ํ๋ ๊ฒ์ด๋ค. -
vacuum_freeze_table_age
์ด ๊ฐ์ ์ด๊ณผํ๋ age์ ํ ์ด๋ธ์ ๋ํด vacuum์ด ํธ์ถ๋ ๋ Anti Wraparound Vacuum ์์ ๋ ๊ฐ์ด ์ํํ๋ค.
๋ค์์ ํ ์ด๋ธ๋ค์ด autovacuum_freeze_max_age์ ๊ฑธ๋ ค์ ๋์์ Anti Wraparound AutoVacuum์ด ๋์ ์ ๋ฐฉ์์ ์ผ๋ก ๋ป๋ ๊ฒ์ ๋ฐฉ์งํ๊ธฐ ์ํด, vacuum์ด ํธ์ถ๋ ํ ์ด๋ธ๋ค์ ๋ํด์๋ง์ด๋ผ๋ ๋ถ๋ถ์ ์ผ๋ก ์ฒ๋ฆฌํ๋ ค๋ ๋ฐฉ์ด์ ์ต์ .
๋์คํฌ ๋ฐํ
vacuum์ด๋ autovacuum์ด dead tuple์ ์ ๋ฆฌํด์ ๊ณต๊ฐ์ ํ๋ณดํ๋ ๊ฐ๋
์ด๊ธด ํ๋ฐ, ์ฌ๊ธฐ์๋ ์ฝ๊ฐ์ ํจ์ ์ด ์๋ค.
์ผ๋ฐ vacuum์ PostgreSQL์ ์ ์ฅ ๊ณต๊ฐ์์ dead tuple์ ์ ๋ฆฌํ๋๊ฑฐ์ง, ์ ๋ฆฌํ ๊ณต๊ฐ์ OS์๋ ๋ฐํํด์ฃผ๋ ๊ฒ์ ์๋๋ค.
๊ทธ๋์ vacuum์ผ๋ก dead tuple 10gb์ด์น๋ฅผ ์ ๋ฆฌํ๋๋ผ๋, ์ค์ ๋ก DB๊ฐ ์ฐจ์งํ๊ณ ์๋ ๋์คํฌ ์ฉ๋์ด 10gb ์ค์ด๋๋๊ฒ ์๋๋ค.
๋ฏธ๋์ postgresql์ด ์ฌ์ฉํ ๊ฒ์ ๋๋นํด์ ๊ทธ๋ฅ ๋๋ค.
์ ๋ง ๋์คํฌ ์ฉ๋์ ์ปดํฉํธํ๊ฒ ์ค์ด๊ณ ์ถ๋ค๋ฉด ๋ค์ดํ์์ ๊ฐ์ํด์๋ผ๋ full vacuum์ ๋๋ ค์ผ ํ๋ค.
์๊ธ์กฐ์น
autovacuum๊ณผ ์ฟผ๋ฆฌ๊ฐ ์๋ก ์ฌ๊ฐํ๊ฒ ๋ง๋ฌผ๋ฆฌ๊ฒ ๋๋ฉด vacuum๋ ์ฒ๋ฆฌ๊ฐ ์ง์ฐ๋๊ณ ์ฟผ๋ฆฌ๋ ๋ธ๋ฝ๊ฑธ๋ฆฐ ๊ฒ์ฒ๋ผ ๋๋ฆฌ๊ฒ ์ฒ๋ฆฌ๋๋ ๋์ฐํ ์ฅ์ ์ํฉ์ ๋ง๋ฅ๋จ๋ฆด ์ ์๋ค.
๊ทธ๋ด๋๋ ์ฐ์ autovacuum์ ๋๋ ๊ฒ๋ ํ๋์ ๋ฐฉ๋ฒ์ผ ์ ์๋ค.
ALTER TABLE public.ํ
์ด๋ธ๋ช
SET (autovacuum_enabled = false);
์ด๋ฌ๋ฉด autovacuum์ ํน์ ํ ์ด๋ธ์ ๋ํด์ ๋นํ์ฑํํ ์ ์๋ค.
๊ทธ๋ฆฌ๊ณ ํ์์ ๋ฐ๋ผ์ ์๋์ผ๋ก vacuum์ ๋๋ฆฐ๋ค.
vacuum VERBOSE public.ํ
์ด๋ธ;
verbose ์ต์
์ ์ฃผ๋ฉด vacuum์ผ๋ก ์ธํ ์คํ ๋ก๊ทธ๋ฅผ ์์ธํ ๋ณผ ์ ์์ผ๋, ์ด๊ฑธ ๊ธฐ๋ฐ์ผ๋ก ํ์ฌ ์ํฉ์ ๋ํ ์ธ์ฌ์ดํ ์ป์ ์ ์๋ค.
๊ทธ๋ฆฌ๊ณ ๋์๋ autovacuum ์ต์ ์ ์กฐ์ ํด์ ์ต์ ํํ๊ฑฐ๋, ์ฟผ๋ฆฌ๋ฅผ ์ต์ ํํ๋ ๋ฐฉ๋ฒ ๋ฑ์ด ์์ ๊ฒ์ด๋ค.
๊ธฐํ ์คํฌ๋ฆฝํธ
์คํ์ค์ธ vacuum ์ ๋ณด ํ์ธ
SELECT
datname,
usename,
pid,
CURRENT_TIMESTAMP - xact_start AS xact_runtime,
query
FROM
pg_stat_activity
WHERE
upper(query)
LIKE '%VACUUM%'
ORDER BY
xact_start;
ํ ์ด๋ธ๋ณ ์ต์ ์ ๋ณด ํ์ธ
SELECT
relname,
reloptions
FROM
pg_class
WHERE
reloptions IS NOT NULL;์ฐธ์กฐ
https://medium.com/29cm/postgresql-autovacuum-%EC%9E%A5%EC%95%A0-%EB%8C%80%EC%9D%91%EA%B8%B0-1-8284955c0193
https://postgresql.kr/blog/postgresql_table_bloating.html
https://techblog.woowahan.com/9478/
https://aws.amazon.com/ko/blogs/tech/postgresql-architecture-considerations-for-application-developers-part-1/