Aurora MySQL 튜닝을 위한 필수 개념 - Amazon Aurora

Aurora MySQL 튜닝을 위한 필수 개념

Aurora MySQL 데이터베이스를 튜닝하기 전에 대기 이벤트 및 스레드 상태가 어떠한지, 왜 이런 일이 발생하는지 확인하세요. 또한 InnoDB 스토리지 엔진을 사용할 때 Aurora MySQL의 기본 메모리 및 디스크 아키텍처도 검토하세요. 유용한 아키텍처 다이어그램에 대해서는 MySQL 참조 설명서를 참조하세요.

Aurora MySQL 대기 이벤트

대기 이벤트는 세션이 대기 중인 리소스를 나타냅니다. 예를 들어 대기 이벤트 io/socket/sql/client_connection은 스레드가 새 연결을 처리하고 있음을 나타냅니다. 세션이 기다리는 일반적인 리소스는 다음과 같습니다.

  • 버퍼에 대한 단일 스레드 액세스(예: 세션이 버퍼 수정을 시도하는 경우)

  • 현재 다른 세션에 의해 잠겨 있는 행

  • 데이터 파일 읽기

  • 로그 파일 쓰기

예를 들어 쿼리를 충족하기 위해 세션에서 전체 테이블 스캔을 수행할 수 있습니다. 데이터가 아직 메모리에 없는 경우 세션은 디스크 I/O가 완료될 때까지 기다립니다. 버퍼를 메모리로 읽으면 다른 세션이 동일한 버퍼에 액세스하기 때문에 세션을 기다려야 할 수 있습니다. 데이터베이스는 미리 정의된 대기 이벤트를 사용하여 대기를 기록합니다. 이러한 이벤트는 카테고리로 그룹화됩니다.

대기 이벤트 자체가 성능 문제를 나타내지는 않습니다. 예를 들어 요청된 데이터가 메모리에 없으면 디스크에서 데이터를 읽어야 합니다. 한 세션이 업데이트를 위해 행을 잠그면 다른 세션은 해당 행의 잠금이 해제될 때까지 기다려 업데이트할 수 있습니다. 커밋을 수행하려면 로그 파일에 대한 쓰기가 완료될 때까지 대기해야 합니다. 대기는 데이터베이스의 정상적인 기능에 필수적입니다.

많은 수의 대기 이벤트는 일반적으로 성능 문제를 나타냅니다. 이러한 경우 대기 이벤트 데이터를 사용하여 세션이 시간을 소비하는 위치를 결정할 수 있습니다. 예를 들어 일반적으로 몇 분 안에 실행되는 보고서가 몇 시간 동안 실행되는 경우 총 대기 시간에 가장 많이 기여하는 대기 이벤트를 식별할 수 있습니다. 최상위 대기 이벤트의 원인을 확인할 수 있는 경우 성능을 향상시키는 변경 작업을 수행할 수 있습니다. 예를 들어 세션이 다른 세션에 의해 잠긴 행에서 대기 중인 경우 잠금 세션을 종료할 수 있습니다.

Aurora MySQL 스레드 상태

일반 스레드 상태는 일반 쿼리 처리와 연결된 State 값입니다. 예를 들어 sending data 스레드 상태는 스레드가 올바른 결과 집합을 결정하기 위해 쿼리의 행을 읽고 필터링하고 있음을 나타냅니다.

스레드 상태를 사용하여 대기 이벤트를 사용하는 방법과 유사한 방식으로 Aurora MySQL 튜닝할 수 있습니다. 예를 들어 sending data의 빈번한 발생은 일반적으로 쿼리가 인덱스를 사용하고 있지 않음을 나타냅니다. 스레드 상태에 대한 자세한 내용은 MySQL 참조 설명서에서 일반 스레드 상태를 참조하세요.

성능 개선 도우미를 사용하는 경우 다음 조건 중 하나에 해당됩니다.

  • 성능 스키마가 켜져 있음 - Aurora MySQL이 스레드 상태가 아닌 대기 이벤트를 표시합니다.

  • 성능 스키마가 꺼져 있음 - Aurora MySQL이 스레드 상태를 표시합니다.

자동 관리를 위해 성능 스키마를 구성하는 것이 좋습니다. 성능 스키마는 잠재적인 성능 문제를 조사하기 위한 추가적인 인사이트 및 더 나은 도구를 제공합니다. 자세한 내용은 Aurora MySQL에서 성능 개선 도우미에 대해 성능 스키마 활성화 섹션을 참조하세요.

Aurora MySQL 메모리

Aurora MySQL에서 가장 중요한 메모리 영역은 버퍼 풀과 로그 버퍼입니다.

버퍼 풀

버퍼 풀은 Aurora MySQL이 테이블 및 인덱스 데이터를 캐시하는 공유 메모리 영역입니다. 쿼리는 디스크에서 읽지 않고도 메모리에서 자주 사용하는 데이터에 직접 액세스할 수 있습니다.

버퍼 풀은 연결된 페이지 목록으로 구성됩니다. 페이지에는 여러 개의 행이 있을 수 있습니다. Aurora MySQL은 최소최근사용(LRU) 알고리즘을 사용하여 풀에서 페이지를 에이징합니다.

자세한 내용은 MySQL 참조 설명서Buffer Pool(버퍼 풀)을 참조하세요.

Aurora MySQL 프로세스

Aurora MySQL은 Aurora PostgreSQL과는 매우 다른 프로세스 모델을 사용합니다.

MySQL 서버(mysqld)

MySQL 서버는 mysqld라는 단일 운영 체제 프로세스입니다. MySQL 서버는 추가 프로세스를 생성하지 않습니다. 따라서 Aurora MySQL 데이터베이스는 mysqld를 사용하여 대부분의 작업을 수행합니다.

MySQL 서버가 시작되면 MySQL 클라이언트에서 네트워크 연결을 수신합니다. 클라이언트가 데이터베이스에 연결되면 mysqld가 스레드를 엽니다.

스레드

연결 관리자 스레드는 각 클라이언트 연결을 전용 스레드와 연결합니다. 이 스레드는 인증을 관리하고 명령문을 실행하며 결과를 클라이언트로 반환합니다. 필요한 경우 연결 관리자가 새 스레드를 만듭니다.

스레드 캐시는 사용 가능한 스레드의 집합입니다. 연결이 해제되는 경우 캐시가 꽉 차지 않으면 MySQL은 스레드를 스레드 캐시로 반환합니다. thread_cache_size 시스템 변수를 사용하여 스레드 캐시 크기를 결정합니다.

스레드 풀

스레드 풀은 여러 스레드 그룹으로 구성됩니다. 각 그룹은 클라이언트 연결 집합을 관리합니다. 클라이언트가 데이터베이스에 연결되면 스레드 풀은 라운드 로빈 방식으로 스레드 그룹에 연결을 할당합니다. 스레드 풀은 연결과 스레드를 분리합니다. 연결 및 해당 연결에서 받은 명령문을 실행하는 스레드 간에는 관계가 고정되지 않습니다.