AWS RDS 슬로우 쿼리 로그의 커서 이름 이슈

위 스크린샷의 14시와 15시 사이에 RDS 의 DB 인스턴스의 CPU 부하가 90% 이상을 초과했다. 이러한 상황의 경우 어떤 호스트에서 수행한 쿼리가 문제가 되고 있는지 알기 위해서 AWS Aurora PostgreSQL의 클러스터 또는 인스턴스 파라미터를 변경하여 쿼리 로깅을 활성화하고 log_min_duration_statement에 대한 값을 지정하면 해당 밀리초를 초과하여 수행한 쿼리에 대한 duration 로그를 기록하고 CloudWatch의 로그 인사이트에서 확인할 수 있다.

FETCH ALL IN "rcursor" 🤔

RDS 콘솔의 성능 개선 도우미에서 데이터베이스 로드와 상위 SQL 정보를 확인할 수 있는데 위와 같이 FETCH ALL IN "rcursor" 가 대부분의 로드로 기록되어있는 걸 볼 수 있다. 실제 SQL를 확인할 수 있는 것들 이외에 rcursor 란 것은 도대체 무엇을 의미하는 것인지 알아야할 것 같다. PL/pgSQL 함수를 작성할 때 Cursor를 선언하고 조회한 결과를 반환할 수 있다. 일반적으로 이야기하는 프로시저 함수를 의미하며 애플리케이션에서 사용중인 대부분의 함수의 커서 이름을 동일하게 지정하여 선언했다는 것을 의미한다.

기본적으로 커서 이름을 지정하지 않으면 자동으로 <unnamed cursor 1>와 같은 랜덤한 커서가 만들어지고 JDBC 에서 SQL 함수를 호출한 결과에서 커서 이름을 굳이 동일하게 지정할 필요는 없다. 따라서, 애플리케이션은 함수 정의 시 어떤 이름의 커서를 사용하는지에 대해서는 상관하지 않으며 SQL 함수를 관리하는 개발자 혹은 DBA가 관리하기 위한 이름일 뿐이다. 그래서 쉽게 관리하여 사용하기 위해 통일했던 것으로 생각된다.

RDS 모니터링을 위한 커서 이름을 사용하세요.

RDS 모니터링 및 슬로우 쿼리를 확인할 수 있도록 동일한 커서 이름이 아닌 SQL 함수별 별도의 커서 이름을 정의하여 구분하는게 필요하다. SQL 함수 작성 시 커서 이름은 함수 이름과 동일하게 하여 명확히 구분하기로 협의했고 위와 같이 오래 수행되는 슬로우 쿼리를 쉽게 확인할 수 있다. 기존에는 개발자가 슬로우 쿼리를 확인할 수 있도록 애플리케이션 서버에 로그가 출력되도록 했지만 이제는 개발자 뿐만 아니라 DB 혹은 인프라 엔지니어도 RDS 모니터링으로 슬로우 쿼리 구분이 가능하도록 변경하고 있다.

# 여러분은 어떤 쿼리가 2초나 소요됬는지 파악할 수 있나요?
LOG:  duration: 2217.321 ms  execute <unnamed>: FETCH ALL IN "rcursor"