이번엔 성능 향상을 위해 버퍼 풀의 다양한 측면을 사용자가 바꿀 수 있는 configuration을 알아보자.
Buffer Pool Instances
Buffer pool 을 separate instances로 나누면 concurrency를 향상시킬수있다.
즉, 다른 쓰레드가 같은 cached pages를 read/write하는 트랙잭션간의 lock경합을 줄일수 있다.
나눠진 각각의 buffer pool이 자신만의 free list, flush list, LRU등등을 관리한다.
innodb_buffer_pool_instances → core 수 * 2로 CPU 코어가 많으면 많이 늘릴 수 있다고 보면 된다.
num of instance variable : innodb_buffer_pool_instance
Scan Resistant Buffer Pool
Buffer Pool Prefetching(미리 불러오기)
Read-ahead : 곧 필요할거같은 page들을 buffer poool에서 비동기적으로 미리 가져오라는 I/O request이다.
두 가지 Read-ahead algorithm이 있다.
Buffer Pool Flushing
Buffer Pool의 dirty page(write 된 page) 는 background thread에 의해서 flush된다.
innodb_lru_scan_depth : # of page flushed in LRU tail by the cleaner thread. innodb_buffer_pool의 flush 동작에 영향을 미치는 옵션이다.
백그라운드로 돌고 있는 page_cleaner thread가 buffer pool LRU list중에 dirty page를 얼마나 많이 Disk로 내릴지 정하는 옵션이다. (다음 글에서 자세하게 살펴봄)
background operation performed once per second.
주로 buffer pool이 큰 상황에서, 평소 IO부하가 감당할 정도라면 이 설정을 늘려도 좋고, IO용량을 상회하는 부하가 들어오는 상황이라면 설정을 낮추는 것이 좋다. (default = 1024)
SHOW ENGINE INNODB STATUS \G
명령어를 통해서 buffer pool의 상태를 볼 수 있다.
Reference
https://www.slideshare.net/meeeejin/mysql-buffer-management