mysql threads_created 뭐냥?
http://eureka7.com.ne.kr/MySQL_4_1_API/show-status.html
상기의 스테이터스 변수에는 각각 이하와 같은 의미가 있습니다. 보충 코멘트 [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 옵션을 추가해 주는 것이 좋습니다.SHOW STATUS
은 , 서버의 스테이터스 정보를 제공합니다 (mysqladmin extended-status
와 같이 ). 출력은 이하와 같이 됩니다 (형식과 수치는 경우에 따라서 다릅니다 ).+--------------------------+------------+
| Variable_name | Value |
+--------------------------+------------+
| Aborted_clients | 0 |
| Aborted_connects | 0 |
| Bytes_received | 155372598 |
| Bytes_sent | 1176560426 |
| Connections | 30023 |
| Created_tmp_disk_tables | 0 |
| Created_tmp_tables | 8340 |
| Created_tmp_files | 60 |
| Delayed_insert_threads | 0 |
| Delayed_writes | 0 |
| Delayed_errors | 0 |
| Flush_commands | 1 |
| Handler_delete | 462604 |
| Handler_read_first | 105881 |
| Handler_read_key | 27820558 |
| Handler_read_next | 390681754 |
| Handler_read_prev | 6022500 |
| Handler_read_rnd | 30546748 |
| Handler_read_rnd_next | 246216530 |
| Handler_update | 16945404 |
| Handler_write | 60356676 |
| Key_blocks_used | 14955 |
| Key_read_requests | 96854827 |
| Key_reads | 162040 |
| Key_write_requests | 7589728 |
| Key_writes | 3813196 |
| Max_used_connections | 0 |
| Not_flushed_key_blocks | 0 |
| Not_flushed_delayed_rows | 0 |
| Open_tables | 1 |
| Open_files | 2 |
| Open_streams | 0 |
| Opened_tables | 44600 |
| Questions | 2026873 |
| Select_full_join | 0 |
| Select_full_range_join | 0 |
| Select_range | 99646 |
| Select_range_check | 0 |
| Select_scan | 30802 |
| Slave_running | OFF |
| Slave_open_temp_tables | 0 |
| Slow_launch_threads | 0 |
| Slow_queries | 0 |
| Sort_merge_passes | 30 |
| Sort_range | 500 |
| Sort_rows | 30296250 |
| Sort_scan | 4650 |
| Table_locks_immediate | 1920382 |
| Table_locks_waited | 0 |
| Threads_cached | 0 |
| Threads_created | 30022 |
| Threads_connected | 1 |
| Threads_running | 1 |
| Uptime | 80380 |
+--------------------------+------------+
변수 의미 Aborted_clients
접속을 닫기 전에 클라이언트가 종료해 버렸기 때문에 중단된 접속수. See 항A.2.10. 「통신 에러/Aborted connection」. Aborted_connects
MySQL 서버에의 접속 시행 실패 회수. See 항A.2.10. 「통신 에러/Aborted connection」. Bytes_received
모든 클라이언트로부터 수신한 아르바이트수. Bytes_sent
모든 클라이언트에 송신된 아르바이트수. Com_xxx
각 xxx 커멘드의 실행 회수. Connections
MySQL 서버에의 접속 시행 회수. Created_tmp_disk_tables
스테이트먼트 실행중에 , 디스크상에 작성된 암묵적 텐포라리테이불의 수. Created_tmp_tables
스테이트먼트 실행중에 , 메모리상에 작성된 암묵적 텐포라리테이불의 수. Created_tmp_files
mysqld
하지만 작성한 임시 파일의 수.Delayed_insert_threads
INSERT DELAYED
핸들러 thread의 수.Delayed_writes
INSERT DELAYED
그리고 기입해진 레코드의 수.Delayed_errors
에러 발생( 중복 키
의 가능성이 높다 )에 의해 ,INSERT DELAYED
그리고 기입해진 레코드의 수.Flush_commands
FLUSH
커멘드의 실행 회수.Handler_commit
내부 COMMIT
커멘드수.Handler_delete
테이블에서 레코드가 삭제된 회수. Handler_read_first
최초의 엔트리가 인덱스로부터 읽어내진 회수. 이 값이 큰 경우 , 서버가 몇번이나 풀 인덱스 스캔을 실행하고 있다고 생각된다. 예를 들면 , SELECT col1 FROM foo
을 실행했을 때에 col1 가 인덱스가 되어 있으면(자) 그렇게 된다.Handler_read_key
키에 근거하는 레코드 독해 요구의 회수. 이 값이 큰 경우 , 쿠에리 및 테이블이 적절히 인덱스화 되고 있다고 생각된다. Handler_read_next
키 순서에서의 다음의 레코드의 독해 요구의 회수. 범위 지정을 해 인덱스 컬럼에 대해서 쿠에리를 실행하면(자) , 이것이 인크리먼트(increment) 된다. 인덱스 스캔을 실행해도 인크리먼트(increment) 된다. Handler_read_prev
키 순서에서의 전의 레코드의 독해 요구의 회수. 이것은 주로 , ORDER BY ... DESC
를 최적화하는데 사용된다.Handler_read_rnd
고정 위치에 근거하는 레코드 독해 요구의 회수. 결과의 소트를 필요로 하는 쿠에리를 많이 실행하면(자) , 이 값이 커진다. Handler_read_rnd_next
데이터 파일에서의 다음의 레코드의 독해 요구의 회수. 테이블 스캔이 많이 실행되면(자) , 이 값이 커진다. 이 경우 , 일반적으로 , 테이블이 적절히 인덱스화되어 있지 않은지 , 쿠에리가 인덱스를 유효하게 이용하고 있지 않는가를 의미한다. Handler_rollback
내부 ROLLBACK
커멘드수.Handler_update
테이블내의 레코드의 갱신 요구 회수. Handler_write
테이블에의 레코드의 삽입 요구 회수. Key_blocks_used
키 캐쉬의 사용 블록수. Key_read_requests
캐쉬로부터의 키 블록 독해 요구 회수. Key_reads
디스크로부터의 키 블록의 물리적 독해 회수. Key_write_requests
캐쉬에의 키 블록의 기입 요구 회수. Key_writes
디스크에의 키 블록의 물리적 기입 회수. Max_used_connections
동시 사용 가능한 최대 접속수. Not_flushed_key_blocks
변경되었지만 , 디스크에의 플래시는 아직되어 있지 않은 키 캐쉬의 키 블록. Not_flushed_delayed_rows
INSERT DELAY
큐로 기입을 기다리고 있는 레코드의 수.Open_tables
열려 있는 테이블의 수. Open_files
열려 있는 파일의 수. Open_streams
열려 있는 시냇물의 수(주로 로그용으로 사용). Opened_tables
열린 테이블의 수. Rpl_status
fail-safe인 replication의 스테이터스( 아직 사용되어 있지 않다 ). Select_full_join
키를 사용하지 않는 결합의 수(이 값이 0 나오지 않는 경우 , 테이블의 인덱스를 체크할 필요가 있다 ). Select_full_range_join
참조 테이블로 범위 지정의 검색을 사용한 결합의 수. Select_range
최초의 테이블의 범위 지정된 부분만을 사용한 결합의 수(통상 , 이 값이 커도 문제는 되지 않는다 ). Select_scan
최초의 테이블로 풀 스캔을 실시한 결합의 수. Select_range_check
각 레코드의 다음에 키 사용을 체크하는 , 키를 사용하지 않는 결합의 수(이 값이 0 나오지 않는 경우 , 테이블의 인덱스를 체크할 필요가 있다 ). Questions
서버에 송신된 쿠에리의 수. Slave_open_temp_tables
슬레이브 thread에 의해 현재 열리고 있는 텐포라리테이불의 수. Slave_running
마스터에 접속되고 있는 슬레이브의 경우는 ON
.Slow_launch_threads
생성에 slow_launch_time
보다 시간이 걸린 thread의 수.Slow_queries
long_query_time
초부터 시간이 걸린 쿠에리의 수. See 항4.10.5. 「슬로우 쿠에리 로그」.Sort_merge_passes
소트 알고리즘으로 필요했던 머지 패스의 회수. 이 값이 크면 , sort_buffer
의 값을 크게 하는 것을 고려해야 한다.Sort_range
범위 지정으로 행해진 소트의 회수. Sort_rows
소트 된 레코드의 수. Sort_scan
테이블의 스캔에 의해 실행된 소트의 회수. ssl_xxx
SSL 에 의해 사용되는 변수( 아직 도입되어 있지 않다 ). Table_locks_immediate
테이블 락이 곧바로 실행된 회수. 3.23.33 그리고 도입. Table_locks_waited
테이블 락이 곧바로는 실행되지 않고 , 대기가 필요했던 회수. 이 값이 큰 경우 , 퍼포먼스상의 문제가 있다. 우선 쿠에리를 최적화해 , 다음에 테이블을 분할할까 replication를 사용해야 한다. 3.23.33 그리고 도입. Threads_cached
thread 캐쉬내의 thread수. Threads_connected
현재 열려 있는 접속의 수. Threads_created
접속을 처리하기 위해서 작성된 thread의 수. Threads_running
sleeve 상태로 되어 있지 않은 thread의 수. Uptime
서버의 가동초수. Opened_tables
치가 큰 경우 ,table_cache
변수가 너무 작다고 생각된다.Key_reads
값이 큰 경우 ,key_buffer_size
변수가 너무 작다고 생각된다. 캐쉬 미스 레이트는 ,Key_reads
/Key_read_requests
그리고 계산된다.Handler_read_rnd
값이 큰 경우 ,MySQL 가 테이블 전체를 스캔 할 필요가 있는 쿠에리가 너무 많은지 , 키를 적절히 사용하지 않는 결합이 있다고 생각된다.Threads_created
값이 큰 경우 ,thread_cache_size
변수를 크게 하는 것을 고려해야 한다. 캐쉬 히트 레이트는 ,Threads_created
/Connections
그리고 계산된다.Created_tmp_disk_tables
값이 큰 경우 ,tmp_table_size
변수를 크게 해 , 디스크 베이스는 아니고 메모리베이스로 텐포라리테이불을 취득할 수 있도록(듯이) 한다.