한국어English日本語简体中文繁體中文DeutschไทยTiếng ViệtРусскийPortuguês (Brasil)EspañolBahasa Indonesia

Sách trắng lag game › L12 Cơ sở dữ liệu

Cạn connection pool Connection pool exhaustion

ID nguyên nhân db-pool · 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)

Mở thẻ gốc có hình minh họa và thí nghiệm →

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

Triệu chứng
Không vào được·kẹt loading, Trễ thao tác
Yếu tố
Ngưng trệ, Độ trễ
Ai gặp phải
Cả server, Chỉ một tính năng
Khi nào
Ngay sau đăng nhập hoặc bảo trì, Khi đông người
Phụ trách
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

  1. Number Of Database Connections PostgreSQL
    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
  2. Too many connections MySQL
    Khi dùng hết max_connections, kết nối mới bị từ chối với lỗi Too many connections
  3. Connections and Authentication (PostgreSQL Documentation) PostgreSQL
    max_connections: giới hạn số kết nối đồng thời, mặc định thường là 100
  4. SHOW PROCESSLIST Statement MySQL
    Host (địa chỉ client), Command (session rảnh là Sleep), Time, State
  5. Server Status Variables MySQL
    Threads_connected, Threads_running, Connection_errors_max_connections (số kết nối bị từ chối vì chạm max_connections)
  6. The Cumulative Statistics System (PostgreSQL Documentation) PostgreSQL
    pg_stat_activity: client_addr và state (active, idle, idle in transaction, v.v.) của từng kết nối

Nguyên nhân nên xem cùng

Cùng tầng: L12 Cơ sở dữ liệu

Nguyên nhân ở tầng khác gây cùng triệu chứng (Không vào được·kẹt loading)

Xem thẻ gốc có hình minh họa và thí nghiệm