MySQL/MariaDB InnoDB(Storage) buffer pool 모니터링
· Version : MySQL 5.7, Docker
MySQL/MariaDB에서는 다양한 스토리지 엔진을 지원하며 각 스토리지마다 특성 또한 다르다. 각 스토리지 엔진에 대한 특성은 아래 링크를 참고 한다.
· Comparison of MySQL database engines : https://en.wikipedia.org/wiki/Comparison_of_MySQL_database_engines
이번 포스트에서는 일반적으로 OLTP 서비스에 많이 사용하는 InnoDB 스토리지 엔진에서 buffer pool(버퍼풀)과 관련한 모니터링 방법에 대해서 알아본다. 아래 스크립트를 실행 하면 InnoDB의 buffer pool에 대한 값을 확인할 수 있다.
Show status where variable_name like ‘innodb_buffer%’; |
Variable Name |
Comments |
Innodb_buffer_pool_dump_status |
버퍼풀에 보관된 페이지를 기록한 상태 |
Innodb_buffer_pool_load_status |
버퍼풀이 이전 시점에 해당하는 페이지를 읽음으로 워밍업을 진행한 페이지 수 |
Innodb_buffer_pool_resize_status |
버퍼풀의 크기를 동적으로 조정하는 작업 상태 |
Innodb_buffer_pool_pages_data |
전체 버퍼풀에서 현재 사용중인 버퍼풀 페이지 수 |
Innodb_buffer_pool_bytes_data |
전체 버퍼풀에서 현재 사용중인 버퍼풀 바이트 수 |
Innodb_buffer_pool_pages_dirty |
버퍼풀의 데이터 중 변경된 페이지 수 (더티페이지 수) |
Innodb_buffer_pool_bytes_dirty |
버퍼풀의 데이터 중 변경된 바이트 수(더티 데이터 수) |
Innodb_buffer_pool_pages_flushed |
버퍼풀에서 플러시한 페이지 수 |
Innodb_buffer_pool_pages_free |
전체 버퍼풀에서 사용하지 않은(사용가능한) 페이지 수 |
Innodb_buffer_pool_pages_misc |
Row lock, hash index 와 같이 오버헤드에 할당되어 사용된 버퍼풀의 페이지 수 |
Innodb_buffer_pool_pages_total |
전체 버퍼풀의 페이지 수 |
Innodb_buffer_pool_read_ahead_rnd |
랜덤으로 미리 읽기가 발생한 페이지 수 |
Innodb_buffer_pool_read_ahread |
미리 읽기 백그라운드 스레드가 버퍼풀로 미리 읽어들인 페이지 수 |
Innodb_buffer_pool_read_ahead_evicted |
버퍼풀에 미리 읽어들인 페이지 중 사용되지 않고 제거된 페이지 수 |
Innodb_buffer_pool_read_requests |
버퍼풀에서 논리적인 읽기 요청 횟수 |
Innodb_buffer_pool_reads |
버퍼풀에 데이터가 없어서 디스크에서 직접 읽은 논리적 수 |
Innodb_buffer_pool_wait_free |
페이지를 읽거나 생성할때 사용가능한 클린 페이지가 없을 경우 InnoDB가 더티페이지를 비우고 그 작업이 끝나기를 기다리는 값 |
Innodb_buffer_pool_write_requests |
버퍼풀에 대한 쓰기 횟수 |
InnoDB에서 버퍼풀의 크기는 MySQL 서버 변수에서 매우 중요한 부분이다. 너무 크게 설정하면 다른곳에서 사용할 메모리가 줄어들고, 너무 작게 설정하면 빈번한 디스크로의 요청이 발생하여 IO 부담을 가중시킬 수 있다. 일반 적으로 DB서버의 경우 DB외에 다른 서비스와 함께 사용하지 않으므로 OS가 필요한 공간( + 여유 공간) + MySQL 필요 공간(예상 커넥션 수, 스레드 수, 소트 메모리 등등)을 제외하고 버퍼풀로 사용하는경우가 많다.
버퍼풀 모니터링에서 중요하게 살펴보아야 하는 부분이Innodb_buffer_pool_pages_flushed 항목이다. 이는 버퍼풀의 더티 데이터를 디스크에 쓰는 과정으로 과도한 flushed 는 디스크에 부담을 줄 수 있다. 또한 한번에 플러시 되는 크기가 디스크 IO 성능에 비례하여 너무 클경우 디스크에서 쓰기 지연 현상이 발생할 수 있으므로 디스크의 성능과 함께 모니터링 해야한다.
Innodb_buffer_pool_reads의 수치가 높은경우 버퍼풀의 데이터를 활용하지 못하는것으로 디스크로 부터 직접 데이터를 읽어야 하기 때문에 디스크의 성능 저하가 발생 할 수 있다. 일반 적으로 버퍼풀의 크기가 작은 경우 버퍼풀에서 데이터를 오랫동안 캐싱할 수 없어 빈번한 IO가 발생할 수 있다.
[참고자료]
https://dev.mysql.com/doc/refman/8.0/en/server-status-variables.html
2018-05-15 / 강성욱 / http://sqlmvp.kr / http://sqlangeles.com
MySQL, InnoDB bufferpool, 버퍼풀, 이노디비, MySQL Storage, 스토리지 엔진, buffer pool 모니터링, DBA, MySQL 모니터링
'MySQL, MariaDB' 카테고리의 다른 글
MySQL/MariaDB Timezone 설정 및 확인 (0) | 2019.06.13 |
---|---|
MySQL/MariaDB InnoDB(Storage) row lock 모니터링 (0) | 2019.03.24 |
MySQL/MariaDB Threads 모니터링 (0) | 2019.03.24 |
MySQL/MariaDB Temp table and Temp file 모니터링 (0) | 2019.03.24 |
MySQL/MariaDB Table lock 모니터링 (0) | 2019.03.24 |