tencent cloud

TencentDB for MySQL

소식 및 공지 사항
제품 동향
신규 사용자 가이드
제품 소개
제품 개요
제품 장점
응용 시나리오
데이터베이스 아키텍처
격리 정책
제품 기능 목록
데이터베이스 인스턴스
고가용성(멀티 가용존)
리전 및 가용존
자체개발 커널
TXSQL 커널 개요
기능적 특성
성능적 특성
보안적 특성
안정적 특성
구매 가이드
과금 개요
구매 방법
연장 안내
연체 안내
환불 안내
인스턴스 비용 조정 설명
백업 공간 과금 안내
시작하기
시작 개요
MySQL 인스턴스 생성
운영 가이드
사용 제한
운영 개요
인스턴스의 점검 관리
인스턴스 프로모션
인스턴스 확장
데이터베이스 프록시
데이터베이스 관리(DMC)
계정 관리
매개변수 설정
백업과 롤백
데이터 마이그레이션
네트워크 및 보안
모니터링 및 알람
로그 센터
태그
사례 튜토리얼
TencentDB for MySQL의 사용 규범
애플리케이션 구성 자동 재연결
MySQL 마스터 인스턴스 매개변수 수정의 영향
MyISAM에서 InnoDB로의 자동 변환 제한
TencentDB for MySQL을 위한 VPC 생성
TencentDB for MySQL를 통해 비즈니스 부하 능력 향상
2리전 3데이터센터 재해 복구 아키텍처 구축
읽기/쓰기 분리로 TencentDB for MySQL 성능 향상
DTS를 사용하여 InnoDB에서 RocksDB로 데이터 마이그레이션
웹 애플리케이션을 위한 LAMP 스택 구축
Drupal 웹사이트 구축
Python을 통해 MySQL API 사용
백서
성능 백서
보안 백서
장애 처리
연결 관련
성능 관련
인스턴스 데이터 동기화 딜레이
케이스 인센시티브 설정 실패
API문서
History
Introduction
API Category
Instance APIs
Making API Requests
Data Import APIs
Database Proxy APIs
Database Audit APIs
Security APIs
Task APIs
Backup APIs
Account APIs
Rollback APIs
Parameter APIs
Database APIs
Monitoring APIs
Log-related API
Data Types
Error Codes
FAQs
과금 관련
백업 관련
롤백 관련
로그인
매개변수 수정
업그레이드 관련
계정 권한
성능 메모리
유지보수 관련 FAQ
데이터 마이그레이션
기능 특징
콘솔 관련
로그 관련
API 2.0에서 3.0으로 전환 가이드
Service Agreement
Service Level Agreement
Terms of Service
범용 참고
표준 및 인증
고객센터
용어집

메모리 할당 문제

PDF
포커스 모드
폰트 크기
마지막 업데이트 시간: 2024-07-25 16:45:27
TencentDB for MySQL 메모리는 성능에 영향을 미치는 주요 매개변수로, 주로 SQL의 요청 오류 및 데이터베이스 최적화 작업 대기 시 사용률이 증가합니다. 심한 경우 OOM으로 인한 인스턴스의 HA 변환이 발생해 비즈니스 안정성과 가용성이 떨어질 수 있습니다.
MySQL 메모리는 global 레벨의 공유 메모리와 session 레벨의 전용 메모리로 구분합니다. 공유 메모리는 인스턴스 생성과 동시에 할당되는 메모리 용량으로, 모든 액세스에 공유됩니다. 전용 메모리는 MySQL 서버 연결 시 할당되는 개별 캐시입니다. 일부 특수 SQL 또는 필드는 단일 스레드가 다수의 캐시를 할당해 OOM 오류가 발생할 수 있으며, 이는 연결한 전용 메모리가 원인입니다. 각 구성 부분에 대한 자세한 내용은 다음과 같습니다.

공유 메모리

