kkamagi's story

IT, 정보보안, 포렌식, 일상 공유

Database

mysql - thread cache

까마기 2017. 7. 14. 16:16
반응형

[thread_cache_size]


많이 헷갈리는 이 부분에 대해서 설명합니다.


먼저 이 값은 bytes 단위 등의 크기가 아닙니다.

정수 단위의 '수'를 의미합니다.

(mysql에서 단위를 헷갈리게 하는 부분임)


mysql 클라이언트가 mysql 서버에 접속할때(Connections)


thread를 생성하는데 cache에 thread가 있으면 생성하지

않고 그 thread 를 사용합니다.


클라이언트에서 접속이 끊어지면(disconnects)

 MySQL 서버는

이전의 클라이언트 thread 수가 thread_cache_size 값보다

작으면 현재 thread를 cache 에 올려놓습니다.


cache에 올려놓은 thread는 Threads_cached로 확인할 수

있습니다.(이 정보가 빠져있군요)


cache에 있는 thread 재사용수 설정 ==> thread_cache_size

입니다. 즉 얼만 만큼의 thread 수를 cache에 올려놓을

것인지 결정하는 항목입니다.


여기에서 cache에 있는 thread를 사용하지 않고

새로운 thread가 생성되면 Threads_created 값이 1씩

증가하고, cache에 있는 thread를 사용할 경우는

Threads_created 값은 증가하지 않습니다.


기준은 Questions가 아니고 Connections 입니다.


즉 Connections 값과 Threads_created 값, 그리고

현재 MySQL 서버가 얼마정도로 바쁜지를 파악하여

이 thread_cache_size 값을 조절해 줘야 합니다.


기본값은 thread_cache_size = 0 입니다.


이 의미는 Connections 이 이루어질때 cache에 있는

thread를 사용하지 말고 새로운 thread를 생성하여 사용

하라는 의미입니다.


즉 매우 바쁜 MySQL 서버가 아니면 0 또는 2 값 정도면

충분합니다.


그러나 MySQL 서버가 상당히 바쁘고(STATUS == busy 이상)

이 값이 작으면 Connections이 이루어질때마다 새로운

thread가 생성된다는 단점(?)이 있습니다.


MySQL 영문 매뉴얼에서는 Threads_created 값이 크면(big)

thread_cache_size 값을 올려주라고 권고하지만

얼마만큼이 그 기준인지에 대해서는 따로 언급이 없습니다.


다만 (Threads_created / Connections)값을 계산해 보라는

정도입니다.



그렇다면 성능면측에서 생각해보면,

서버가 상당히 바쁘면 새로운 thread 를 생성하여 사용하는

것 보다는 기존의 cache 에 있는 thread를 재사용하는

것이 더 유리합니다.


그러나 성능 좋은 thread 실행(implementation)

 시스템에서는

그리 크게 낫은 성능은 없습니다.


어째튼 서버가 매우 바쁜 정도라면 이 값을 어느 정도까지

올려주는 것이 좋습니다.


본 프로그램에서는 (Threads_created / Connections)값이

0.01 즉 1% 이상이면 thread_cache_size 값을 올려주라고

comments하고 있습니다.


보통 none interactive 모드에서,

하나의 커넥션이 맺어지고 exit 까지는 대략 1초 미만이 대부분입니다.

길게 1초라고 가정하고,


얼마자 자주 커넥션이 들어오는지(초당 커넥션)를 계산하면,


  커넥션 관련 통계

  (

      cps = Connecions / Uptime    ; // 초당 커넥션 수

      spc = Uptime / Connections   ; // 커넥션 주기(초)

      cpq = Question / Connections ; // 커넥션당 요청 쿼리 수

  )


cps 값으로 알 수 있습니다.


평균적인 계산이기 때문에 이 cps 값이 필요로 하는 thread_cache_size

값이 됩니다. 이 cps 값도 한계가 있죠.. max_connections 이 제한점이기

때문에..


따라서,


  ccps  : ceil(Connecions / Uptime); // 올림

  최소 : (1 초 * ccps) + 0

  권장 : (2 초 * ccps) + 1

  최대 : (3 초 * ccps) + 2

  극대 : (4 초 * ccps) + 3


이 정도로 계산하면 됩니다.


단, 계산된 thread_cache_size 도 한계가 있습니다.

당연히 max_connections 보다 작아야 하고, 1 절에서 구한 LTP 에 의해서

(LPT * cps) 보다 작아야 합니다.

또한 back_log 보다 작아야 합니다.



[thread_cache_size 값을 설정하는 방법]


1. MySQL 4.0.3 이상이면


mysql> SET GLOBAL thread_cache_size = 8;


2. MySQL 4.0.3 이하이면


shell> mysqladmin [OPTIONS] shutdown

shell> safe_mysqld -O thread_cache_size=8 &


또는 /root/.my.cnf

[mysqld]

...

set-variable    = thread_cache_size=8

...


이렇게 추가하고


shell> safe_mysqld &


3. 시스템 재부팅시 자동으로 설정해 줄 경우


/etc/rd.c/rc.local 파일 이용시


safe_mysqld -O thread_cache_size=8 &


권장 방법


safe_mysqld --defaults-file=/root/.my.cnf &


*주의)

rc.local 파일에 `safe_mysqld &` 이와 같이 입력하면

/root/.my.cnf 내용을 참조하지 못하는 경우가 있으므로

--defaults-file=/root/.my.cnf 옵션을 추가해 주는 것이

좋습니다.


반응형

'Database' 카테고리의 다른 글

[데이터베이스] MySQL 부하 체크 Slow Query // mysql_slow_log_filter , parser  (0) 2020.01.07
Mysql timeout 설정  (0) 2017.07.14
MariaDB 설치 - 10.0.92  (0) 2017.02.06
MDF, NDF, LDF 파일  (0) 2014.12.04
Oracle DB 언어셋 설정  (0) 2014.12.04