MariaDB에는 'innodb buffer pool instances' 변수 설정이 없다...?

이동빈·2021년 8월 31일
1

최근 innodb buffer pool 설정 관련해서 찾아보다가 알게된 사실입니다.

MriaDB 10.5 변경사항에 innoDB 성능 항샹 내용 중 Multiple buffer pool 제거가 있습니다.
상식적으로 생각해봤을때 멀티로 동작하는게 무조건 성능이 좋다고 생각이 드는데, 지운 이유가 무엇일까요? 궁금해서 조금 찾아봤습니다.

innodb_buffer_pool_instances 변수 설명을 확인해보니, 10.5.1부터 해당 변수의 값이 비활성화되고 10.6.0부터 제거되었습니다.
제거된 이유는 단 한줄로 표시하였네요.

버퍼 풀을 분할하는 본래의 이유가 사라졌다.

왜인지 이유는 자세하게 설명을 안해주네요.. 궁금하게 참...
먼저 multiple buffer pool을 사용하는 이유 부터 알아보면

multiple buffer pool을 사용 이유

  • MySQL 공식 홈페이지에 잘 설명되어있습니다. (원문)
  • 다른 스레드가 캐시된 페이지를 읽고 쓸 때 경합을 줄임으로써 동시성을 향상시킬 수 있다. 가 핵심.

이유만 들어보면 엄청난 성능 향상이 있을것 같은데... 왜 없앴을까요??

지라 이슈 제기

  • 지라 이슈 제기: Remove multiple InnoDB buffer pool instances
  • 요약
    • MySQL 5.5.5 버전부터 multiple buffer pools 도입 이후 뮤텍스 대신 rw-locks를 사용하도록 MySQL 5.6.2에 수정 과 같은 버퍼 풀간 뮤텍스 경합을 줄이기 위해 다수의 수정이 있었음
    • multiple page cleaner threads use a lot of CPU on idle server 문제 검토 중 multiple buffer pools이 정말 성능향상에 도움이 되는지 궁금
    • 그리고 뮤텍스 관련 MySQL 8.0.0 기능 추가되면서 MariaDB도 비슷한 작업을 수행해야한다고 이슈 제기.
      • 그러나 multiple buffer pools 과 page cleaners를 지원하기 위해 모든 코드를 지우는 것을 고려해야 한다 생각하고,
      • 향후 multiple buffer pools이 필요할 경우, 처음부터 잘 설계해야된다고 함.
    • 결론은 single instance buffer pools과 multiple buffer pools의 성능을 비교해서, 단일 인스턴스 버퍼 풀이어도 성능 저하가 없다면 코드를 단순화 해야된다고 주장

다시 한번 정리 (뇌피셜로 분석한 제 생각입니다...)

  1. multiple buffer pools 도입 이후 버퍼 풀간 뮤텍스 경합을 줄이기 위해 다수의 수정으로 코드가 복잡해져있는 상태에서
  2. MySQL의 Mutex 분할 기능을 도입하기엔 설계 문제로 불가능하고 판단,
  3. multiple buffer pools로 인해 생기는 성능 이슈도 있으니
  4. single buffer pools과 multi buffer pools의 성능의 큰 차이가 없다면 기존 코드를 제거하여 single buffer pools로 가자!

2년간 이어진 기나긴 테스트...

  • 지라 댓글 히스토리를 쭉 보니까, 거의 2년에 걸쳐서 테스트는 진행되었고 그 과정이 쉽지 않았다는게 느껴집니다.
  • single buffer pools 에서 생기는 병목현상을 다른 방향으로 해결하기 위해 여러 수정이 있었고,
  • 결국 single buffer pools으로도 multiple 만큼 성능을 발휘하도록 만들었다고 하네요.

번외) MySQL의 innodb buffer pool instances는?

percona의 CTO가 innodb buffer pool instances 관련 테스트 글을 작성하였습니다.

  1. How Many innodb_buffer_pool_instances Do You Need in MySQL 8?
  2. Part Two: How Many innodb_buffer_pool_instances Do You Need in MySQL 8 With a CPU-Bound Workload?
  • innodb_buffer_pool_instances 라는 매개변수가 어떤 값으로 설정해야 좋은지 나쁜지 애매모호하여 다양한 시나리오에서 테스트를 진행했다고 합니다.
    • 서버 사양은 cpu core 80개, 메모리 188GB
    • innodb_buffer_pool_instances를 1, 2, 4, 8, 16, 32, 64 로 설정하여 테스트 진행
    • 첫 테스트는 innodb_buffer_pool_size를 25GB로, 두번째 테스트는 140GB로 설정

해당글의 결론은 아래와 같습니다.

  • 높은 처리량과 적은 변동성을 고려하였을 때 64가 최선의 선택이지만, 그렇다고 무작정 이 값을 추천할 수 없다. (하드웨어 및 부하량에 따라 다름)
  • 1-4는 처리량에 대한 변동성이 크기 때문에 8부터 테스트를 진행하여 최적의 값을 찾는걸 추천.

나의 생각

  1. 설정 값에 대한 정답은 없다. 하드웨어 사양 및 환경에 따라 다 다르고, 다양한 설정값으로 밴치마크를 하여 직접 비교해보는 것이 정답인듯 합니다.
  2. 시간이 된다면 MariaDB 10.6 vs MySQL8의 innodb_buffer_pool_instances 관련 성능 비교글을 작성해보고 싶네요.
profile
호기심 많은 개발자

1개의 댓글

comment-user-thumbnail
2021년 12월 2일

와우.. mariadb innodb_buffer_pool_instance가 1인 이유를 찾다가 보게 되었는데, 잘 정리해주셨네요!좋은글 감사합니다 ~

답글 달기