목차
개요
카카오테크캠퍼스 백엔드 과정 주차 관련 공부내용
MySQL에서 제공하는 버퍼풀 래퍼런스를 참고하여 작성하였다.
MySQL :: MySQL 8.0 Reference Manual :: 15.5.1 Buffer Pool
결국에는 데이터베이스의 성능 증가의 핵심은 디스크 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
서브리스트
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 |