Khi server game mở rồi đóng kết nối ngắn tới DB hoặc server khác quá thường xuyên, các kết nối đã đóng vẫn chiếm giữ cổng một thời gian, nên không mở được kết nối mới.
Vì sao Mỗi yêu cầu lại mở rồi đóng một kết nối mới → Dẫn đến Bên đóng trước chiếm giữ cổng khoảng 60 giây (Linux) ở trạng thái TIME_WAIT, nên hết cổng để dùng → Trên màn hình Yêu cầu nội bộ thất bại, gây lỗi lưu dữ liệu và lỗi tính năng
Phụ trách chính Phát triển server (Đội phát triển game) · Phối hợp Hạ tầng server (Đội hạ tầng)
Việc cần làm (Đội phát triển game)
Tái sử dụng kết nối (connection pool), không mở rồi đóng kết nối mới cho mỗi yêu cầu.
Việc cần làm (Đội hạ tầng)
Mở rộng dải cổng (ip_local_port_range), cân nhắc tái sử dụng TIME_WAIT cho kết nối đi ra (tcp_tw_reuse trên Linux), giám sát số TIME_WAIT.
Con số tham khảo
Dải cổng mặc định của Linux (32768–60999) có khoảng 28.000 cổng. Mở quá 470 kết nối mới trong 1 giây tới cùng một địa chỉ đích là cạn. Windows mặc định có khoảng 16.000 cổng (49152–65535) và TIME_WAIT cũng dài hơn nên còn cạn nhanh hơn.
Trên đồ thị
Chạm giới hạn rồi đi ngang · Số socket TIME_WAIT, số lần kết nối nội bộ thất bại
Chỗ cần xem
Đếm socket TIME_WAIT theo từng địa chỉ đích bằng ss -tan state time-wait; tìm các lần connect thất bại (EADDRNOTAVAIL) trong log server game
Đúng nếu
số TIME_WAIT tới cùng một đích (DB chẳng hạn) đi ngang gần kích thước dải cổng tạm (mặc định khoảng 28.000), và connect thất bại với EADDRNOTAVAIL
Loại trừ nếu
TIME_WAIT ít mà chỉ kết nối đi ra bên ngoài thất bại → “Giới hạn kết nối và cổng của NAT gateway trên cloud”
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
TIME_WAIT 60 giây của Linux là giá trị cố định trong kernel. Giảm tcp_fin_timeout (tên nghe giống) cũng không làm TIME_WAIT ngắn lại.
Nguồn
IP SysctlLinux kernel ip_local_port_range mặc định 32768–60999; tcp_tw_reuse; tcp_fin_timeout là thời gian giữ trạng thái FIN_WAIT_2
TCP/IP port exhaustion troubleshootingMicrosoft Dải cổng động mặc định của Windows là 49152–65535; kết nối đã đóng giữ cổng ở trạng thái TIME_WAIT, mặc định 4 phút