[락플레이스] Azure Database for PostgreSQL 성능 최적화 팁
매니지드 서비스를 써도 기본적인 성능 관련 트러블슈팅에 대한 지식은 필요합니다. 그래서 Azure Database for PostgreSQL 성능 이슈가 생겼을 때 점검해 봐야 할 포인트를 간략히 소개합니다.
Azure Database for PostgreSQL는 서버와 스토리지 그리고 네트워크 인프라 관리와 데이터 가용성 보장 및 데이터 보호 그리고 확장까지 모두 마이크로소프트가 관리해주는 매니지드 서비스입니다. 그렇다면 매니지드 서비스 이용자는 성능 이슈에 신경 쓸 필요가 없을까요? 아닙니다. 데이터베이스 및 연결된 서버와 클라이언트는 자원 경쟁 관련 성능 이슈를 일으킬 수 있습니다. 이런 경우 원인을 파악해 적절하게 자원을 늘리거나 조정하는 쪽으로 클라우드 서비스 구독을 조정해야 늘 최상의 쿼리 성능을 유지할 수 있습니다.
1번) 클라이언트 측면에서 CPU, 메모리, 디스크 관련 자원 경쟁이 일어날 때 성능 문제가 나타날 수 있습니다. 어던 자원이 문제인지는 태스크 관리자, 애저 포탈, CLI 콘솔 화면을 통해 확인할 수 있습니다. 단, 클라이언트가 애저에 있어야 합니다.
2번) 애플리케이션 서버 환경에서 CPU, 메모리, 디스크 관련 자원 경쟁이 일어날 때 성능 저하가 일어날 수 있습니다. 이 역시 태스크 관리자, 애저 포탈, CLI 화면에서 확인할 수 있습니다. 애플리케이션 서버를 애저에 올려 운영한다면 애저 메트릭(Azure Metric)을 통해 자원 경쟁으로 인한 성능 저하 여부를 판단할 수 있습니다.
3번) Azure Database for PostgreSQL의 자원 경쟁도 성능 병목의 원인이 될 수 있습니다. 이 부분은 애저 메트릭을 통해 원인이 CPU인지, 메모리인지, 스토리지인지 파악할 수 있습니다. 더 자세한 내용은 Azure Database for PostgreSQL 모니터링 문서에서 볼 수 있습니다.
4) 네트워크 지연(latency) 문제도 빈번히 발생하는 성능 저하 원인이죠. 클라이언트나 애플리케이션 서버와 데이터베이스 인스턴스 간 네트워크 지연이 발행하면 속도가 느려지죠. 이는 다음과 같이 간단한 쿼리로 지연 여부를 확인할 수 있습니다. 쿼리 처리 속도가 느린 경우 애저에서 호스팅 되는 원격 클라이언트와 데이터베이스 인스턴스를 같은 리전과 리소스 그룹으로 묶으면 쿼리 속도가 빨라집니다.
\timing
SELECT;
\watch 1
데이터베이스 성능을 늘 최적의 상태로 유지하려면 앞서 소개한 주요 원인을 주의 깊게 봐야 합니다. 이와 함께 할 일은 쿼리 실행 통계 정보를 보여주는 pg_stat_statments 모듈을 통해 실행 시간이 긴 쿼리가 무엇인지 살펴보는 것입니다. 다음과 같이 Azure Database for PostgreSQL에서 실행 시간이 가장 긴 쿼리를 찾아볼 수 있습니다.
SELECT query, calls, total_time, rows, 100.0 * shared_blks_hit/
nullif(shared_blks_hit + shared_blks_read, 0) AS hit_percent
FROM pg_stat_statements
ORDER BY total_time
DESC LIMIT 5
참고로 성능 벤치마킹을 할 때만 쿼리 관련 통계를 잡도록 하는 것을 마이크로소프트는 추천하는데요, 다음과 같이 하면 됩니다.
SELECT pg_stat_statements_reset()
다음 팁은 자원 경쟁이 일어날 때 무엇을 어떻게 늘릴지에 대한 것입니다. 만약 Azure Database for PostgreSQL 인스턴스의 CPU 사용률이 100%를 지속한다면 비즈니스 시간을 늘리면 됩니다. 가령 스탠다드(Standard) 100 조건일 때 CPU 사용률이 100%를 지속하면, 스탠다드 200으로 늘립니다.
스토리지 부족으로 인한 성능 저하도 자주 발생합니다. Azure Database for PostgreSQL의 경우 기본 스토리지 용량은 125GB입니다. 이 용량은 IOPs가 375로 제한됩니다. 더 높은 IOPs를 요구하는 애플리케이션을 운영한다면 스토리지 용량을 키워 IOPs를 높일 수 있습니다.
from pg_stat_activity
group by wait_event, wait_event_type;
정리하자면 매니지드 서비스도 성능 이슈가 생길 수 있고, 이를 방지하기 위해 사용자는 성능 이슈의 원인을 파악할 수 있어야 하고, 원인별 맞춤형 자원 증설을 통해 문제를 해결할 수 있습니다. Azure Database for PostgreSQL 성능 최적화 관련 문의는 락플레이스로 부탁드립니다. 참고로 본 포스팅은 애저 블로그를 참조해 작성한 것입니다.