Loading...
MySQL 9.5 Reference Manual 9.5의 17.5.1 Buffer Pool의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
buffer pool은 InnoDB가 접근되는 대로 테이블 및 인덱스 데이터를 캐시하는 메인 메모리 영역입니다. buffer pool은 자주 사용되는 데이터가 메모리에서 직접 접근되도록 허용하여 처리 속도를 높입니다. 전용 서버에서는 물리적 메모리의 최대 80%가 buffer pool에 할당되는 경우가 많습니다.
대량 읽기 작업의 효율성을 위해 buffer pool은 여러 행을 담을 수 있는 페이지 단위로 나뉩니다. 캐시 관리의 효율성을 위해 buffer pool은 페이지들의 링크드 리스트로 구현되며, 자주 사용되지 않는 데이터는 least recently used (LRU) 알고리즘의 변형을 사용하여 캐시에서 제거됩니다.
자주 접근되는 데이터를 메모리에 유지하기 위해 buffer pool을 활용하는 방법을 아는 것은 MySQL 튜닝의 중요한 측면입니다.
buffer pool은 LRU 알고리즘의 변형을 사용하는 리스트로 관리됩니다. buffer pool에 새로운 페이지를 추가할 공간이 필요할 경우, 가장 최근에 사용되지 않은 페이지가 제거되고 새로운 페이지가 리스트의 중간에 추가됩니다. 이러한 midpoint insertion 전략은 리스트를 두 개의 서브리스트로 취급합니다:
앞쪽(head)에는 최근에 접근된 새로운 (“young”) 페이지의 서브리스트
뒤쪽(tail)에는 덜 최근에 접근된 오래된 페이지의 서브리스트
Figure 17.2 Buffer Pool List

