MySQL

[InnoDB] In-memory buffer의 종류

erin.yoon 2021. 2. 19. 15:39
출처:mySQL 8.0 document https://dev.mysql.com/doc/refman/8.0/en/innodb-in-memory-structures.html

 

1) Buffer Pool

- 데이터 파일과 인덱스 정보 캐싱 + write buffering => random I/O 감소

  • mySQL innoDB 스토리지 엔진의 버퍼 풀 크기를 결정하는 변수는 innodb_buffer_pool_size로, 기본 128MB이다.

  • 크기를 크게 할수록 disk 접근 횟수 줄어들기 때문에 성능이 향상되나, 서버 용량에 비해 너무 큰 값을 설정하면 page swap이 자주 발생하여 성능이 저하될 수 있음

DB를 운영할 때는 최적의 상태로 리소스를 쥐어짜내면서 가장 효율적으로 데이터를 사용해야 한다. 현재는 SSD의 덕분에 상당 부분 disk I/O가 개선되었지만, 메모리 효율은 여전히 중요한 문제다. buffer pool이 메모리를 과다하게 점유하게 되면, mysql 서버가 아닌 다른 프로세스의 효율에도 영향을 미칠수밖에 없게 된다. 만약 (mysql 버퍼 풀은 공간이 남아도는데) 다른 프로세스에서 사용하는 메모리 공간이 부족하면, 해당 프로세스는 swap memory에 접근해서 작업을 진행하게 된다. swap memory에서 작업을 진행하는 경우, 애플리케이션은 swap memory 또한 메모리로 인식하므로 동작 자체에는 이상이 없지만, 버퍼의 주기능이었던 physical I/O를 줄이는 것이 아니라 오히려 디스크에 접근하면서 I/O가 증가하므로 dbms의 성능이 저하될 수 있다. 따라서 buffer pool의 크기는 전체 메모리에서 mysql 서버만 돌리는 경우 80%를, 그렇지 않은 경우 50~80%정도를 할당하는 것이 좋다.

 

* swap memory란, 주 메모리가 부족할 때 디스크의 일정 공간을 메모리로 사용하는 일종의 가상 메모리이다. 스왑 메모리 공간의 크기는 다음 명령어로 확인할 수 있다.

$ free

그러나, free 는 linux command이고.. 나는 맥을 사용해서 free command가 적용되지 않았다. 찾아보니 어떤 고마운 분께서 vm_stat을 활용해서 macOS에서도 free -m 명령어를 쓸 수 있게 오픈소스를 만들어 두셨다🤓이 자리를 빌어 감사드립니다..!

free -m alternative for macOS: tekkie.dev/mac-os/free-m-alternative-for-mac-os-x

zsh 환경설정을 해준 후 free -m 명령어를 실행해 보았더니 아주 잘 동작한다ㅎㅎ

 

 


2) Log Buffer

- redo log buffering에 사용되는 공간

  • 보통 1~8MB정도의 공간을 차지한다. 단, BLOB/TEXT같이 큰 데이터를 자주 변경하는 경우 더 크게 설정

 


3) Change Buffer(=Insert Buffer)

- DML 작업 중 보조 인덱스 페이지가 버퍼 풀에 없는 경우, disk에서 바로 가져와서 변경사항을 적용하는 대신 임시로 캐시해두는 공간

  • mySQL 5.5부터 개선된 기능
  • 레코드가 변경 작업이 일어나면 데이터 파일을 변경하는 작업 외에도 해당 테이블의 인덱스를 업데이트하는 작업이 필요하다. 그러나, 인덱스 페이지가 버퍼 풀에 없는 경우 이 과정에서 random I/O가 발생한다. 따라서 보조 인덱스(secondary index) 페이지가 버퍼 풀에 없을 때는 인덱스 변경사항을 change buffer에 저장해뒀다가 나중에 해당 페이지가 다른 SELECT문에 의해 버퍼 풀에 올라갈 때 병합되어 변경사항을 적용한다.
  • 보조 인덱스 페이지가 버퍼 풀에 있는 경우에는 change buffer를 거치지 않고 바로 버퍼 풀에서 변경사항을 적용한다.
  • 버퍼 풀에 올라간 dirty index page는 나중에 flush가 발생하면서 디스크 파일에 적용된다.
  • 일반적으로 buffer pool size의 25~50% 정도 크기로 할당

※ 주의사항: unique index에서는 change buffer를 사용할 수 없음

=> unique index는 사용자에게 결과를 전달하기 전에 중복 여부를 반드시 체크해야 하기 때문

반응형