MySQL/MariaDB Threads 모니터링

 

·      Version : MySQL 5.7, Docker

 

MySQL/MariaDB에서 Threads 모니터링하는 방법에 대해서 알아본다.  MySQL 서버는 기본적으로 하나의 클라이언트가 MySQL 서버에 접속할 떄마다  해당 클라이언트에 종속적인 스레드를 생성하고 해당 커넥션에서의 스레드 역할(쿼리 작업) 끝나면 스레드를 제거한다. 클라이언트가 접속할 때마다 스레드를 할당하고 제거하는 작업은 MySQL 서버 시스템 입장에서 보면 많은 리소스 낭비 성능 저하를 발생시키기 때문에 모니터링은 매우 중요한다.  아래 스크립트를 실행하면 스레드와 관련된 지표를 확인할 있다.

Show status where variable_name like ‘threads%’;

 

 

Variable Name

Comments

Threads_cached

스레드 캐시에 있는 스레드

Threads_connected

현재 오픈된 스레드

Threads_created

연결을 다루기 위해 생성된 스레드

Threads_running

Sleeping 하지 않는 스레드

 

 

show variables where variable_name like ‘thread%’;

 

 


Variable Name

Comments

Thread_cache_size

스레드 풀에서 캐싱한 최대 스레드 개수

Thread_handling

서버에서 사용하는 스레드 처리 모델

·       One-thread-per-connection : 커넥션마다 전용 스레드 생성

·       Pool-of-threads : 스레드 풀을 사용

Thread_stack

스레드 스택의 크기. 기본값은 192K 이며 64bit경우 256K.

 

MySQL서버에서는 스레드 할당으로 인한 리소스 낭비 성능 저하를 막기 위해서 특정 개수의 스레드를 메모리에 캐싱(thread pool)해서 사용한다. 스레드 캐시를 활용하면 클라이언트가 MySQL서버에 접속하여 스레드 할당이 필요할 스레드 캐시에 대기중인 스레드를 할당한다. (대기중인 스레드가 없다면 새로운 스레드를 생성하여 할당한다.) 클라이언트 작업이 종료되면 스레드는 캐시로 반환되거나 삭제 된다.

 

스레드 캐시를 활용하기 위해 캐시 사이즈르 크게 할당한다면 메모리 낭비 예기치 못한 leak 발생할 수도 있다. 반면 너무 적게 설정한다면 MySQL 서버가 스레드 캐시를 활용하지 못하므로 신규 스레드를 생성하는데 리소스 낭비가 발생한다. 아래 공식은 스레드 캐시 사용하지 못한 비율이다.

Cache Miss Rate(%) = Threads_created / connections * 100

 

운영중인 서버를 모니터링 하면서(특히 가장 바쁜 시간과 가장 한가한 시간에 대한 편차가 크니 주한다.) 적절한 임계치를 찾아서 설정 있도록 한다.

 

[참고자료]

https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_thread_handling

 

 

 

2018-05-07 / 강성욱 / http://sqlmvp.kr / http://sqlangeles.com

 

MySQL, thread monitoring, connection thread, thread pool, connection pool, 스레드 모니터링, 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 스레드

+ Recent posts