이 알고리즘은 자주 사용되는 페이지를 새로운 서브리스트에 유지합니다. 오래된 서브리스트에는 덜 자주 사용되는 페이지가 포함되며, 이 페이지들은 eviction 대상이 됩니다.
기본적으로 알고리즘은 다음과 같이 동작합니다:
buffer pool의 3/8은 오래된 서브리스트에 할당됩니다.
리스트의 중간 지점(midpoint)은 새로운 서브리스트의 tail이 오래된 서브리스트의 head와 만나는 경계입니다.
InnoDB가 페이지를 buffer pool로 읽어들일 때, 처음에는 그 페이지를 중간 지점(오래된 서브리스트의 head)에 삽입합니다. 페이지는 SQL 쿼리와 같은 사용자 시작 작업을 위해 필요해서 읽힐 수도 있고, InnoDB가 자동으로 수행하는 read-ahead 작업의 일부로 읽힐 수도 있습니다.
오래된 서브리스트의 페이지에 접근하면 해당 페이지는 “young” 상태가 되어 새로운 서브리스트의 head로 이동합니다. 페이지가 사용자 시작 작업에 의해 필요해서 읽힌 경우, 첫 접근이 즉시 일어나며 페이지는 young 상태가 됩니다. 페이지가 read-ahead 작업으로 인해 읽힌 경우, 첫 접근은 즉시 일어나지 않을 수 있으며 페이지가 eviction되기 전에 전혀 접근되지 않을 수도 있습니다.
데이터베이스가 동작함에 따라 buffer pool의 페이지들 중 접근되지 않는 것들은 리스트의 tail 쪽으로 이동하면서 “나이를 먹게(aged)” 됩니다. 새로운 서브리스트와 오래된 서브리스트의 페이지들은 다른 페이지들이 young 상태가 되면서 함께 나이를 먹습니다. 오래된 서브리스트의 페이지들은 또한 중간 지점에 페이지가 삽입될 때마다 나이를 먹습니다. 결국 사용되지 않은 상태로 남아 있는 페이지는 오래된 서브리스트의 tail에 도달하고 eviction됩니다.
기본적으로, 쿼리에 의해 읽힌 페이지는 즉시 새로운 서브리스트로 이동하여 buffer pool에 더 오래 머무르게 됩니다. 예를 들어, mysqldump 작업을 위한 테이블 스캔이나 WHERE 절이 없는 SELECT 구문은 buffer pool에 대량의 데이터를 가져와 이전의 오래된 데이터를 동일한 양만큼 eviction시킬 수 있으며, 새 데이터는 다시는 사용되지 않을 수도 있습니다. 마찬가지로, read-ahead 백그라운드 스레드에 의해 로드되고 한 번만 접근되는 페이지들도 새로운 리스트의 head로 이동합니다. 이러한 상황은 자주 사용되는 페이지를 오래된 서브리스트로 밀어내어 eviction 대상이 되게 만들 수 있습니다. 이러한 동작을 최적화하는 방법은 Section 17.8.3.3, “Making the Buffer Pool Scan Resistant” 및
Section 17.8.3.4, “Configuring InnoDB Buffer Pool Prefetching (Read-Ahead)”를 참조하십시오.
InnoDB Standard Monitor 출력에는 buffer pool LRU 알고리즘 동작과 관련된 여러 필드가 BUFFER POOL AND MEMORY 섹션에 포함되어 있습니다. 자세한 내용은 Monitoring the Buffer Pool Using the InnoDB Standard Monitor를 참조하십시오.
성능을 향상시키기 위해 buffer pool의 다양한 측면을 설정할 수 있습니다.
이상적으로는 buffer pool의 크기를 가능한 한 크게 설정하되, 서버에서 실행되는 다른 프로세스들이 과도한 페이징 없이 동작할 수 있도록 충분한 메모리를 남겨둡니다. buffer pool이 클수록 InnoDB는 인메모리 데이터베이스처럼 동작하여 디스크에서 데이터를 한 번 읽은 후 이후 읽기 시에는 메모리에서 데이터를 접근하게 됩니다. 자세한 내용은
Section 17.8.3.1, “Configuring InnoDB Buffer Pool Size”를 참조하십시오.
충분한 메모리가 있는 64-bit 시스템에서는 buffer pool을 여러 부분으로 나누어 동시에 수행되는 작업들 간의 메모리 구조에 대한 경합을 최소화할 수 있습니다. 자세한 내용은 Section 17.8.3.2, “Configuring Multiple Buffer Pool Instances”를 참조하십시오.
buffer pool에 대량의 자주 사용되지 않는 데이터를 가져오는 작업으로 인한 갑작스러운 액티비티 스파이크가 발생하더라도 자주 접근되는 데이터를 메모리에 유지할 수 있습니다. 자세한 내용은 Section 17.8.3.3, “Making the Buffer Pool Scan Resistant”를 참조하십시오.
read-ahead 요청을 언제, 어떤 방식으로 수행하여 향후 필요할 페이지를 비동기적으로 buffer pool에 프리페치할지 제어할 수 있습니다. 자세한 내용은 Section 17.8.3.4, “Configuring InnoDB Buffer Pool Prefetching (Read-Ahead)”를 참조하십시오.
백그라운드 플러시가 언제 발생하는지, 그리고 플러시 속도가 워크로드에 따라 동적으로 조정되는지를 제어할 수 있습니다. 자세한 내용은 Section 17.8.3.5, “Configuring Buffer Pool Flushing”를 참조하십시오.
서버 재시작 후 긴 워밍업 기간을 피하기 위해 InnoDB가 현재 buffer pool 상태를 어떻게 보존할지 설정할 수 있습니다. 자세한 내용은
Section 17.8.3.6, “Saving and Restoring the Buffer Pool State”를 참조하십시오.
InnoDB Standard Monitor 출력은 SHOW\ ENGINE INNODB STATUS를 사용하여 접근할 수 있으며, buffer pool 동작과 관련된 메트릭을 제공합니다. buffer pool 메트릭은 InnoDB Standard Monitor 출력의 BUFFER POOL AND MEMORY 섹션에 있습니다:
1---------------------- 2BUFFER POOL AND MEMORY 3---------------------- 4Total large memory allocated 2198863872 5Dictionary memory allocated 776332 6Buffer pool size 131072 7Free buffers 124908 8Database pages 5720 9Old database pages 2071 10Modified db pages 910 11Pending reads 0 12Pending writes: LRU 0, flush list 0, single page 0 13Pages made young 4, not young 0 140.10 youngs/s, 0.00 non-youngs/s 15Pages read 197, created 5523, written 5060 160.00 reads/s, 190.89 creates/s, 244.94 writes/s 17Buffer pool hit rate 1000 / 1000, young-making rate 0 / 1000 not 180 / 1000 19Pages read ahead 0.00/s, evicted without access 0.00/s, Random read 20ahead 0.00/s 21LRU len: 5720, unzip_LRU len: 0 22I/O sum[0]:cur[0], unzip sum[0]:cur[0]
다음 표는 InnoDB Standard Monitor에 의해 보고되는 buffer pool 메트릭을 설명합니다.
InnoDB Standard Monitor 출력에 제공되는 초당 평균값은 InnoDB Standard Monitor 출력이 마지막으로 출력된 이후 경과 시간에 기반합니다.
Table 17.2 InnoDB Buffer Pool Metrics
| Name | Description |
|---|---|
| Total memory allocated | buffer pool에 대해 바이트 단위로 할당된 메모리의 총량. |
| Dictionary memory allocated | InnoDB 데이터<br> 딕셔너리에 대해 바이트 단위로 할당된 메모리의 총량. |
| Buffer pool size | buffer pool에 할당된 페이지의 총 크기. |
| Free buffers | buffer pool free 리스트의 페이지 총 크기. |
| Database pages | buffer pool LRU 리스트의 페이지 총 크기. |
| Old database pages | buffer pool old LRU 서브리스트의 페이지 총 크기. |
| Modified db pages | buffer pool에서 수정된 페이지의 현재 개수. |
| Pending reads | buffer pool로 읽히기를 기다리는 buffer pool 페이지의 개수. |
| Pending writes LRU | LRU 리스트의 bottom에서 쓰여야 할 buffer pool 내의 오래된 더티 페이지 개수.<br> |
| Pending writes flush list | 체크포인팅 동안 플러시되어야 할 buffer pool 페이지의 개수. |
| Pending writes single page | buffer pool 내에서 보류 중인 개별 페이지 쓰기의 개수. |
| Pages made young | buffer pool LRU 리스트에서 young 상태가 된 페이지의 총 개수(“new” 페이지 서브리스트의 head로 이동된 페이지).<br> |
| Pages made not young | buffer pool LRU 리스트에서 young 상태가 되지 않은 페이지의 총 개수(young 상태가 되지 않은 채 “old” 서브리스트에 남아 있는 페이지).<br> |
| youngs/s | buffer pool LRU 리스트의 오래된 페이지에 대한 접근 중 페이지를 young 상태로 만든 경우의 초당 평균값. 이 표 뒤의<br> note를 참조하십시오. |
| non-youngs/s | buffer pool LRU 리스트의 오래된 페이지에 대한 접근 중 페이지를 young 상태로 만들지 않은 경우의 초당 평균값.<br> 이 표 뒤의 note를 참조하십시오. |
| Pages read | buffer pool에서 읽힌 페이지의 총 개수. |
| Pages created | buffer pool 내에서 생성된 페이지의 총 개수. |
| Pages written | buffer pool에서 쓰여진 페이지의 총 개수. |
| reads/s | 초당 buffer pool 페이지 읽기의 평균 개수. |
| creates/s | 초당 생성된 buffer pool 페이지의 평균 개수. |
| writes/s | 초당 buffer pool 페이지 쓰기의 평균 개수. |
| Buffer pool hit rate | buffer pool에서 읽힌 페이지와 디스크 스토리지에서 읽힌 페이지의 비율을 나타내는 buffer pool 페이지 히트율. |
| young-making rate | 페이지 접근이 페이지를 young 상태로 만들게 된 히트의 평균 비율.<br> 자세한 내용은 이 표 뒤의 note를 참조하십시오. |
| not (young-making rate) | 페이지 접근이 페이지를 young 상태로 만들지 않게 된 히트의 평균 비율.<br> 자세한 내용은 이 표 뒤의 note를 참조하십시오. |
| Pages read ahead | read ahead 작업의 초당 평균값. |
| Pages evicted without access | buffer pool에서 접근되지 않은 상태로 eviction된 페이지의 초당 평균값.<br> |
| Random read ahead | random read ahead 작업의 초당 평균값. |
| LRU len | buffer pool LRU 리스트의 페이지 총 크기. |
| unzip_LRU len | buffer pool unzip_LRU 리스트의 길이(페이지 수). |
| I/O sum | 접근된 buffer pool LRU 리스트 페이지의 총 개수. |
| I/O cur | 현재 인터벌 동안 접근된 buffer pool LRU 리스트 페이지의 총 개수.<br> |
| I/O unzip sum | 디컴프레션된 buffer pool unzip_LRU 리스트 페이지의 총 개수. |
| I/O unzip cur | 현재 인터벌 동안 디컴프레션된 buffer pool unzip_LRU 리스트 페이지의 총 개수.<br> |
| Name | Description |
|---|
Notes:
youngs/s 메트릭은 오래된 페이지에만 적용됩니다. 이 메트릭은 페이지 접근 횟수를 기준으로 하며, 하나의 페이지에 대해 여러 번 접근될 수 있고 모두 카운트됩니다. 큰 스캔이 발생하지 않는데도 youngs/s 값이 매우 낮다면 지연 시간을 줄이거나 오래된 서브리스트에 사용되는 buffer pool의 비율을 늘리는 것을 고려하십시오. 비율을 늘리면 오래된 서브리스트가 커져서 그 서브리스트의 페이지들이 tail로 이동하는 데 더 오래 걸리며, 그 결과 해당 페이지들이 다시 접근되어 young 상태가 될 가능성이 커집니다. 자세한 내용은
Section 17.8.3.3, “Making the Buffer Pool Scan Resistant”를 참조하십시오.
non-youngs/s 메트릭은 오래된 페이지에만 적용됩니다. 이 메트릭은 페이지 접근 횟수를 기준으로 합니다. 하나의 페이지에 대해 여러 번 접근될 수 있고 모두 카운트됩니다. 큰 테이블 스캔을 수행할 때 (그리고 더 높은 youngs/s 값을 보면서도) 더 높은 non-youngs/s 값을 보지 못한다면 지연 값을 늘리십시오. 자세한 내용은
Section 17.8.3.3, “Making the Buffer Pool Scan Resistant”를 참조하십시오.
young-making rate는 오래된 서브리스트 페이지에 대한 접근뿐 아니라 모든 buffer pool 페이지 접근을 포함합니다. young-making rate와 not rate는 일반적으로 전체 buffer pool 히트율과 합산하여 일치하지 않습니다. 오래된 서브리스트에서 페이지 히트가 발생하면 해당 페이지는 새로운 서브리스트로 이동하지만, 새로운 서브리스트에서 페이지 히트가 발생하면 그 페이지가 head에서 일정 거리 이상 떨어져 있는 경우에만 리스트의 head로 이동합니다.
not (young-making rate)는 innodb_old_blocks_time에 의해 정의된 지연 조건이 충족되지 않았거나, 새로운 서브리스트에서 페이지 히트가 발생했지만 페이지가 head로 이동되지 않은 경우처럼 페이지 접근이 페이지를 young 상태로 만들지 않게 된 히트의 평균 비율입니다. 이 rate는 오래된 서브리스트 페이지에 대한 접근뿐 아니라 모든 buffer pool 페이지 접근을 포함합니다.
buffer pool server status
variables와
INNODB_BUFFER_POOL_STATS 테이블은 InnoDB Standard Monitor 출력에 있는 것과 동일한 buffer pool 메트릭 대부분을 제공합니다. 자세한 내용은
Example 17.10, “Querying the INNODB_BUFFER_POOL_STATS Table”를 참조하십시오.
17.5 InnoDB In-Memory Structures
17.5.2 Change Buffer