Amazon Aurora MySQL 인스턴스에 연결할 때 [“너무 많은 연결(Too Many Connections)”] 오류가 발생하는 이유는 무엇인가요?

최종 업데이트 날짜: 2020년 12월 16일

Amazon Aurora MySQL DB 인스턴스에 연결하려고 하는데 [“너무 많은 연결(Too Many Connections)”] 오류가 발생합니다. DB 인스턴스의 최대 연결 값은 얼마이며 이 값을 어떻게 튜닝할 수 있나요?

간략한 설명

Amazon Aurora MySQL DB 클러스터 또는 인스턴스에 연결하려고 할 때 클라이언트에서 [“너무 많은 연결(Too Many Connections)”] 오류가 발생하면 다른 클라이언트에서 사용 가능한 연결을 모두 사용하고 있는 것입니다. 이 값은 max_connections 파라미터로 정의됩니다.

다음과 같은 현상이 나타날 수 있습니다.

  • Amazon CloudWatchDatabaseConnections 지표는 Aurora MySQL DB 인스턴스의 max_connections 값과 가깝거나 같습니다.
  • max_connections 파라미터의 값이 DB 인스턴스 클래스에서 연결에 프로비저닝한 사용 가능한 메모리보다 높습니다. CloudWatch에서 낮은 FreeableMemory 지표 값과 같은 징후를 확인합니다.
  • MySQL 오류 로그에 [오류 1040(): 너무 많은 연결(ERROR 1040(): Too many connections)] 오류가 있습니다.

다음과 같은 이유로 max_connections 값에 도달할 수 있습니다.

  • DB 인스턴스에 대한 클라이언트/애플리케이션 연결 수가 갑자기 또는 점진적으로 증가합니다. 다음과 같은 원인이 있습니다.
    • 워크로드 증가가 연결 증가로 이어집니다.
    • 테이블/행 수준 잠금으로 인해 클라이언트/애플리케이션 연결이 증가합니다.
  • 클라이언트/애플리케이션이 작업 종료 후 연결을 제대로 닫지 않았습니다.
  • wait_timeout 및/또는 interactive_timeout과 같은 연결 시간 초과 파라미터의 값이 높으면 중지 상태의 연결이 증가할 수 있습니다.

최대 연결 오류를 해결하기 전에 먼저 DB 인스턴스에서 현재 실행 중인 모든 스레드를 확인합니다. 그런 다음 DB 인스턴스에서 로깅을 활성화합니다.

Aurora MySQL DB 인스턴스에서 현재 실행 중인 스레드 표시

SHOW FULL PROCESSLIST 명령은 DB 인스턴스에서 현재 실행 중인 스레드를 보여줍니다. DB 인스턴스에 로그인한 후 다음 쿼리를 실행합니다.

SHOW FULL PROCESSLIST\G

다음 쿼리를 실행하여 동일한 결과 집합을 가져올 수도 있습니다.

SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST

참고: MySQL DB 인스턴스에서 실행 중인 모든 스레드를 보려면 사용자 계정에 MySQL PROCESS 서버에 대한 관리 권한을 부여해야 합니다. 그렇지 않은 경우 SHOW PROCESSLIST는 사용 중인 MySQL 계정과 관련된 스레드만 표시합니다. 자세한 내용은 MySQL에서 제공하는 권한에 대한 MySQL 설명서를 참조하세요.

참고: SHOW FULL PROCESSLISTINFORMATION_SCHEMA.PROCESSLIST 문은 뮤텍스가 필요하므로 성능에 부정적인 영향을 줄 수 있습니다.

Aurora MySQL DB 인스턴스에 대한 로깅 활성화

general_log, slow_query_log 또는 고급 감사 로그 파라미터를 활성화하여 Aurora MySQL DB 인스턴스에 대한 로깅을 활성화합니다.

해결 방법

다음 방법 중 하나를 사용하여 최대 연결 오류를 해결합니다.

  • 기존 연결을 검토하고 가능한 경우 연결을 종료하여 연결 압력을 해제합니다. 예를 들어 중지 상태의 연결을 종료하여 시작합니다.
  • DB 인스턴스에 대한 최대 연결 수를 늘립니다.

DB 인스턴스의 기존 연결 종료

rds_killrds_kill_query 명령을 실행하여 DB 인스턴스에서 현재 실행 중인 사용자 세션 또는 쿼리를 종료합니다.

CALL mysql.rds_kill(thread-ID);
CALL mysql.rds_kill_query(thread-ID);

DB 인스턴스에 대한 최대 연결 수 늘리기

다음 방법을 사용하여 DB 인스턴스에 대한 최대 연결 수를 늘립니다.

  • 더 많은 메모리가 있는 DB 인스턴스 클래스까지 인스턴스를 확장합니다. 참고: DB 인스턴스 클래스를 확장하면 중단이 발생합니다.
  • 사용자 정의 인스턴스 수준의 파라미터 그룹을 사용하여 max_connections 파라미터에 대해 더 큰 값을 설정합니다. max_connections 파라미터를 늘리면 중단이 발생하지 않지만 DB 인스턴스에서 기본 파라미터 그룹을 사용하는 경우 파라미터 그룹을 사용자 정의 파라미터 그룹으로 변경합니다. 파라미터 그룹을 변경하면 중단이 발생합니다. 자세한 내용은 DB 파라미터 그룹 작업을 참조하세요.

