buffer pool 크기는 충분한가: 적중률, wait_free, 온라인 크기 조정
MySQL메모리명령어
SELECT ROUND(@@innodb_buffer_pool_size / 1024 / 1024) AS bp_mb,
@@innodb_buffer_pool_chunk_size / 1024 / 1024 AS chunk_mb,
@@innodb_buffer_pool_instances AS instances;
SELECT
ROUND(100 * (1 - (SELECT VARIABLE_VALUE FROM performance_schema.global_status WHERE VARIABLE_NAME = 'Innodb_buffer_pool_reads')
/ NULLIF((SELECT VARIABLE_VALUE FROM performance_schema.global_status WHERE VARIABLE_NAME = 'Innodb_buffer_pool_read_requests'), 0)), 3) AS hit_pct,
(SELECT VARIABLE_VALUE FROM performance_schema.global_status WHERE VARIABLE_NAME = 'Innodb_buffer_pool_pages_free') AS pages_free,
(SELECT VARIABLE_VALUE FROM performance_schema.global_status WHERE VARIABLE_NAME = 'Innodb_buffer_pool_pages_dirty') AS pages_dirty,
(SELECT VARIABLE_VALUE FROM performance_schema.global_status WHERE VARIABLE_NAME = 'Innodb_buffer_pool_wait_free') AS wait_free;
-- Online resize and status tracking
SET PERSIST innodb_buffer_pool_size = 8589934592;
SELECT VARIABLE_NAME, VARIABLE_VALUE FROM performance_schema.global_status WHERE VARIABLE_NAME LIKE 'Innodb_buffer_pool_resize_status%';하는 일
buffer pool 크기, 캐시 적중률, free/dirty 페이지 수, free 페이지 대기(wait_free) 카운터를 보여 준다. 재시작 없이 크기를 조정하고 진행 상황을 추적한다.
사용 시점
읽기 IO가 높을 때, RAM 추가/제거 후, 또는 용량 계획 시.
주의
적중률만으로는 오해할 수 있다. 99%라도 초당 수천 건의 디스크 읽기를 의미할 수 있다. Innodb_buffer_pool_reads의 초당 증가량을 본다. wait_free > 0이면 buffer pool이 너무 작거나 page cleaner가 따라가지 못하는 것이다. 새 크기는 innodb_buffer_pool_chunk_size × instances의 배수로 반올림된다. 크기 조정 중 짧은 정체가 발생할 수 있으며 축소 시 더 심하므로 피크 시간대를 피한다. 전용 서버에서는 RAM의 60–75%로 시작한다. 연결별 메모리, OS 캐시, 다른 프로세스를 위한 여유를 남긴다. 스와핑은 작은 buffer pool보다 항상 나쁘다.