Số kết nối tạo sẵn tới DB là cố định, nên khi query chậm chiếm giữ kết nối, các yêu cầu còn lại phải chờ.
Vì sao Query chậm hoặc yêu cầu dồn dập làm mọi kết nối đều đang bận → Dẫn đến Yêu cầu mới phải chờ đến khi có kết nối rảnh → Trên màn hình Đăng nhập kẹt loading, lưu chậm, timeout
Phụ trách chính Phát triển server (Đội phát triển game) · Phối hợp Hạ tầng DB (Đội hạ tầng)
Việc cần làm (Đội phát triển game)
Loại bỏ query chậm, điều chỉnh kích thước pool và timeout chờ (đừng tăng pool một cách mù quáng), tách pool theo tính năng.
Việc cần làm (Đội hạ tầng)
Kiểm tra số kết nối tối đa của DB và dư địa CPU, IOPS; trước khi mở rộng hoặc autoscaling, kiểm tra số server × kích thước pool có nằm trong số kết nối tối đa không; thêm chỉ số chờ kết nối và chờ lock vào giám sát.
Con số tham khảo
Số kết nối cần có được ước lượng bằng “số yêu cầu mỗi giây × thời gian một yêu cầu chiếm giữ kết nối”. 2.000 yêu cầu trong 1 giây, mỗi yêu cầu 5 ms thì trung bình luôn có 10 kết nối bận. Để phòng lúc dồn dập, thường đặt gấp hai, ba lần số đó. Nếu query chậm đi thành 150 ms thì cùng lượng yêu cầu ấy cần tới 300 kết nối.
Trên đồ thị
Chạm giới hạn rồi đi ngang · Số kết nối DB đang dùng, thời gian chờ kết nối
Chỗ cần xem
Đếm trạng thái kết nối theo từng server game từ phía DB. MySQL: xem Host, Command (kết nối rảnh là Sleep), Time trong SHOW PROCESSLIST cùng Threads_connected, Threads_running và số kết nối bị từ chối Connection_errors_max_connections. PostgreSQL: nhóm pg_stat_activity theo client_addr, state rồi đếm. Nếu thư viện connection pool của server game xuất ra số lượng và thời gian chờ thì xem cùng
Đúng nếu
toàn bộ kết nối của một server game (bằng kích thước pool) đều đang chạy query, số kết nối rảnh bằng 0, và trong lúc đó đăng nhập, lưu phải chờ. Hoặc tổng số kết nối của DB chạm max_connections và kết nối mới bị từ chối
Loại trừ nếu
còn nhiều kết nối rảnh mà vẫn chậm → độ trễ của bản thân query (db-no-index, db-hot-row) hoặc tài nguyên DB bão hòa
Cách kiểm tra
Kiểm tra bằng công cụ hạ tầng (không cần code game)
Tìm hiểu thêm
Tăng pool một cách mù quáng chỉ làm CPU của DB và tranh chấp khóa tăng lên, khiến mọi thứ cùng chậm. Ngoài ra, nếu số server × kích thước pool vượt quá số kết nối tối đa của DB, server mới mở rộng hoặc vừa khởi động lại sẽ không tạo nổi kết nối. Chuyện này hay gặp ngay sau autoscaling hoặc bảo trì.
Nguồn
Number Of Database ConnectionsPostgreSQL Khi tài nguyên DB đã dùng hết, tăng kết nối thì thông lượng ngược lại còn giảm; giữ số kết nối hoạt động vừa với tài nguyên, phần còn lại cho vào hàng đợi thì cả độ trễ lẫn thông lượng đều tốt hơn
Too many connectionsMySQL Khi dùng hết max_connections, kết nối mới bị từ chối với lỗi Too many connections