최근 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 공식 홈페이지에 잘 설명되어있습니다. (원문)
- 다른 스레드가 캐시된 페이지를 읽고 쓸 때 경합을 줄임으로써 동시성을 향상시킬 수 있다. 가 핵심.
이유만 들어보면 엄청난 성능 향상이 있을것 같은데... 왜 없앴을까요??
지라 이슈 제기
다시 한번 정리 (뇌피셜로 분석한 제 생각입니다...)
- multiple buffer pools 도입 이후 버퍼 풀간 뮤텍스 경합을 줄이기 위해 다수의 수정으로 코드가 복잡해져있는 상태에서
- MySQL의 Mutex 분할 기능을 도입하기엔 설계 문제로 불가능하고 판단,
- multiple buffer pools로 인해 생기는 성능 이슈도 있으니
- 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 관련 테스트 글을 작성하였습니다.
- How Many innodb_buffer_pool_instances Do You Need in MySQL 8?
- 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부터 테스트를 진행하여 최적의 값을 찾는걸 추천.
나의 생각
- 설정 값에 대한 정답은 없다. 하드웨어 사양 및 환경에 따라 다 다르고, 다양한 설정값으로 밴치마크를 하여 직접 비교해보는 것이 정답인듯 합니다.
- 시간이 된다면 MariaDB 10.6 vs MySQL8의 innodb_buffer_pool_instances 관련 성능 비교글을 작성해보고 싶네요.
와우.. mariadb innodb_buffer_pool_instance가 1인 이유를 찾다가 보게 되었는데, 잘 정리해주셨네요!좋은글 감사합니다 ~