Hướng dẫn mysql sleep timeout - thời gian chờ ngủ của mysql

Contents

  • Tìm hiểu và cấu hình 2 giá trị “wait_timeout”, ”interactive_timeout” trong MySQL
    • I. Tìm hiểu về 2 biến cấu hình “wait_timeout” và “interactive_timeout”
    • II. Hướng dẫn set giá trị “wait_timeout” và “interactive_timeout”

Trong một số trường hợp, các ứng dụng không thể đóng kết nối tới Cơ Sở Dữ Liệu mà ứng dụng đã không còn sử dụng kết nối đó nữa. Lúc đó các kết nối như vậy sẽ dễ rơi vào trạng thái “Sleeping idle connections”. Như vậy trình tự cơ bản phổ biến nhất dẫn đến trạng thái “Sleeping Idle Connection” như sau :đóng kết nối tới Cơ Sở Dữ Liệu mà ứng dụng đã không còn sử dụng kết nối đó nữa. Lúc đó các kết nối như vậy sẽ dễ rơi vào trạng thái “Sleeping idle connections”. Như vậy trình tự cơ bản phổ biến nhất dẫn đến trạng thái “Sleeping Idle Connection” như sau :

– PHP script thực hiện kết nối tới MySQL.

– Một vài query được thực thi nhưng sau đó script PHP phải làm các tác vụ khác tiêu tốn nhiều thời gian hơn mà không ngắt kết nối tới CSDL.

– Cuối cùng, PHP script thực hiện hoàn thành và sau đấy kết thúc hoạt động script, lúc này mới ngừng kết nối tới CSDL MySQL.

– Như vậy nếu code PHP không thể thực hiện đóng kết nối tới CSDL sẽ có thể dẫn đến nhiều kết nối “Sleep Idle” khi mà rất nhiều tiến trình PHP vẫn còn giữ kết nối nhưng không làm gì cả.

Trên hệ thống dịch vụ MySQL thường sẽ thấy hiện tượng gì ?

– Load hệ thống tăng cao.

– Nhiều tiến trình nằm trong trạng thái idle của MySQL.


Ví dụ liệt kê các kết nối đang ở trạng thái “Sleep Idle”

mysql> show full processlist;
+-------------------------------------------------------------------------------+
| Id     | User   | Host      | db       | Command | Time | State      | Info   |
+-------------------------------------------------------------------------------+
| 398780 | dbuser | localhost | database | Sleep   |  169 |            | NULL   |
| 399056 | dbuser | localhost | database | Sleep   |  129 |            | NULL   |
| 399491 | dbuser | localhost | database | Sleep   |   87 |            | NULL   |
+-------------------------------------------------------------------------------+


Một số cách giải quyết cơ bản như sau :

– Giảm thời gian mà query phải chạy để lấy được kết quả, hãy tối ưu query có lệnh dài nhất chẳng hạn, tối ưu dữ liệu trả về,..

– Hệ thống dịch vụ MySQL có hỗ trợ cấu hình quy định thời gian dừng kết nối đang chế độ rỗi bằng 2 giá trị “wait_timeout” và “interactive_timeout” mà ta sẽ tìm hiểu sau đây.

I. Tìm hiểu về 2 biến cấu hình “wait_timeout” và “interactive_timeout”

II. Hướng dẫn set giá trị “wait_timeout” và “interactive_timeout” wait_timeout

Trong một số trường hợp, các ứng dụng không thể đóng kết nối tới Cơ Sở Dữ Liệu mà ứng dụng đã không còn sử dụng kết nối đó nữa. Lúc đó các kết nối như vậy sẽ dễ rơi vào trạng thái “Sleeping idle connections”. Như vậy trình tự cơ bản phổ biến nhất dẫn đến trạng thái “Sleeping Idle Connection” như sau :

– PHP script thực hiện kết nối tới MySQL.

