Hướng dẫn check max connection mysql - kiểm tra kết nối tối đa mysql

Đã đăng vào thg 5 1, 2021 2:21 SA 4 phút đọc 4 phút đọc

1. Lỗi Too many connections

Trong quá trình làm việc với hệ quản trị cơ sơ sở dữ liệu[Mysql, Postgres, Oracle...] rất nhiều khi gặp lỗi "Too many connections". Tại thời điểm đó, database không thể tiếp tục nhận các kết nối đến.Too many connections". Tại thời điểm đó, database không thể tiếp tục nhận các kết nối đến.

  • Bạn không thể connect dùng GUI.
  • Các service và application không hoạt động.

-> Giải pháp đơn giản nhất là reset lại database, để đóng các connections hiện tại.

  • Ưu điểm: Nhanh, dễ dàng.: Nhanh, dễ dàng.
  • Nhược điểm: Nó chỉ giải quyết tạm thời, 1 thời gian sau [1 giờ, 1 ngày ...] database sẽ lại tiếp tục gặp lỗi này, không giải quyết được gốc rễ của vấn đề.: Nó chỉ giải quyết tạm thời, 1 thời gian sau [1 giờ, 1 ngày ...] database sẽ lại tiếp tục gặp lỗi này, không giải quyết được gốc rễ của vấn đề.

Nếu là 1 kỹ sư có tâm với sản phẩm của mình, chúng ta sẽ cố gắng đi sâu vào gốc dễ vấn đề để xử lý:

Trong bài hướng dẫn này, mình hướng dẫn 1 số cách check trên Mariadb các database khác làm tương tự.

2. Phân tích nguyên nhân

  • Suy nghĩ đầu tiên trong đầu kiểm tra max connections hiện tại và tăng giới hạn của nó.max connections hiện tại và tăng giới hạn của nó.
show global variables like '%max_connections%'

Như trong hình ta có thể thấy, hiện tại database của mình đang là max_connections=100 Như vậy nó chỉ cho tối đa 100 connections. Mình sẽ tăng nó lên 1000.max_connections=100 Như vậy nó chỉ cho tối đa 100 connections. Mình sẽ tăng nó lên 1000.

set global max_connections = 1000;

Đến đây các bạn sẽ tiếp tục hỏi, tại sao không tăng đến 1 triệu đi. Thực ra cái gì cũng có giá của nó. Mình sẽ tiếp tục phân tích.

Phụ thuộc vào RAM available của hệ thống là bao nhiêu, lượng ram sử dụng cho mỗi connection là bao nhiêu. Lưu ý rằng không có giới hạn cứng của max_connections. Chúng ta phải lựa chọn 1 cách thông mình dự vào workload của hệ thống. Ví dụ: Với những kết nối sử dụng các bảng tạm, bộ nhớ sử dụng cho 1 connection sẽ nhiều. Với các server có it bộ nhớ hay giới hạn số lượng connection ở phía ứng dụng: max_connections=100-300. Với các server từ 16G RAM trở lên, max_connections>=1000, nếu ứng dụng xử lý tốt, tác vụ đơn giản [không dùng nhiều bảng tạm, bộ nhớ tạm] có thể max_connections=8000.max_connections. Chúng ta phải lựa chọn 1 cách thông mình dự vào workload của hệ thống. Ví dụ: Với những kết nối sử dụng các bảng tạm, bộ nhớ sử dụng cho 1 connection sẽ nhiều. Với các server có it bộ nhớ hay giới hạn số lượng connection ở phía ứng dụng: max_connections=100-300. Với các server từ 16G RAM trở lên, max_connections>=1000, nếu ứng dụng xử lý tốt, tác vụ đơn giản [không dùng nhiều bảng tạm, bộ nhớ tạm] có thể max_connections=8000.

  • Chúng ta cần xem xét chi tiết, connection đến từ đâu để xử lý thay vì chỉ cắm đầu vào tăng max_connections.

Chạy lệnh này để kiểm tra cơ sở dữ liệu đang có các connection đến từ đâu [Host], từ user nào [User], database nào [db]. Xem chi tiết tại đây Kết quả như bên dưới.Host], từ user nào [User], database nào [db]. Xem chi tiết tại đây Kết quả như bên dưới.

show processlist ;

Từ hình trên ta có thể thấy:

    1. 5 connections đầu Id [1->5] là của hệ thống -> cái này không can thiệp.
    1. 3 connections tiếp Id [12->14] của cái gì đó chạy bằng user [haproxy] -> nó là của service của mình
    1. connection cuối cùng đến từ chính GUI của mình đang thực hiện để querry.

3. Kết luận

Từ đó chúng ta có thể kiểm tra được ứng dụng nào đang tạo nhiều connections. Chúng ta sẽ đi vào ứng dụng, kiểm tra các thông số của nó để tìm hướng giải quyết. Bài viết tiếp theo, mình sẽ đưa ra 1 ví dụ cụ thể cách mình xử lý trong bài toán thực tế.

  • Có thể ứng dụng config không đúng.
  • Ứng dụng bị leak connection [cái này rất nghiêm trọng]
  • Ứng dụng đang bị DDOS

Nếu cần trao đổi, mọi người hãy comment bên dưới.

All rights reserved

Làm thế nào để thay đổi max_connections

Bạn có thể thay đổi max_connectionstrong khi MySQL đang chạy qua SET:

mysql> SET GLOBAL max_connections = 5000;
Query OK, 0 rows affected [0.00 sec]

mysql> SHOW VARIABLES LIKE "max_connections";
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| max_connections | 5000  |
+-----------------+-------+
1 row in set [0.00 sec]

Để mở

timeout liên quan

Tôi chưa bao giờ thấy thông báo lỗi của bạn trước đây, vì vậy tôi đã truy cập vào Google. có thể là bạn đang sử dụng Connector / Net. Connector / Net Manual cho biết có kích thước nhóm kết nối tối đa. [mặc định là 100] xem bảng 22.21.Connector / Net Manual cho biết có kích thước nhóm kết nối tối đa. [mặc định là 100] xem bảng 22.21.

Tôi khuyên bạn nên tăng giá trị này lên 100k hoặc tắt tính năng tổng hợp kết nối Pooling=false

anh ấy có hai câu hỏi.

Q1 - điều gì sẽ xảy ra nếu tôi tắt tính năng tổng hợp Làm chậm kết nối DB. connection poolinglà một cơ chế sử dụng kết nối DB đã tạo. chi phí Tạo kết nối mới cao. //en.wikipedia.org/wiki/Connection_pool Làm chậm kết nối DB. connection poolinglà một cơ chế sử dụng kết nối DB đã tạo. chi phí Tạo kết nối mới cao. //en.wikipedia.org/wiki/Connection_pool

Câu hỏi 2 - Giá trị của tổng hợp có thể tăng lên hay tối đa là 100?

bạn có thể tăng nhưng tôi chắc chắn giá trị MAX là gì, có thể max_connectionstrong my.cnf

Đề xuất của tôi là đừng tắt Pooling, hãy tăng giá trị lên 100 cho đến khi không có lỗi kết nối.

Nếu bạn có công cụ Kiểm tra mức độ căng thẳng như

set global max_connections = 1000;
1bạn có thể tự kiểm tra.

64 hữu ích 2 bình luận chia sẻ 2 bình luận chia sẻ

Chủ Đề