본문 바로가기
  • 꾸준히 앞으로
Database

[MySQL] 성능 튜닝 - 버퍼 풀

by lijly 2020. 9. 5.

버퍼 풀(Buffer Pool)


버퍼 풀은 InnoDB가 액세스 할 때 테이블 및 인덱스 데이터를 캐시하는 메인 메모리 영역이다. 버퍼풀은 자주 사용하는 데이터를 메모리에서 직접 처리할 수 있게하여 처리 속도를 높인다 전용 서버에서 실제 메모리의 최대 80% 정도가 버퍼풀에 할당된다.

대량 읽기 조작의 효율성을 위해 버퍼 풀은 여러 행을 보유할 수 있는 페이지로 분할된다. 캐시 관리 효율성을 위해 버퍼풀은 링크된 페이지 목록으로 구현된다. 거의 사용되지 않는 데이터는 다양한 LRU 알고리즘을 사용하여 캐시에서 종료(혹은 만료:aged out)된다.

버퍼 풀을 활용하여 자주 액세스하는 데이터를 메모리에 유지하는 노하우(기술)은 MySQL튜닝의 중요한 측면이다.

(출처:https://myinfrabox.tistory.com/46)

 

 

버퍼 풀의 크기 (innodb_buffer_pool_size)

🔑
innodb_buffer_pool_size → 비어있는 메모리의 70〜80%정도를 할당

버퍼 풀은 두 가지 역할을 담당한다.

  1. 데이터 파일과 로그 파일이 기록되는 순서를 조정하는 역할
  1. 디스크 액세스를 줄이기 위한 캐시의 역할

시스템(OS)에서 파일 캐시의 크기가 클수록 성능에 유리하듯이, Database 에서도 마찬가지로 버퍼 풀의 크기가 클수록 성능에 유리하다.

특히 조회 처리를 위한 캐시 효과가 크기 마련인데, 이는 읽으려는 데이터가 메모리에 올라와 있으므로 Disk I/O 를 발생시키지 않기 때문이다.이론적으로는 다른 버퍼에 할당하는 메모리를 제외하고는 대부분의 메모리를 버퍼 풀에 할당하는 것이 좋다.

인덱스 설계가 잘 되어 있는데도 슬로우 쿼리가 해결되지 않는다면? innodb_buffer_pool_size 파라메터를 의심해봐야 한다. (이름이 의미하듯이 InnoDB 스토리지 엔진에만 해당한다.) 해당 파라메터의 크기가 클수록 쿼리 실행시 디스크보다 메모리를 사용하게 되어 빠른 결과를 얻을 수 있다.

버퍼 풀 메모리가 충분히 큰 양으로 할당되어 있다면 innodb는 in-memory 데이터베이스처럼 동작한다.

Access를 위한 select 데이터 뿐 아니라, Insert 및 Update 작업에도 도움이 되는 캐싱을 하기 때문에 적절하게 조정하여 사용하는 것이 핵심이다.

  • 버퍼 풀 메모리는 내부적으로 LRU 알고리즘을 사용하는 리스트의 형태이다.

 

버퍼 풀 인스턴스 수 (innodb_buffer_pool_instances)

🔑
innodb_buffer_pool_instances → core 수 * 2

MySQL 5.5 부터 버퍼 풀의 인스턴스 수를 설정할 수 있는데, 인스턴스 수를 늘리면 트랜잭션 간의 Lock 경합을 줄일 수 있다. 멀티 스레드 구조인 MySQL 에서는 스레드 간 버퍼 풀 조작에서 Exclusive Lock 처리가 필요한데, 이 때 버퍼 풀접근을 위해 뮤텍스를 사용하고 동시 다발적으로 접근 시 뮤텍스에 대한 경합이 발생한다. 인스턴스 수를 늘릴수록 많은 수의 스레드가 동시에 버퍼 풀에 접근하더라도 Lock 경합을 피할 수 있다. CPU 코어 수가 많은 시스템일수록 인스턴스 수를 늘릴 수 있다고 보면 된다. 인스턴스 수의 기본 값은 8 이다.

innodb_buffer_pool_instances는 설정된 innodb_buffer_pool_size를 쪼개어 병렬로 제어할 쓰레드의 개수, 각 인스턴스의 크기가 1GB 이상일 경우에만 작동

 

 

💡
innodb_buffer_pool_size = innodb-buffer-pool-instances * innodb_buffer_pool_chunk_size
→ 이와 같지 않게 구성한다면 버퍼 풀 크기는 자동으로 innodb-buffer-pool-instances * innodb_buffer_pool_chunk_size와 같거나 여러 값으로 조정된다고 한다.

 

 

 

⍞ Reference


 

 

'Database' 카테고리의 다른 글

[MySQL] 스토리지 엔진 - InnoDB, MyISAM  (2) 2020.09.04
RDBMS와 NOSQL  (0) 2020.06.16

댓글