MySQL/MariaDB 아키텍처 – 메모리 할당 및 사용 구조

 

  • Version : Mariadb 5.5.4.2-WinX64

 

MySQL/MariaDB 메모리 공간은 크게 글로벌 메모리 영역과 로컬 메모리 영역으로 구분할 수 있다. 글로벌 메모리 영역은 MySQL 서버가 시작되면서 무조건 운영체제로부터 할당된다. 글로벌 메모리 영역과 로컬 메모리 영역의 차이는 MySQL서버 내에 존재하는 스레드가 공유해서 사용하는 공간인지 아닌지에 따라 구분된다.

 

  • MySQL/MariaDB Memory 관련 설정 변수 : http://sqlmvp.kr/220365937569
  • MySQL 서버의 메모리사용량 = (글로벌 메모리) + (각 클라이언트 스레드 사용 메모리)

 

[글로벌 메모리 영역]

일반적으로 클라이언트 스레드의 수와 무관하게 하나의 메모리 공간이 할당된다. 필요에 따라서 2개 이상의 메모리 공간을 할당 받을 수도 있다. 생성된 글로벌 메모리 영역이 N개라도 모든 스레드에 의해 공유된다.

 

 

[로컬 메모리 영역]

세션 메모리 영역이라고 표현하며 MySQL 서버상에 존재하는 클라이언트 스레드가 쿼리를 처리하는데 사용하는 메모리 영역이다. 클라이언트 스레드가 사용하는 메모리 공간이라고 해서 클라이언트 메모리 영역 또는 세션 메모리 영역이라고도 한다.

로컬 메모리는 각 클라이언트 스레드별로 독립적으로 할당되며 절대 공유되어 사용되지 않는다. 각 쿼리의 용도별로 필요할 때만 공간이 할당되고 필요하지 않을때는 MySQL이 메모리 공간을 할당하지 않을 수도 있다(대표적으로 소트 버퍼, 조인 버퍼 등). 로컬 메모리 공간은 커넥션이 열려있는 동안 계속 할당된 상태로 남아 있는 공간도 있고(커넥션 버퍼, 결과 버퍼), 쿼리를 실행하는 순간에만 할당했다가 다시 해제하는 공간(소트 버퍼나 조인 버퍼)도 있다.

 

[참고자료]

RealMySQL (위키북스)

 

 

2015-06-29 / 강성욱 / http://sqlmvp.kr

 

 

MariaDB, MySQL, MySQL 아키텍처, MariaDB 아키텍처, MySQL 메모리 할당, MariaDB 메모리 할당, MySQL 글로벌 메모리, MySQL 클라이언트 메모리

MySQL/MariaDB 아키텍처 – 스레딩 구조

 

  • Version : Mariadb 5.5.4.2-WinX64

 

MySQL./MariaDB 서버는 프로세스 기반이 아닌 스레드 기반으로 작동하며 크게 포그라운드(Foreground) 스레드와 백그라운드(Background)스레드로 구분할 수 있다.

 

[포그라운드 스레드 (클라이언트 스레드)]

포그라운드 스레드는 최소한 MySQL/MariaDB 서버에 접속된 클라이언트의 수만큼 존재한다. 클라이언트 사용자가 작업을 마치고 커넥션을 종료하면 해당 커넥션을 담당하던 스레드는 다시 스레드풀(Thread pool)로 반환된다. 이때 스레드풀에 일정 개수 이상 대기 스레드가 있으면 스레드 풀로 반환하지 않고 스레드를 종료한다.

 

 

스레드풀의 크기는 다음 명령으로 확인할 수 있다.

show variables like 'thread_cache_size';

 

 

System Variable

Name

thread_cache_size

Variable Scope

Global

Dynamic Variable

Yes

Permitted Values

Type

integer

Default

0

Min Value

0

Max Value

16384

 

포그라운드 스레드는 데이터를 MySQL의 데이터 버퍼나 캐시로부터 가져오며, 버퍼나 캐시에 없는 경우 직접 디스크에 데이터나 인덱스 파일로부터 데이터를 읽어온다. MyISAM 테이블은 디스크 쓰기 작업까지 포르가운드 스레드가 처리하지만 InnoDB 테이블은 데이터 버퍼나 캐시까지만 포그라운드 스레드가 처리하고 나머지 버퍼로부터 디스크까지는 백그라운드 스레드가 처리한다.

 

 

