AWS에서 Aurora PostgreSQL 를 사용중이었으며 vpc를 변경하는 작업이 있었습니다 cluster 단위에서 vpc 변경은 스냅샷 생성 후 해당 vpc 환경에서 복원하는 방법으로 진행했습니다

문제

cluster 복원 후 모니터링 하던 중 쿼리 속도가 지나치게 느린것을 확인하였습니다. 오래 걸려야 1초가 소비되는 작업이 90초 이상 소비되는 상태였습니다.

확인

서버에 연결된 세션수와 상세 정보를 확인합니다.

SELECT COUNT(*) FROM pg_stat_activity;

SELECT pid, usename, client_addr, query_start, query 
FROM pg_stat_activity 
ORDER BY query_start 

위 통계 쿼리로 확인을 하여도 특정 쿼리에서 지연이 발생하는것은 아니었으며 전체 쿼리가 지연되는 현상이었습니다.

지나치게 오래 걸리는 쿼리는 강제 종료하여 다른 쿼리가 실행 될 수 있도록 합니다. 사용하는 것을 추천하지는 않습니다.

SELECT pg_terminate_backend(PID); 세션 강제 종료
SELECT pg_cancel_backend(PID);  쿼리 중지

스냅샷 복원 후 rds 속도 저하에 대한 검색을 해보니 vocuum 명령어를 사용하여 문제 해결이 가능하다는 것을 알았습니다.

해결

아래 psql vocuum과 관련된 명령어를 실행하여 데드튜블을 삭제하고 전체 테이블을 스캔하여 통계값을 새로 업데이트합니다

db에 대해 vacuum 작업을 진행하며 쿼리를 효율적으로 실행 할 수 잇도록 통계데이터를 업데이트 합니다. lock이 실행되므로 운영중일때는 실행하지 않도록 합니다.

VACUUM FULL ANALYZE; 

또는 테이블 단위로 vacuum 작업을 실행할 수 있습니다.

VACUUM FULL [table_and_columns];

테이블의 상세 정보를 확인 할 수 있습니다.

SELECT * FROM pg_stat_all_tables 
WHERE schemaname = 'public'
ORDER BY schemaname, relname;

참고

  • https://www.postgresql.org/docs/12/sql-vacuum.html
  • https://cintia.me/blog/post/lazy-rds/
  • https://stackoverflow.com/questions/47717862/rds-instance-unusably-slow-after-restoring-from-snapshot