;

PostgreSQL noisia 부하 테스트: Docker로 wait-xacts 재현 순서 본문

Programing

PostgreSQL noisia 부하 테스트: Docker로 wait-xacts 재현 순서

WindowsHyun 2026. 7. 16. 23:01
반응형

운영 PostgreSQL에서 연결 고갈이나 락 대기는 가끔 터지는데, 재현 환경이 없으면 알람 규칙과 모니터링을 검증하기 어렵습니다. noisia는 그런 장애 상황을 테스트 DB에 의도적으로 만드는 워크로드 생성기입니다.

직접 돌려보지는 않았습니다. 공식 READMEv0.4.0 릴리스 기준으로 정리했습니다. 저는 개인 서버 알람을 손볼 때 운영 DB에 붙이지 않고, 별도 테스트 인스턴스에서 wait-xacts부터 보겠습니다.

1. 적용 범위

  • 테스트용 PostgreSQL에서 락 대기, 연결 고갈, 임시 파일 스필 같은 증상을 재현하려는 경우입니다.
  • 모니터링 대시보드나 알림 규칙이 실제로 잡히는지 확인하려는 경우입니다.
  • 운영 서비스 DB, 공유 개발 DB, 백업 원본에는 쓰지 않습니다.

공식 README도 테스트 전용으로 못 박아 둡니다. 워크로드 중 idle 트랜잭션, 연결 고갈, WAL 폭주, 백엔드 OOM 유도 같은 항목은 다른 세션을 끊거나 인스턴스를 멈출 수 있습니다.

Docker로 테스트 DB를 먼저 띄우는 흐름은 Docker MongoDB Replica Set 구축하기와 같이 보시면 됩니다. 여기서는 DB 설치보다 noisia 실행 순서에 초점을 둡니다.

2. 준비물

  • 로컬 또는 내부망의 테스트 PostgreSQL 1대.
  • Docker 실행 환경.
  • non-superuser 역할의 접속 문자열. cascade 데모에서 모니터용 superuser 자리를 남겨 두기 위함입니다.
  • 워크로드 지속 시간. README 예시는 초 단위 duration을 둡니다.

v0.4.0부터 wait-xacts는 락만 잡지 않고 blocked waiter 연결 풀을 엽니다. 기본 cap은 10이고, 0은 무제한입니다. tempfileswork_mem을 억지로 낮추는 대신 실제 정렬 스필로 임시 파일을 만듭니다.

3. Docker 실행

이미지를 받고 도움말을 확인합니다.

docker pull lesovsky/noisia:latest
docker run --rm -ti lesovsky/noisia:latest noisia --help

테스트 DB 접속 정보는 환경에 맞게 바꿉니다. 아래 placeholder를 그대로 두지 마시고, 호스트·계정·DB 이름만 맞추시면 됩니다.

docker run --rm -ti lesovsky/noisia:latest noisia \
  --conninfo "host=<테스트_DB_IP> user=app dbname=app_db sslmode=disable" \
  --wait-xacts \
  --wait-xacts.fixture \
  --duration 60s

기본값은 waiter 10개, 초당 1개 정도입니다. 락 대기 세션이 쌓이는지만 보려면 이 정도면 충분합니다.

연결 슬롯을 끝까지 밀어 보려면 waiters cap을 0으로 둡니다. 이 경우 max_connections 근처에서 새 클라이언트 접속이 거절됩니다.

docker run --rm -ti lesovsky/noisia:latest noisia \
  --conninfo "host=<테스트_DB_IP> user=app dbname=app_db sslmode=disable" \
  --wait-xacts \
  --wait-xacts.fixture \
  --wait-xacts.waiters=0 \
  --wait-xacts.waiters-rate=1 \
  --duration 5m

4. 관찰 포인트

두 번째 터미널에서 락 대기 세션을 봅니다. fixture 테이블을 쓰면 대상 테이블 이름이 _noisia_waitxacts_workload로 잡힙니다.

SELECT pid, state, wait_event_type, wait_event, query
FROM pg_stat_activity
WHERE application_name = 'noisia' AND wait_event_type = 'Lock';

noisia 자체 리포트 한 줄도 같이 봅니다. 문서 예시는 이런 형태입니다.

waitxacts: established=47 target=unlimited refused=312 locked_table=_noisia_waitxacts_workload

established는 현재 열린 waiter 연결 수입니다. refused는 접속 거절 횟수입니다. 무제한 waiter 실험에서는 refused가 올라가는 게 정상 관찰값입니다.

확인

테스트 DB에서 위 SQL에 락 대기 행이 보이고, noisia 로그에 waitxacts 리포트 한 줄이 나오면 재현 경로는 준비된 것입니다. 끝나면 컨테이너를 종료하고 테스트 인스턴스 연결 수를 다시 확인하시면 됩니다.

반응형
Comments