오래 열린 트랜잭션 경보와 강제 종료, 집계용 복제본 제공, 언두 로그·죽은 행 증가 감시.
그래프에서는
서서히 오름 · 언두 로그 길이(History list length), 죽은 행 수
확인할 곳
MySQL은 INFORMATION_SCHEMA.INNODB_TRX의 trx_started로 가장 오래된 트랜잭션을 찾고, SHOW ENGINE INNODB STATUS의 TRANSACTIONS 섹션에 나오는 History list length(아직 정리하지 못한 언두 로그 양)를 봄. PostgreSQL은 pg_stat_activity의 xact_start와 state가 idle in transaction인 세션, pg_stat_user_tables의 n_dead_tup을 봄
이러면 맞음
몇 분~몇 시간 된 트랜잭션이 있고 그동안 History list length나 n_dead_tup이 계속 오르다 그 트랜잭션을 끝낸 뒤 정리(purge·VACUUM)가 돌면서 줄어듦
이러면 아님
오래된 트랜잭션이 없는데 전반적으로 느리면 체크포인트(db-checkpoint)나 디스크 쪽
확인 수단
인프라 도구로 확인(게임 코드 불필요)
더 알아보기
DB는 읽는 쪽이 고치기 전 모습을 볼 수 있도록 옛 버전을 남겨 둡니다(MVCC). 가장 오래된 트랜잭션이 끝나야 이 기록을 지울 수 있습니다. 트랜잭션 하나가 몇 시간 열려 있으면 MySQL은 언두 로그가, PostgreSQL은 VACUUM이 정리하지 못한 죽은 행(dead tuple)이 쌓입니다. SQL Server는 트랜잭션 로그가 줄지 않아 디스크를 채우기도 합니다.
출처
InnoDB Multi-VersioningMySQL 옛 버전을 볼 수 있는 트랜잭션이 남아 있으면 update 언두 로그를 버리지 못해 롤백 세그먼트가 커짐, 읽기만 하는 트랜잭션도 자주 커밋 권고