PostgreSQL의 Dead Tuple과 Vacuum
- PostgreSQL dead tuple과 autovacuum을 운영 관점에서 이해하기 쉽게 정리했습니다.
- 테이블이 느려지는 징후를 어떻게 읽고, 어떤 지표부터 점검해야 할지 실무 흐름을 잡을 수 있습니다.
PostgreSQL에서 CPU를 과도하게 사용하는 autovacuum 동작을 감지했습니다.
지금까지 현업에서 사용했던 Oracle, MySQL, MSSQL과 같은 데이터베이스에서는 본 적 없는 것이라서 좀 알아보다 보니 흥미로워서 정리해 보았습니다.
Dead Tuple과 Vacuum/autovacuum에 대해서 알아보기 전, 우선 더 쉬운 전달을 위해 MVCC에 대해서 짚고 가보겠습니다.
MVCC (Multi-Version Concurrency Control)
MVCC는 번역하면 다중 버전 동시성 제어라고 합니다.
예를 들어 Transaction을 생각하시면 됩니다. Transaction은 작업을 한 단위로 묶어 Commit 전 변경사항을 Undo/Redo 할 수 있습니다. 그리고 읽기/쓰기에 무결성 보장을 위해 MVCC를 구현합니다.
재미있는 점은 각 데이터베이스마다 비슷한 목적을 조금씩 다른 방식으로 구현하고 있다는 점입니다.
주요 차이점 정리
| DBMS | MVCC 기본 동작 | 정리 메커니즘 |
|---|---|---|
| PostgreSQL | Dead tuple을 남기며 새로운 버전 생성 | VACUUM / Autovacuum |
| MySQL (InnoDB) | Undo log에서 이전 버전 관리 | Purge |
| Oracle | Undo 세그먼트 기반으로 이전 버전 관리 | 내부 정리 프로세스 |
| SQL Server | Snapshot isolation 등에서 버전 저장소 사용 | 버전 저장소 정리 |
이와 같이 MVCC는 각 DB마다 서로 다른 방식 및 용어로 비슷하게 구현되어 있습니다.
Dead Tuples
PostgreSQL의 Dead Tuples는 수정/삭제 시 쌓이는 데이터입니다.
PostgreSQL은 MVCC를 사용해 동시에 읽기와 쓰기가 일어나는 상황에서 충돌을 줄입니다. 물론 잠금도 함께 사용하지만, 읽는 동안에도 다른 트랜잭션이 새 버전을 만들 수 있다는 점이 핵심입니다.
그렇다면 이렇게 쌓인 데이터는 언제 제거되는 걸까요?
Autovacuum
이렇게 쌓인 데이터를 정리하기 위해 Autovacuum이 존재합니다. Dead Tuple이 임계치까지 쌓이게 되면, 최적화를 위해 Garbage Collection을 실행하며 이를 Autovacuum이라고 합니다.
Autovacuum 데몬이 돌면서 임계치에 자동으로 실행됩니다. 또한, 수동으로 실행하는 vacuum 또한 존재합니다.
마치며
autovacuum에 대해서 알아보다 각 DB별 MVCC 구현과 차이점이 흥미로워 보여서 간단하게 정리해 보았습니다.


