본문 바로가기

DB의 속삭임/DataBase의 외침

[DB][MySQL][관리] MySQL의 TimeOut

1. Time Out의 종류 

- connect_timeout (bad handshake timeout) 
- interactive_timeout (interactive 모드에서 connection time out) 

※ interactive 모드는 'mysql>' 과 같은 프롬프트 있는 콘솔이나 터미널 모드를 말합니다.

- wait_timeout (none interactive 모드에서 connection time out) 


2. connect_timeout 

이 설정은 mysqld 와 mysql client 가 연결(connection)을 맺기 위해서 mysqld 가 연결 패킷을 기다리는 최대 시간입니다.

- 즉, TCP 연결을 맺는 과정(3-way handshake)에서, connect_timeout 동안에도 연결 패킷이 들어오지 않으면 연결이 실패(취소가 아님)되고, bad handshake 로 응답합니다.

연결이 실패(Fail) 한경우 : Aborted_connects 값이 증가

※ 연결이 취소(연결된 상태에서 강제로 종료 된경우) : Aborted_clients 값이 증가

※ mysql>SHOW STATUS WHERE Variable_name in ('Aborted_connects','Aborted_clients');

- 연결 실패율(POF)은 Aborted_connects * 100 / Connections로 계산되어지며, 기본값의 5초로 따로 튜닝을 할필요가 없습다. 또한 실패에 대한 로그는 mysqld의 --warnings 옵션 사용과 xxx.err 파일에 기록됩니다.

※ 연결 실패 사유 

- 연결 패킷에 올바른 연결 정보가 없는 경우

- 특정 user 가 권한이 없는 데이터베이스에 접근할 경우

- mysqld 접근 password 가 틀린 경우

- connect_timeout 보다 긴 연결 과정


3. interactive_timeout

- interactive 모드에서 time out 을 말합니다.

- mysqld 와 mysql client 가 연결을 맺은 다음, 다음 쿼리까지 기다리는 최대 시간을 의미합니다

- 설정된 interactive_timeout 까지도 아무런 요청(쿼리)이 없으면 연결은 취소되고, 그 이후에 다시 요청이 들어오면 연결은 자동으로 맺어집니다.

- interactive_timeout 안에 다시 요청이 들어오면 wait time은 0으로 초기화 됩니다(CLIENT_INTERACTIVE).

※ wait time 확인 : SHOW PROCESSLIST;

- 기본 설정은 28800(8시간)초로 매우 높은 값이며, 약 1시간 정도로 설정을 권장 합니다.


4. wait_timeout

interactive 모드가 아닌 경우에 해당되며, mysqld 와 mysql client 가 연결을 맺은 후, 다음 쿼리까지 기다리는 최대 시간을 의미합니다. ( PHP, C 와 같이 API를 이용한 Client프로그램 모드를 말합니다.)

- wait_timeout 안에 다시 요청이 들어오면 wait time 은 0 으로 초기화 됩니다. (SESSION.WAIT_TIMEOUT)

- 연결 취소율(POC) = Aborted_clients * 100 / Connections

※ 연결 취소 사유 (강제 종료됨)

종료(exit) 되기전 mysql_close() 가 없는 경우

- wait_timeout 이나 interactive_timeout 시간까지 아무런 요청(쿼리)이 없는 경우

- 기본 설정은 28800(8시간)초로 매우 높은 값이다.

※ 튜닝이 필요한 경우 

- 보통 POC(연결 취소율)가 1 % 이상인 경우

- 아주 바쁜 서버에서는 튜닝전 0.01 % 이상인 경우

- 기타 튜닝 기준에 따라 다름

※ 주의 점은 클라이언트 프로그램을 수정 하지 않은 상태에서 wait_timeout을 튜닝시 튜닝전에 비해서 POC가 더 올라가야 정상입니다. 이 의미는 비정상적인 커넥션을 반환하는 비율이므로, 정상적인 MySQL서비스하에서 비정상적인 클라이언트의 커넥션의 반환임을 의미합니다.


5. wait_timeout 통계 구하기.

- 아래의 명령문을 질의 하여 주요 항목을 확인하여 값을 구한다.

mysql> tee /path/to/mysql.status.txt mysql> SHOW STATUS; or

shell> mysqladmin [OPTIONS] extended-status > mysql.status.txt

- 주요 항목

- Aborted_clients

- Connections

- Max_used_connections

- Slow_queries

- Questions

- Uptime




※ mysql 클라이언트인 interactive mode로 접속하면 wait_time을 interactive_timeout로 바꾸어 준단다.

    - 프로그램으로 확인을 해야 된단다.

    - show global variables like '%timeout%'이걸로는 된까나..??

        - 참고 문언 : http://lumitech.tistory.com/entry/mycnf-wait-timeout-problem


※ 출처 및 참고 문언

http://www.linuxchannel.net/docs/mysql-timeout.txt



※ 주로 노출 되는 에러 메세지

Too many connections

- 관련된 설정

- max_connections

- wait_timeout

- ERROR 2006: MySQL server has gone away

No connection. Trying to reconnect...

Connection id: 12002

Current database: xxx

- 관련 설정

- Aborted_clients

- wait_timeout 의 결과