최근 innodb buffer pool 설정 관련해서 찾아보다가 알게된 사실입니다.
MriaDB 10.5 변경사항에 innoDB 성능 항샹 내용 중 Multiple buffer pool Remove
가 있습니다.
상식적으로 생각해봤을때 멀티로 동작하는게 무조건 성능이 좋다고 생각이 드는데, 지운 이유가 무엇일까요? 궁금해서 조금 찾아봤습니다.
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의 성능을 비교해서, 단일 인스턴스 버퍼 풀이어도 성능 저하가 없다면 코드를 단순화 해야된다고 주장
다시 한번 정리 (뇌피셜로 분석한 제 생각입니다...)
- 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 관련 성능 비교글을 작성해보고 싶네요.
반응형
'Server > Database' 카테고리의 다른 글
[Mysql/MariaDB] 밀리세컨드 저장이 안되는 문제 (0) | 2021.03.28 |
---|
댓글