[백그라운드 스레드]

InnoDB는 여러가지 작업을 백그라운드에서 처리한다. 대표적인 작업으로 인서트 버퍼(Insert Buffer)를 병합하는 스레드, 로그를 디스크에 기록하는 스레드, InnoDB 버퍼풀의 데이터를 디스크에 기록하는 스레드, 데이터를 버퍼로 읽어들이는 스레드, 기타 여러가지 잠금이나 모니터링 스레드가 있다. 이러한 모든 스레드를 총괄하는 메인 스레드도 있다.

 

쓰기 스레드(Write thread)는 윈도우용 MySQL 5.0에서부터 1개이상, 리눅스나 유닉스 계열 MySQL은 5.1 버전부터 쓰기 스레드의 개수를 1개 이상으로 설정할 수 있다. 현재 설정되어있는 쓰기 및 읽기 스레드는 아래 명령으로 확인할 수 있다.

show variables like 'innodb_read_io_threads';

show variables like 'innodb_write_io_threads';

 

 

System Variable

Name

innodb_read_io_threads

Variable Scope

Global

Dynamic Variable

No

Permitted Values

Type

integer

Default

4

Min Value

1

Max Value

64

 

 

System Variable

Name

innodb_write_io_threads

Variable Scope

Global

Dynamic Variable

No

Permitted Values

Type

integer

Default

4

Min Value

1

Max Value

64

 

 

 

[참고자료]

 

 

2015-06-24 / 강성욱 / http://sqlmvp.kr

 

 

MariaDB, MySQL, MySQL 아키텍처, MariaDB 아키텍처, MySQL 스레드, MariaDB 스레드

MySQL/MariaDB 아키텍처 – Overview

 

  • Version : Mariadb 5.5.4.2-WinX64

 

MariaDB 아키텍처는 MySQL 아키텍처와 동일하다. (당연히 동일 엔진이기에..) MySQL 아키텍처는 아래 그림과 같다.

 

기본적으로 커넥션 API를 이루고 있는 응용 프로그램 부분과 커넥션풀, SQL Interface, Parser, Optimize, Caches&Buffers 로 이루어진 MySQL 엔진, 그리고 스토리지 엔진 및 실제 데이터를 저장하는 파일 시스템인 하드웨어 영역으로 구분할 수 있다.

 

MySQL은 일반 상용 RDBMS에서 제공하는 대부분의 접근법을 지원한다. C API 부터 JDBC, ODBC, Perl, .NET 표준 드라이버까지 다양하게 제공한다.

 

 

[MySQL 엔진]

커넥션 핸들러와 SQL 파서, 옵티마이저, 그리고 MyISAM, InnoDB의 버퍼풀 기능이 포함되어 있다. MySQL은 표준 SQL(ANSI SQL-92) 문법을 지원하기 때문에 표준 문법에 따라 작성된 쿼리는 타 DBMS와 호환되어 실행할 수 있다.

 

[스토리지 엔진]

MySQL에서 처리한 데이터를 실제 스토리지에 저장하거나 스토리지로부터 데이터를 읽어오는 부분을 전담한다. 스토리지 엔진은 종류가 다양하여 여러 개의 스토리지 엔진을 사용할 수 있다.

create table tbl_a(a1 int) ENGINE=INNODB

create table tbl_a(a1 int) ENGINE=MyISAM

 

 

 

[참고자료]

MySQL Architecture with Pluggable Storage Engines

http://docs.oracle.com/cd/E19957-01/mysql-refman-5.5/storage-engines.html

Real MySQL (위키북스)

 

 

 

2015-06-22 / 강성욱 / http://sqlmvp.kr

 

 

 

 

MariaDB, MySQL, MySQL 아키텍처, MariaDB 아키텍처, MySQL Architecture, MariaDB Architecture, MySQL스토리지엔진, MySQL엔진

+ Recent posts