MariaDB

sleep session 정리하기

kkimdubi·2018년 3월 22일·조회 38,927
 

-. sleep 세션이란

client-mysql 서버와 연결 후 다음 query 수행까지 대기중인 상태의 세션
sleep 세션이 너무 많고 정리가 안되는 경우 connection full 로 인해 신규 세션 접속이 불가능해지고
session 별 할당 되는 메모리로 인해 memory 부족 현상 발생 가능
 
 

-. timeout 설정

connect_timeout  :  MySQL 서버 접속시에 접속실패를 메시지를 보내기까지 대기하는 시간
delayed_insert_timeout  :  insert시 delay될 경우 대기하는 시간
innodb_lock_wait_timeout  :  innodb에 transaction 처리중 lock이 걸렸을 시 롤백 될때까지 대기하는 시간으로 innodb는 자동으로 데드락을 검색해서 롤백시킴
innodb_rollback_on_timeout  :  innodb의 마지막 구문을 롤백시킬지 결정하는 파라미터
                                                  timeout은 진행중인 transaction을 중단하고 전체 transaction을 롤백하는 과정에서 발생
net_read_timeout  :  서버가 클라이언트로부터 데이터를 읽어들이는 것을 중단하기까지 대기하는 시간
net_write_timeout  :  서버가 클라이언트에 데이터를 쓰는 것을 중단하기까지 대기하는 시간 
slave_net_timeout  :  마스터/슬레이브로 서버가 클라이언트로부터 데이터를 읽어들이는 것을 중단하기까지 대기하는 시간
table_lock_wait_timeout  :  테이블 락을 중단하기까지 대기하는 시간
 
wait_timeout  :   활동하지 않는 커넥션을 끊을때까지 서버가 대기하는 시간 (php,jdbc 등을 통한 connection)
interactive_timeout  :  활동중인 커넥션이 닫히기 전까지 서버가 대기하는 시간 (mysql command line)
 
=> DB의 Timeout 설정으로 sleep 세션들을 정리할 수 있으며 
이번 글에서 살펴볼 설정은 wait_timeout 과 interactive_timeout 
 

-. sleep 세션 자동으로 정리하는 방법

 
mysql> select count(*) from information_schema.processlist where command='Sleep';
+----------+
| count(*) |
+----------+
|      326 |
+----------+
1 row in set (0.00 sec)
=> sleep 상태의 세션이 326개
 
mysql> show variables like 'interactive%';
+---------------------+-------+
| Variable_name       | Value |
+---------------------+-------+
| interactive_timeout | 28800 |
+---------------------+-------+
1 row in set (0.00 sec)
 
=>28800 초 이후 interactive 세션들을 정리하게 설정되어있음 
 
mysql> show variables like 'wait_timeout';
+---------------------+-------+
| Variable_name       | Value |
+---------------------+-------+
| wait_timeout | 28800 |
+---------------------+-------+
1 row in set (0.00 sec)
 
=>28800 초 이후 non-interactive 세션들을 정리하게 설정되어있음 
 
mysql> set global interactive_timeout=30;
Query OK, 0 rows affected (0.00 sec)
 
mysql> show global variables like 'interactive%';
+---------------------+-------+
| Variable_name       | Value |
+---------------------+-------+
| interactive_timeout | 30    |
+---------------------+-------+
1 row in set (0.00 sec)
 
mysql> set global wait_timeout=30;
Query OK, 0 rows affected (0.00 sec)
 
mysql> show global variables like 'wait_timeout';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| wait_timeout  | 30    |
+---------------+-------+
1 row in set (0.00 sec)
 
=> sleep 상태가 30초 이상 된 세션들 정리하도록 설정
 
 
 
mysql> show processlist;
+----+-------------+--------------------+------+---------+-------+-----------------------------------------------------------------------------+------------------+----------+
| Id | User        | Host               | db   | Command | Time  | State                                                                       | Info             | Progress |
+----+-------------+--------------------+------+---------+-------+-----------------------------------------------------------------------------+------------------+----------+
|  3 | system user |                    | NULL | Connect | 99200 | Connecting to master                                                        | NULL             |    0.000 |
|  4 | system user |                    | NULL | Connect | 99200 | Slave has read all relay log; waiting for the slave I/O thread to update it | NULL             |    0.000 |
| 25 | root        | 165.243.5.20:29883 | NULL | Sleep   |    29 |                                                                             | NULL             |    0.000 |
| 26 | root        | localhost          | NULL | Query   |     0 | init                                                                        | show processlist |    0.000 |
+----+-------------+--------------------+------+---------+-------+-----------------------------------------------------------------------------+------------------+----------+
4 rows in set (0.00 sec)
 
mysql> show processlist;
+----+-------------+-----------+------+---------+-------+-----------------------------------------------------------------------------+------------------+----------+
| Id | User        | Host      | db   | Command | Time  | State                                                                       | Info             | Progress |
+----+-------------+-----------+------+---------+-------+-----------------------------------------------------------------------------+------------------+----------+
|  3 | system user |           | NULL | Connect | 99201 | Connecting to master                                                        | NULL             |    0.000 |
|  4 | system user |           | NULL | Connect | 99201 | Slave has read all relay log; waiting for the slave I/O thread to update it | NULL             |    0.000 |
| 26 | root        | localhost | NULL | Query   |     0 | init                                                                        | show processlist |    0.000 |
+----+-------------+-----------+------+---------+-------+-----------------------------------------------------------------------------+------------------+----------+
3 rows in set (0.00 sec)
 
=> Sleep 상태의 세션이 30초 지난 후 자동으로 정리됨
★ 설정 변경 전 존재하는 sleep 세션들에 대해서는 적용안됨, 신규 세션들만 적용됨
 

댓글 1

로그인 후 댓글을 남길 수 있습니다.

  • mmalgogi· 2021년 2월 7일
    안녕하세요. sleep session 관련 및 session list 조회 관련해서 글을 쓰려고 하는 개발자입니다. 다름이 아니오라 글 내용이 너무 좋아서 일부 내용을 발췌해서 쓰려고 하는데, 혹시 괜찮을지 해서 부탁드리려고 댓글 남깁니다. 출처는 당연히 명시해서 올리려고 합니다!! 그리고 다시 한 번 좋은 글 감사드리며, 해당 내용 통해서 많이 배웠습니다. 감사합니다.