다음 명령어를 실행하면 예시와 같은 공유 메모리 할당 내용을 확인할 수 있습니다.
show variables where variable_name in ('innodb_buffer_pool_size','innodb_log_buffer_size','innodb_additional_mem_pool_size','key_buffer_size','query_cache_size');
설명:
5.7버전은 innodb_additional_mem_pool_size를 지원하지 않습니다.
다음 매개변수는 1000MB 메모리 인스턴스의 공유 메모리에 할당된 내용을 조회한 결과입니다(이하 인스턴스 구성 테스트).
1. +---------------------------------+-----------+
2. | Variable_name | Value |
3. +---------------------------------+-----------+
4. | innodb_additional_mem_pool_size | 8388608 |
5. | innodb_buffer_pool_size | 524288000 |
6. | innodb_log_buffer_size | 67108864 |
7. | key_buffer_size | 16777216 |
9. | query_cache_size | 0 |
10. +---------------------------------+-----------+
11. 5 rows in set (0.01 sec)
매개변수 설명:
innodb_buffer_pool_size 해당 캐시는 Innodb 엔진에서 가장 중요한 캐시 영역으로, 메모리로 물리적 데이터 파일을 보충하는 주요 수단입니다. TencentDB for MySQL은 인스턴스 사양의 50 ~ 80%를 해당 용량(위 도표 1000MB * 0.5 = 500MB)으로 설정합니다. 해당 캐시는 데이터 페이지, 인덱스 페이지, undo 페이지, insert buffer, 자기 적응 해시 인덱스, lock 정보 및 데이터 사전 등 정보를 담고 있습니다. SQL에서 읽기와 쓰기 작업이 일어나면 물리적 데이터 파일이 아닌 buffer_pool에서 작업이 발생한 뒤 checkpoint와 같은 메커니즘을 거쳐 데이터 파일을 write back합니다. 해당 캐시 공간은 데이터베이스의 성능 향상, SQL 실행 속도 향상의 장점이 있는 반면, 장애 복구가 더딜 수 있습니다.
innodb_log_buffer_size 해당 영역은 주로 redo log 정보를 저장하며, TencentDB for MySQL은 64MB의 용량이 설정되어 있습니다. InnoDB는 redo log를 이 영역에 입력한 뒤, 일정한 빈도수에 따라 새로 고침하여 로그 파일을 새로 생성합니다. 통상 해당 영역 캐시는 빠른 주기로 redo log가 새로 고침(Master Thread가 매초마다, 트랜잭션 제출 시마다, 해당 공간이 1/2 미만일 때 새로 고침)되기 때문에 큰 용량이 요구되지 않습니다.
innodb_additional_mem_pool_size 해당 영역은 주로 InnoDB 내부의 일부 데이터 구조를 저장하며, TencentDB for MySQL은 8MB로 일괄 설정되어 있습니다. 통상 buffer_pool에서 메모리 신청 시 해당 객체 구조 정보를 저장할 수 있는 별도 메모리를 신청해야 합니다. 해당 영역의 용량은 테이블 개수와 관련이 있어 테이블 개수가 많을수록 용량도 늘어납니다.
key_buffer_size 해당 영역은 MyISAM 테이블의 주요 캐시 영역으로, 모든 인스턴스는 16M로 설정되며, MyISAM 테이블 키를 저장합니다. MyISAM 테이블은 InnoDB 테이블과 달리 인덱스 캐시가 key_buffer에 저장되며, 데이터 캐시는 운영 체제의 메모리에 저장됩니다. TencentDB for MySQL은 MyISAM 엔진을 채택하고 있어 해당 영역을 위한 공간을 할애해야 합니다.
query_cache_size 해당 영역은 조회 결과를 캐시 형태로 저장하며, SQL의 리졸브 및 실행을 위한 비용을 줄일 수 있습니다. TencentDB for MySQL은 해당 영역의 캐시 저장을 비활성화하고 있습니다. 주로 읽기가 많고, 쓰기가 적은 응용 시나리오에 적합하며, SQL 명령에 의한 hash 값에 따라 캐시 형태로 저장되기 때문에 테이블 데이터가 변동 하면 즉시 무효화됩니다.

전용 메모리

다음 명령어를 실행하면 예시와 같은 session 전용 메모리 할당 내용을 확인할 수 있습니다.
show variables where variable_name in ('read_buffer_size','read_rnd_buffer_size','sort_buffer_size','join_buffer_size','binlog_cache_size','tmp_table_size');
조회 결과는 다음과 같습니다(이하 인스턴스 구성 테스트).
1. +----------------------+-----------+ 2. | Variable_name | Value | 3. +----------------------+-----------+ 4. | binlog_cache_size | 32768 | 5. | join_buffer_size | 262144 | 6. | read_buffer_size | 262144 | 7. | read_rnd_buffer_size | 524288 | 8. | sort_buffer_size | 524288 | 9. | tmp_table_size | 209715200 | 10. +----------------------+-----------+ 11. 6 rows in set (0.00 sec)
매개변수 설명:
read_buffer_size 순차 스캐닝(progressive scanning)에 의한 캐시 메모리를 각각 저장합니다. thread가 데이터를 순차적으로 스캔하는 경우 buffer 공간을 우선 스캔하기 때문에 물리적 읽기를 줄일 수 있습니다.
read_rnd_buffer_size 랜덤 스캐닝(Random Scanning)에 의한 캐시 메모리를 각각 저장합니다. thread가 데이터를 랜덤으로 스캔하는 경우 buffer 공간을 우선 스캔하기 때문에 물리적 읽기를 줄일 수 있습니다.
sort_buffer_size order by 및 group by의 SQL 실행 시 정렬된 중간 결과를 저장하기 위한 sort_buffer를 할당합니다. 정렬 시, 스토리지가 sort_buffer_size를 초과하는 경우, 작업 완료를 위해 디스크에 임시 테이블이 생성됩니다.
join_buffer_size MySQL은 nest loop의 join 알고리즘만 지원하며, 선행 테이블의 행을 추출하여 후행 테이블을 읽으면서 조인하는 로직을 사용하고 있습니다. 이때 후행 테이블을 join_buffer에 삽입하기 때문에 동시 접속 보호 메커니즘이 있는 buffer_pool에 액세스하지 않아도 됩니다.
binlog_cache_size 해당 영역은 해당 thread의 binlog 로그를 캐시 형태로 저장합니다. 개별 트랜잭션은 commit되기 전 관련 로그를 binlog_cache에 우선 저장합니다. 트랜잭션이 commit되면 디스크에 binlog 파일이 생성되어 장기 보존됩니다.
tmp_table_size 앞선 session 레벨의 buffer와 달리 해당 매개변수는 콘솔에서 수정할 수 있습니다. 사용자 메모리의 임시 테이블 용량을 가리키며, 해당 thread로 생성된 임시 테이블의 용량이 설정 값을 초과한 경우, 임시 테이블이 디스크 내의 MyISAM 임시 테이블로 전환됩니다.

도움말 및 지원

문제 해결에 도움이 되었나요?

피드백