
메모리 할당 및 사용 구조
4장. 메모리 할당 및 사용 구조 요약
MySQL 서버는 사용 목적에 따라 메모리 공간을 두 가지로 나눠 관리한다. 글로벌 메모리 영역과 로컬 메모리 영역이다. 차이의 핵심은 "누가 공유하는가"이다.
글로벌 메모리 영역
MySQL 서버가 시작될 때 OS로부터 할당받아, 종료 시점까지 유지되는 영역이다. 모든 스레드가 함께 사용한다.
대표적인 글로벌 메모리는 다음과 같다.
- 테이블 캐시 (Table Cache)
- InnoDB 버퍼 풀 (InnoDB Buffer Pool)
- InnoDB 어댑티브 해시 인덱스 (InnoDB Adaptive Hash Index)
- InnoDB 리두 로그 버퍼 (InnoDB Redo Log Buffer)
- 키 캐시 (Key Cache) — MyISAM 전용
이 영역은 서버 전체에서 공유되므로 보통 큰 메모리를 차지하며, 한 번 할당되면 서버가 살아있는 동안 회수되지 않는다. 그래서 글로벌 메모리 관련 설정값을 잘못 잡으면 서버 기동 시점부터 메모리 사용량이 고정되어 버린다.
로컬 메모리 영역
각 클라이언트 스레드(포그라운드 스레드)가 쿼리를 처리하는 동안 개별적으로 사용하는 영역이다. 세션 메모리 영역 또는 클라이언트 메모리 영역이라고도 부른다. 다른 스레드와 공유되지 않는다.
대표적인 로컬 메모리는 다음과 같다.
- 정렬 버퍼 (Sort Buffer) —
sort_buffer_size - 조인 버퍼 (Join Buffer) —
join_buffer_size - 바이너리 로그 캐시 (Binary Log Cache) —
binlog_cache_size - 네트워크 버퍼 (Network Buffer)
- 읽기 버퍼 (Read Buffer)
로컬 메모리는 모든 쿼리가 항상 사용하는 것이 아니라, 필요한 쿼리에서만 그때그때 할당된다. 예를 들어 ORDER BY 없이 끝나는 쿼리는 정렬 버퍼를 할당하지 않는다. 사용이 끝나면 곧바로 반환되는 것도 있고, 커넥션이 종료될 때까지 유지되는 것도 있다.
여기서 주의할 점은 로컬 메모리 변수의 값은 "스레드당 최대 할당량" 이라는 것이다. 즉 sort_buffer_size = 4MB 이고 동시에 1,000개의 연결이 정렬을 수행하면, 이론적으로 4GB까지 메모리가 추가로 잡힐 수 있다. 글로벌 메모리만 보고 서버의 총 메모리 사용량을 계산하면 안 된다.
한눈에 비교
| 구분 | 글로벌 메모리 | 로컬 메모리 |
|---|---|---|
| 할당 시점 | 서버 기동 시 1회 | 쿼리 실행 중 필요할 때마다 |
| 공유 여부 | 모든 스레드가 공유 | 스레드별 독립 |
| 회수 시점 | 서버 종료 시 | 쿼리 종료 또는 커넥션 종료 시 |
| 대표 예시 | InnoDB 버퍼 풀, 테이블 캐시 | 정렬 버퍼, 조인 버퍼 |
| 튜닝 주의점 | 너무 크게 잡으면 OS 메모리 압박 | 설정값 × 동시 연결 수로 폭증 가능 |
댓글
아직 댓글이 없습니다.