(MySQL) MySQL 8.0의 메모리 할당 및 사용구조

2022. 11. 23. 17:01컴퓨터 공학/DB

반응형

일반적으로 메모리는 코드, 데이터, 힙, 스택 영역으로 나누어져 있습니다.

그렇다면 MySQL 서버는 메모리를 어떻게 사용할까요?

🧐글로벌 영역과 로컬 영역


MySQL 서버도 일반적인 메모리 구조를 크게 벗어나지 않습니다.

글로벌 영역은 힙 영역, 로컬 영역은 스택 영역과 대조할 수 있겠네요.

MySQL의 메모리 할당 방식은 상당히 복잡하기 때문에 MySQL 서버가 상요하는 정확한 메모리의 양을 측정하는 것은 쉽지 않습니다.

그래서 단순하게 MySQL의 시스템 변수로 설정해 둔 만큼 운영체제로부터 메모리를 할당받는다고 생각해도 무방합니다.
(실제로 이론적인 계산이 아무런 의미가 없고 경험 기반으로 판단해야 할 때가 더 많다고 한다.)

 


🧐글로벌 영역


글로벌 영역은 말 그대로 모든 스레드에 공유되는 메모리 영역입니다.

대표적인 글로벌 메모리 영역은 다음과 같습니다.


  • 테이블 캐시
  • InnoDB 버퍼 풀
  • InnoDB 어댑티브 해시 인덱스
  • InnoDB 리두 로그 버퍼


각 영역을 간단히 살펴보도록 합시다.

테이블 캐시는 MySQL 서버에서 엉뚱하게 메모리를 많이 사용하는 그런 곳입니다.

테이블 캐시는 각 테이블의 메타 정보를 담고 있는데요,
MySQL 서버에서 테이블을 읽고 쓸 때 항상 테이블을 열고, 사용이 완료되면 닫는 작업을 합니다.

이때 오픈된 테이블의 정보를 테이블 캐시에 담아두고 각 커넥션에서 공유해서 사용하게 됩니다.

테이블 캐시가 메모리를 많이 잡아먹는 이유는 바로 여기에 있습니다.

동시에 테이블에 접근할 경우 이 캐시는 동시에 공유되지 못하기 때문에 생각보다 더 많은 테이블이 오픈되어야 하고, 이때 테이블 캐시의 정보가 더 많이 필요하게 됩니다.

이런 상황에서 테이블 개수가 1~2000개를 넘어서고 커넥션까지 많이 가진다면 심각한 메모리 부족 현상을 겪을 수 있습니다.

이 문제를 해결하기 위해서는 운영체제에 메모리를 반납하는 명령어인 Flush Tables를 실행하면 되지만, 짧게는 몇십 초에서 길게는 2분까지 소요될 수 있습니다.

그래서 이런 문제를 미연에 방지하기 위해 메모리 산정을 넉넉하게 하는 것이 좋습니다.


자세한 내용은 아래 링크를 참조해주세요.

 

MySQL table cache (메모리 먹는 하마)

오픈 소스 기반 Database에 대한 사례를 공유하는 공간입니다.

small-dbtalk.blogspot.com


InnoDB와 관련된 글로벌 영역은 추후 InnoDB 구조를 다룰 예정이기 때문에 그 문서에서 상술하겠습니다.

 


🧐로컬 영역


로컬 영역은 세션 영역이라고도 불립니다.

`로컬`이라는 이름답게 클라이언트 스레드가 쿼리를 처리하는 데 사용되는 메모리 영역이며,

당연히 각 클라이언트 스레드 별로 독립적으로 할당되며 절대 공유되지 않습니다.

 

 

로컬 메모리 공간은 커넥션이 열려있는 동안 계속 할당된 상태로 남아있는 공간(커넥션 버퍼나 결과 버퍼)도 있고,

그렇지 않은 공간(소트 버퍼나 조인 버퍼)도 있습니다.

 

 

 

반응형