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

Sách trắng lag game › L7 OS server (kernel)

Cạn cổng tạm (ephemeral port) ở kết nối giữa các server Ephemeral port exhaustion (TIME_WAIT)

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

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

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

Triệu chứng
Nuốt thao tác·rollback, Không vào được·kẹt loading
Yếu tố
Mất gói
Ai gặp phải
Cả server, Chỉ một tính năng
Khi nào
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 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

  1. IP Sysctl Linux 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
  2. include/net/tcp.h (Linux v6.12) Linux kernel
    TCP_TIMEWAIT_LEN(60*HZ): TIME_WAIT khoảng 60 giây là hằng số của kernel
  3. TCP/IP port exhaustion troubleshooting Microsoft
    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
  4. ss(8) — Linux manual page iproute2
    Bộ lọc trạng thái state time-wait chỉ hiển thị socket TIME_WAIT
  5. connect(2) — Linux manual page Linux man-pages
    EADDRNOTAVAIL: mọi cổng trong dải cổng tạm đều đang được dùng nên không mở được kết nối

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

Cùng tầng: L7 OS server (kernel)

Nguyên nhân ở tầng khác gây cùng triệu chứng (Nuốt thao tác·rollback)

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