참고: Aurora MySQL DB 인스턴스에 허용되는 최대 연결 수는 DB 인스턴스의 인스턴스 수준 파라미터 그룹에 있는 max_connections 파라미터에 의해 결정됩니다. 다음 예를 참조하세요.

max_connections = GREATEST({log(DBInstanceClassMemory/805306368)*45},{log(DBInstanceClassMemory/8187281408)*1000})

DB 인스턴스에 대한 max_connections 파라미터의 현재 값을 확인합니다. 이렇게 하려면 DB 인스턴스에 연결된 파라미터 그룹을 확인하거나 다음 쿼리를 실행합니다.

select @@max_connections;

max_connections 파라미터의 사양은 다음과 같습니다.

  • DB 클러스터와 DB 인스턴스 파라미터 그룹 모두에 설정할 수 있습니다. 그러나 인스턴스 수준 파라미터 설정이 적용됩니다.
  • 허용되는 값은 1-16000 범위의 정수입니다.
  • 본질적으로 동적입니다. 이 파라미터 값을 변경하기 위해 재부팅할 필요가 없습니다.

Aurora MySQL에서 사용할 수 있는 각 DB 인스턴스 클래스의 max_connections 기본값에 대한 자세한 내용은 Aurora MySQL DB 인스턴스에 대한 최대 연결 수를 참조하세요.

참고: Aurora MySQL과 Amazon Relational Database Service(Amazon RDS) MySQL DB 인스턴스는 메모리 오버헤드 양이 다릅니다. 동일한 인스턴스 클래스를 사용하는 Aurora MySQL 인스턴스와 RDS MySQL DB 인스턴스의 max_connections 값이 다를 수 있습니다. 나열된 값은 Aurora MySQL에만 적용됩니다.

max_connections 파라미터 튜닝에 대한 모범 사례

DB 인스턴스의 max_connections 파라미터로 작업할 때 다음 사항을 고려해야 합니다.

  • 기본 연결 제한은 버퍼 풀, 쿼리 캐시 등의 다른 주요 메모리 소비자의 기본값을 사용하는 시스템에 맞춰 튜닝됩니다. DB 클러스터에 대해 이러한 설정을 변경하는 경우 DB 인스턴스에서 사용 가능한 메모리의 증가 또는 감소를 고려하여 연결 제한을 조정하는 것이 좋습니다.
  • max_connections를 각 DB 인스턴스에서 열 것으로 예상되는 최대 연결 수보다 약간 더 높이 설정합니다.
  • performance_schema도 활성화한 경우 max_connections 파라미터 설정에 주의해야 합니다. 성능 스키마 메모리 구조는 max_connections를 포함한 서버 구성 변수에 따라 자동으로 크기가 조정됩니다. 변수를 높게 설정할수록 성능 스키마가 더 많은 메모리를 사용합니다. 극단적인 경우 이로 인해 T2와 T3 등의 더 작은 인스턴스 유형에서 메모리 부족 문제가 발생할 수 있습니다. 성능 스키마를 사용하는 경우 max_connections를 기본값으로 두는 것이 좋습니다. max_connections를 기본값보다 훨씬 높은 값으로 늘리려면 성능 스키마를 비활성화하는 것이 좋습니다. 참고: Aurora MySQL DB 인스턴스에 대해 성능 개선 도우미를 활성화하면 성능 스키마가 자동으로 활성화됩니다.

튜닝을 위해 다음 MySQL 연결 파라미터를 고려할 수도 있습니다.

  • wait_timeout: 서버가 비대화형 TCP/IP 또는 UNIX 파일 연결을 종료하기 전에 해당 연결에 대한 활동을 기다리는 시간(초)입니다.
  • interactive_timeout: 서버가 대화형 연결을 종료하기 전에 해당 연결에 대한 활동을 기다리는 시간(초)입니다.
  • net_read_timeout: 읽기를 삭제하기 전에 TCP/IP 연결에서 추가 데이터를 기다리는 시간(초)입니다.
  • net_write_timeout: 쓰기를 삭제하기 전에 블록이 쓰여질 때까지 TCP/IP 연결을 기다리는 시간(초)입니다.
  • max_execution_time: SELECT 문에 대한 실행 제한 시간(밀리초)입니다.
  • max_connect_errors: 중단된 연결 수가 이보다 많으면 호스트가 추가 연결에서 차단됩니다.
  • max_user_connections: 지정한 MySQL 계정에 허용되는 최대 동시 연결 수입니다.

참고: 이 문서에는 이러한 파라미터에 대한 권장 값 또는 사용자 정의 값이 포함되어 있지 않습니다. 이러한 값은 개별 사용 사례에 따라 달라지기 때문입니다.