[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 옵션을 추가해 주는 것이
좋습니다. |