MariaDB

InnoDB의 주요 구성 요소

열린기술자·2015년 12월 28일·조회 8,068

1. Buffer Pool

  • InnoDB의 핵심 메모리 영역으로, 데이터 페이지와 인덱스 페이지를 캐시하고 변경된 페이지를 디스크에 쓰기 전까지 보관하는 역할을 한다. MyISAM에도 캐시 영역이 있었지만 주로 인덱스를 캐시하였다.
  • my.cnf 내 innodb_buffer_pool_size로 설정하며, 로그의 Initializing buffer pool, size= 문구로 확인하거나 MySQL 프롬프트에서도 확인할 수 있다.
  • SHOW STATUS LIKE '%innodb_buffer_pool%';
  • 만약 Hit Ratio가 낮다면 Buffer Pool 증설을 검토한다. 일반적으로 권장 값은 전체 메모리의 50~80% 범위이지만, 서버가 데이터베이스 전용인지, OS 캐시와 다른 프로세스가 어느 정도 메모리를 사용하는지에 따라 조정해야 한다. Buffer Pool이 너무 크면 가상 메모리를 사용하여 오히려 성능이 떨어질 수 있으므로 주의해야 한다. vmstat 명령어 등을 통해 swap 사용률을 면밀히 모니터링한다. Buffer Pool Hit Ratio 공식은 다음과 같다.
1 - (innodb_buffer_pool_reads / innodb_buffer_pool_read_requests)
  • 위 계산 결과는 1에 가까울수록 Buffer Pool에서 데이터를 잘 읽고 있다는 의미이다. 운영 환경에서는 한 번의 값만 보지 말고 일정 시간 간격으로 여러 번 확인하여 추세를 보는 것이 좋다.
  • 체크포인트 시 write 스레드가 필요한 만큼 디스크로 write한다.
  • Oracle의 Data Buffer Cache와 유사하다. Oracle과 마찬가지로 변경 내용을 디스크에 바로 쓰지 않고 메모리에 먼저 반영한 뒤, 이후 적절한 시점에 디스크로 기록한다.

2. Undo

Oracle의 Undo와 유사한 Rollback을 위한 공간이다. 트랜잭션이 실패하거나 사용자가 Rollback을 수행할 때 이전 상태로 되돌리기 위해 사용되며, InnoDB의 MVCC에서 일관된 읽기를 제공하는 데에도 필요하다.


3. Insert Buffer

  • 데이터의 Insert와 Update가 발생하면 인덱스에도 반영해야 한다. 테이블에 인덱스가 많다면 많은 자원을 필요로 하므로, 별도의 Insert Buffer 공간을 통해 성능 저하를 줄인다. 단, MySQL 5.5 이전 버전은 Insert만 지원하였다.
  • Secondary Index의 Insert 작업을 위한 buffer이다. 기본 키나 유니크 인덱스처럼 즉시 중복 여부를 확인해야 하는 인덱스와는 동작 방식이 다를 수 있다.
  • innodb_change_buffering 설정을 이용한다.

4. Log Buffer

  • Oracle의 Redo Log Buffer와 유사하다.
  • Commit 발생 시 물리 디스크에 데이터 페이지를 바로 변경하는 것이 아니라, ACID를 보장하기 위해 redo 로그를 먼저 기록하고 체크포인트 발생 시 변경된 페이지를 일괄적으로 반영하여 부하를 줄인다.
  • 만약 BLOB이나 TEXT와 같이 대량 데이터를 취급하거나 큰 트랜잭션이 자주 발생한다면 다소 크게 설정하는 것을 검토할 수 있다.

5. 모니터링

  • Mutex 상태 보기
show engine innodb mutex
  • Buffer I/O, 스레드, 트랜잭션, 세마포어 등 InnoDB 내부 상태 확인
show engine innodb status

모니터링 결과는 순간적인 값만으로 판단하기보다 부하가 낮은 시간과 높은 시간을 나누어 비교하는 것이 좋다. 특히 Buffer Pool Hit Ratio, pending I/O, checkpoint 관련 지표, lock 대기 정보는 성능 저하 원인을 찾을 때 함께 확인하면 도움이 된다.

댓글 0

로그인 후 댓글을 남길 수 있습니다.

아직 댓글이 없습니다.