2017-11-08 16 views
0

교과서 데이터베이스 시스템 개념과 같은 데이터베이스 시스템 자습서에는 Buffer Pool/Buffer Manager/Pager /라는 모듈이 있습니다. 나는 그것에 대해 많은 세부 사항을 보지 못했고, 그래서 당신은 어떻게 동시의 성능을 향상 시키시겠습니까?데이터베이스 시스템에서 버퍼 풀의 동시 성능을 향상시키는 방법은 무엇입니까?

예를 들어, 우리는 Trie 지수가 있다고 가정 해 봅시다. 우리가 버퍼 풀없이 trie 내부에서 페이징을한다면 리프 노드를 동시에로드하거나 제거하는 다중 쓰레드를 쉽게 가질 수 있습니다 : 꼭 필요한 노드의 공유 잠금을 획득하고 잎 노드의 부모

그러나 버퍼 풀이 페이징 작업을 처리하도록한다면 버퍼 풀의 배타적 잠금을 획득해야 할 수도 있습니다. 그런 다음 하나의 스레드 만 동시에 페이지를로드하거나 제거 할 수 있습니다.

실제로 데이터베이스 구현에서이 작업을 시도했습니다. 이전 버전에는 v 퍼 풀이 없으며 trie 인덱스에서 페이징 작업을 관리합니다. 그리고 새 버전에는 trie 색인 자체 대신 버퍼 풀이 있습니다. 페이지 ID를 버퍼 풀의 해당 페이지에 매핑하는 해시 맵을 보호하는 큰 잠금 장치가 있습니다. 단일 스레드 테스트는 40 % 빨라지지만 10 개의 동시 스레드로 5 배 느려집니다!

자물쇠없는 데이터 구조가 도움이 될 것 같습니까? 그러나 나는 또한 그것을 똑바로 생각하기가 어려울 것이라고 생각합니다. 그렇다면 어떻게 버퍼 풀을 설계하고 구현합니까? 감사!

답변

0

the discussion here (in Chinese, sorry) 덕분에이 문제가 해결되었습니다. 솔루션은 매우 간단합니다. 단지 버퍼 관리자를 파편에 넣으십시오. 각 페이지는 페이지 번호를 해싱하여 샤드에 위임됩니다. 이 해시 함수가 균일 한 분포를 갖는 한, 동일한 잠금에서 대기하는 여러 스레드의 확률이 낮습니다. 내 경우

, 나는 128 개 파편에 버퍼 관리자를 나누어 해시 함수는 간단한 벤치 마크의 결과는 매우 놀랍다, 10 개 스레드, 단지 page_no % 128입니다 :

분산됩니다 버퍼 관리자를
  • : 7.73 트라이 페이징 자체 않습니다 즉 123s 버퍼 관리자가없는
  • , :의
  • 버퍼 관리자와 함께 BTW 19.7s

를, MySQL은 또한 걸릴 것으로 보인다 이 접근법 (내가 잘못 이해 한 경우 수정) : https://dev.mysql.com/doc/refman/5.7/en/innodb-multiple-buffer-pools.html