– Một vài query được thực thi nhưng sau đó script PHP phải làm các tác vụ khác tiêu tốn nhiều thời gian hơn mà không ngắt kết nối tới CSDL.

– Cuối cùng, PHP script thực hiện hoàn thành và sau đấy kết thúc hoạt động script, lúc này mới ngừng kết nối tới CSDL MySQL.

– Như vậy nếu code PHP không thể thực hiện đóng kết nối tới CSDL sẽ có thể dẫn đến nhiều kết nối “Sleep Idle” khi mà rất nhiều tiến trình PHP vẫn còn giữ kết nối nhưng không làm gì cả.


Trên hệ thống dịch vụ MySQL thường sẽ thấy hiện tượng gì ?

– Load hệ thống tăng cao.

– Nhiều tiến trình nằm trong trạng thái idle của MySQL.


Ví dụ liệt kê các kết nối đang ở trạng thái “Sleep Idle”interactive_timeout

Trong một số trường hợp, các ứng dụng không thể đóng kết nối tới Cơ Sở Dữ Liệu mà ứng dụng đã không còn sử dụng kết nối đó nữa. Lúc đó các kết nối như vậy sẽ dễ rơi vào trạng thái “Sleeping idle connections”. Như vậy trình tự cơ bản phổ biến nhất dẫn đến trạng thái “Sleeping Idle Connection” như sau :

– PHP script thực hiện kết nối tới MySQL.

– Một vài query được thực thi nhưng sau đó script PHP phải làm các tác vụ khác tiêu tốn nhiều thời gian hơn mà không ngắt kết nối tới CSDL.

– Như vậy nếu code PHP không thể thực hiện đóng kết nối tới CSDL sẽ có thể dẫn đến nhiều kết nối “Sleep Idle” khi mà rất nhiều tiến trình PHP vẫn còn giữ kết nối nhưng không làm gì cả.


Trên hệ thống dịch vụ MySQL thường sẽ thấy hiện tượng gì ?

– Load hệ thống tăng cao.

– Nhiều tiến trình nằm trong trạng thái idle của MySQL.


Ví dụ liệt kê các kết nối đang ở trạng thái “Sleep Idle”

Một số cách giải quyết cơ bản như sau :

– Giảm thời gian mà query phải chạy để lấy được kết quả, hãy tối ưu query có lệnh dài nhất chẳng hạn, tối ưu dữ liệu trả về,..

– Hệ thống dịch vụ MySQL có hỗ trợ cấu hình quy định thời gian dừng kết nối đang chế độ rỗi bằng 2 giá trị “wait_timeout” và “interactive_timeout” mà ta sẽ tìm hiểu sau đây.

Thông tin biến cấu hình “wait_timeout“

– Loại : integer

– Giá trị mặc định : 28800 (8 giờ)

# mysql --help | grep “my.cnf"
                      order of preference, my.cnf, $MYSQL_TCP_PORT,
/etc/my.cnf /etc/mysql/my.cnf /usr/etc/my.cnf ~/.my.cnf

– Giá trị nhỏ nhất có thể quy định : 1/etc/my.cnf”.

# vi /etc/my.cnf
wait_timeout=300
interactive_timeout=300

– Giá trị lớn nhất có thể quy định : 31536000

# /etc/init.d/mysqld restart

– Phân loại nhóm : Global, Session

mysql> show global variables like '%timeout%';
+----------------------------+----------+
| Variable_name              | Value    |
+----------------------------+----------+
| interactive_timeout        | 300      |
| wait_timeout               | 300      |
+----------------------------+----------+

+ Ý nghĩa của giá trị “wait_timeout“wait_timeout” và “interactive_timeout” thành công. Nên nhớ cần phân loại vấn đề website bạn có hoạt động yêu cầu thời gian kết nối tới Cơ Sở Dữ Liệu lâu như source Magento, Cs-Cart chẳng hạn. Chúc các bạn thành công !