목차
개요
카카오테크캠퍼스 백엔드 과정 주차 관련 공부내용
MySQL에서 제공하는 버퍼풀 래퍼런스를 참고하여 작성하였다.
MySQL :: MySQL 8.0 Reference Manual :: 15.5.1 Buffer Pool
MySQL :: MySQL 8.0 Reference Manual :: 15.5.1 Buffer Pool
The buffer pool is an area in main memory where InnoDB caches table and index data as it is accessed. The buffer pool permits frequently used data to be accessed directly from memory, which speeds up processing. On dedicated servers, up to 80% of physical
dev.mysql.com
결국에는 데이터베이스의 성능 증가의 핵심은 디스크 Input/Output 을 최소화 하는 전략이다.
따라서 MySQL 뿐만아니라 많은 데이터 베이스들이 스토리지 엔진에 캐싱(Cashing)이라는 전략을 사용하고 있다.
캐싱
정의
자주 조회되는 데이터를 빠르게 접근할 수 있는 메모리에 저장하여, 데이터베이스 디스크 I/O를 줄이는 역할을 한다.
이해를 돕기 위해 - 일반적인 컴퓨터 아키텍처에서의 캐싱전략
컴퓨터 아키텍처에서 사용하는 램(RAM)이나 CPU 캐시는 데이터 접근 속도를 향상시키기 위한 캐싱 전략의 일종이다.
CPU의 경우
- CPU 캐시는 CPU와 메인 메모리 간의 속도 차이를 줄이기 위해 구현되어있다.
- CPU 캐시는 메모리보다 훨씬 빠른 속도로 데이터를 처리할 수 있는 반면, 비용이 많이 들고 크기가 작아서 모든 데이터를 저장할 수 없다. 따라서 CPU 캐시는 최근에 사용된 데이터나 사용될 가능성이 높은 데이터를 저장하여 CPU가 빠르게 접근할 수 있게 해준다.
RAM의 경우
- 램(RAM)도 유사한 목적으로 사용되는데 램은 디스크보다 훨씬 빠르게 데이터를 읽고 쓸 수 있으므로, 컴퓨터는 자주 사용하는 데이터나 실행 중인 프로그램을 램에 저장한다.
- 결론적으로는 CPU가 빠르게 이 데이터에 접근할 수 있게 해주므로 시스템의 전반적인 성능을 향상 시킬수 있다.
버퍼풀
정의
위에서 설명한 캐싱전략을 수행하기 위한 저장소로 캐시 매커니즘을 활용할 수 있게 하는 저장소이다.
버퍼 풀은 디스크에서 읽어온 데이터 페이지를 캐시하고, 새로 작성하거나 변경된 데이터 페이지를 임시로 보관하는 공간이라고도 볼수 있다.
작동 방식, 히트와 미스
- 데이터베이스가 데이터 페이지를 읽거나 쓸 때, 먼저 버퍼 풀을 확인한다.
- 요청된 데이터 페이지가 버퍼 풀에 있다면, 이를 **"히트"**라고 하며, 데이터베이스는 디스크에 접근하지 않고 해당 페이지를 빠르게 읽거나 쓸 수 있다.
- 요청된 데이터 페이지가 버퍼 풀에 없다면, 이를 **"미스"**라고 하고, 데이터베이스는 디스크에서 해당 페이지를 읽어 버퍼 풀에 로드한 후 작업을 수행한다.
결론
캐싱 전략은 빠른 속도를 위해서 비용이 들고 크기가 작은 또 다른 저장공간에 사용될법한 데이터를 미리 담아두고 있다가 원래 저장소(DB)에서 가져오는 속도보다 빠른 속도로 자원을 제공해주는 역할이다.
→ 우리가 지금 다루는 MySQL에서는 InnoDB스토리지 엔진내에서 캐싱 기능을 지원하는 버퍼풀을 이용하여 읽기 예측을 통해 I/O 성능을 증가시킨다.
데이터베이스 성능과의 관계
버퍼풀의 크기
버퍼 풀이 너무 작으면 데이터 페이지를 자주 교체해야 하므로 디스크 I/O가 증가하고
버퍼 풀이 너무 크면 불필요한 메모리 공간을 차지하게 된다.
따라서, 시스템의 메모리 크기, 데이터베이스의 크기, 쿼리 패턴 등을 고려하여 버퍼 풀 크기를 최적화하는 것이 좋다.
버퍼풀 저장 알고리즘
크기도 중요하지만 어떤 데이터를 저장해야지 I/O이 최소화 될것인가에 대한 점도 영향이 있을수 있다.
종류
- LRU (Least Recently Used) 이 알고리즘은 가장 최근에 사용되지 않은 항목을 제거하는 방식으로 동작 즉, 가장 오래전에 사용된 데이터부터 버퍼에서 제거한다.
- LFU (Least Frequently Used) 이 알고리즘은 가장 적게 사용된 항목을 제거하는 방식으로 동작 즉, 접근 빈도가 가장 낮은 데이터부터 버퍼에서 제거한다.
InnoDB의 버퍼풀 전략
MySQL :: MySQL 8.0 Reference Manual :: 15.5.1 Buffer Pool
MySQL :: MySQL 8.0 Reference Manual :: 15.5.1 Buffer Pool
The buffer pool is an area in main memory where InnoDB caches table and index data as it is accessed. The buffer pool permits frequently used data to be accessed directly from memory, which speeds up processing. On dedicated servers, up to 80% of physical
dev.mysql.com
서브리스트
InnoDB는 버퍼풀을 페이지로 나누어서 관리하고 각 페이지는
가장 최근에 사용된 데이터를 기준으로 두 개의 서브 리스트로 관리된다.
최근에 접근된 '새로운' 페이지 서브리스트
'오래된' 페이지 서브리스트
알고리즘 - 기본적으로 LRU를 사용
그리고 이 알고리즘은 사용자가 데이터의 특성에 맞게 설정이 가능하다.
메모리 Prefetching
위 여러 설정중에 굳이 Prefetching을 다루는 이유는 InnoDB의 특성상 성능 증대를 위해 중요하게 고려를 해야할 사항이기 때문이다.
“read-ahead” in InnoDB
데이터베이스 시스템에서는 데이터가 디스크에서 메모리로 이동하는 것이 상대적으로 느리기 때문에, prefetching을 통해 데이터 페이지가 곧 필요할 것으로 예상되는 페이지들을 미리 버퍼 풀로 비동기적으로 가져온다.
알고리즘 종류 in InnoDB
선형 read-ahead
- 이 기법은 버퍼 풀에서 순차적으로 접근되는 페이지를 기반으로 어떤 페이지가 곧 필요할 수 있는지 예측하는 방법
- innodb_read_ahead_threshold 구성 파라미터를 조정하여 InnoDB가 read-ahead 작업을 수행하는 시점을 제어한다.
- 이 값이 클수록, 순차적으로 접근되는 페이지의 패턴 확인이 더 엄격해집니다.
무작위 read-ahead
- 이 기법은 이미 버퍼 풀에 있는 페이지를 기반으로 어떤 페이지가 곧 필요할 수 있는지 예측하는 방법
- 동일한 extent에서 13개의 연속 페이지가 버퍼 풀에서 발견되면, InnoDB는 extent의 나머지 페이지를 비동기적으로 미리 가져오는 요청을 발행한다.
- innodb_random_read_ahead 구성 파라미터를 ON으로 설정하여 사용할 수 있다.
성능평가
InnoDB의 read-ahead 알고리즘의 효과를 평가하기 위한 통계는 SHOW ENGINE INNODB STATUS 을 통해 확인이 가능하고 이를 이용하여 설정의 정도를 저장한다.
따라서 MySQL 뿐만아니라 많은 데이터 베이스들이 스토리지 엔진에 캐싱(Cashing)이라는 전략을 사용하고 있다.
마무리
다음 포스팅에서는 데이터베이스 인덱싱과 인덱싱에 사용되는 대표적인 알고리즘 B+ 트리를 비롯하여 4가지 알고리즘에 대해서도 알아보자
'미사용 > KakaoTechCampus' 카테고리의 다른 글
MySQL기초[4]- 동시성 유지를 위한 S/X 락 (0) | 2023.06.15 |
---|---|
MySQL기초[3]- 데이터 베이스 인덱싱 (0) | 2023.06.14 |
MySQL기초[1]- 고전 3티어 구조 및 MySQL엔진 구성요소 (0) | 2023.06.14 |
Java기초[10] 인터페이스 기본개념으로 알아보는 다형성 (0) | 2023.04.28 |
Java기초[9] 전략&템플릿 메서드 패턴 (0) | 2023.04.28 |