[MySQL] Buffer Pool이란? innodb_buffer_pool_size, innodb_buffer_pool_instances

hwwwa·2023년 1월 18일
1

Buffer Pool

  • 데이터와 인덱스를 캐시하기 위해 사용하는 메모리 버퍼크기
  • MySQL 성능 튜닝의 중요한 요소
    • 인덱스 설계가 잘 되어있음에도 슬로우 쿼리가 해결되지 않는다면 innodb_buffer_pool_size 를 확인해볼 필요가 있음
  • 자주 사용하는 데이터를 메모리에서 직접 처리할 수 있게 하여 처리 속도를 높임
  • 대량 읽기 조작의 효율성을 위해 Buffer Pool은 여러 행을 보유할 수 있는 Page로 분할됨
    • 캐시 관리 효율성을 위해 Linked Page List로 구현됨
    • Paging을 위해 LRU 알고리즘 사용

Buffer Pool 크기 설정: innodb_buffer_pool_size

  • 전용 서버의 경우 전체 RAM의 70% 이상, 그 외는 10% 이상으로 지정
  • Buffer Pool의 역할
    1. 데이터 파일과 로그 파일이 기록되는 순서를 조정하는 역할
    2. 디스크 액세스를 줄이기 위한 캐시의 역할
  • Database에서도 Buffer Pool의 크기가 클수록 성능에 유리
    • 읽으려는 데이터가 메모리에 올라와있으므로 Disk I/O를 발생시키지 않음
    • 특히 조회 처리에 효과적
  • 이론적으로는 다른 버퍼에 할당하는 메모리를 제외하고는 대부분의 메모리를 Buffer Pool에 할당하는 것이 좋음

Buffer Pool 크기는 항상 innodb_buffer_pool_chunk_size innodb_buffer_pool_instances의 배수와 같아야함
다른 값으로 구성 시 Buffer Pool의 크기는 innodb_buffer_pool_chunk_size
innodb_buffer_pool_instances의 배수 또는 그 외 여러 값으로 자동 조정됨

Buffer Pool Instance 수 설정: innodb_buffer_pool_instances

  • innodb_buffer_pool_size를 쪼개어 병렬로 제어할 thread의 개수, 각 instance의 크기가 1GB 이상일 경우에만 작동
  • Core 수의 2배로 지정
  • Instance 수를 늘리면 트랜잭션 간의 Lock race을 줄일 수 있음
    • MySQL은 Multi-Thread 구조이기 때문에 thread 간 Buffer Pool 조작에서 Exclusive Lock 처리 필요
    • Buffer Pool 접근을 위해 Mutex를 사용하므로 Mutex에 대한 race 발생
    • Instance 수를 늘리면 thread가 동시에 Buffer Pool에 접근하더라도 Lock race를 피할 수 있음
  • default는 8개

참고) MySQL 8.0 이후부터

  • innodb_dedicated_server 변수를 사용하여 서버 메모리 용량에 따라 innodb_buffer_pool_size, innodb_log_file_size, innodb_flush_method 값을 자동으로 구성 가능
  • innodb_buffer_pool_in_core_file 변수 비활성화 시 Core 파일에서 InnoDB Buffer Pool Page를 제외하여 파일 크기를 감소시킴

0개의 댓글