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

Sách trắng lag game › L5 Thiết bị mạng trung tâm dữ liệu

Giới hạn kết nối và cổng của NAT gateway trên cloud Cloud NAT gateway connection / port limits

ID nguyên nhân dc-nat-gateway · Phụ trách chính Hạ tầng mạng (Đội hạ tầng) · Phối hợp Phát triển server (Đội phát triển game)

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

Các kết nối từ server trong subnet riêng đi ra ngoài (xác thực nền tảng, thanh toán, API bên ngoài) được NAT gateway đổi địa chỉ và cổng rồi gửi đi. Nếu số kết nối đồng thời tới cùng một đích vượt giới hạn cổng của gateway, kết nối mới sẽ thất bại.

Vì sao Các server mở nhiều kết nối ngắn hoặc giữ kết nối lâu tới cùng một địa chỉ bên ngoài như xác thực nền tảng, thanh toán → Dẫn đến NAT gateway không cấp thêm được cổng nguồn cho đích đó nên kết nối mới thất bại → Trên màn hình Trong game vẫn bình thường, nhưng riêng các tính năng gọi ra ngoài như đăng nhập, thanh toán, phát thưởng thất bại hoặc chậm (không vào được·kẹt loading, nuốt thao tác·rollback)

Triệu chứng
Không vào được·kẹt loading, Nuốt thao tác·rollback
Yếu tố
Mất gói, Độ trễ
Ai gặp phải
Chỉ một tính năng, Cả server
Khi nào
Ngay sau đăng nhập hoặc bảo trì, Giờ cao điểm buổi tối, Khi đông người
Phụ trách
Phụ trách chính Hạ tầng mạng (Đội hạ tầng) · Phối hợp Phát triển server (Đội phát triển game)
Việc cần làm (Đội phát triển game)
Tái sử dụng kết nối tới API bên ngoài (HTTP keep-alive, connection pool) và không mở kết nối mới cho mỗi yêu cầu, với kết nối nhàn rỗi để lại trong pool thì gửi keepalive với khoảng cách ngắn hơn idle timeout của NAT (AWS 350 giây) hoặc chủ động đóng trước, khi thất bại thì tăng dần khoảng chờ giữa các lần thử lại và rải ngẫu nhiên, ghi tỷ lệ thất bại và độ trễ theo từng lời gọi ra ngoài.
Việc cần làm (Đội hạ tầng)
Gắn thêm địa chỉ IP cho NAT gateway (NAT gateway công cộng của AWS mặc định chỉ gắn được tối đa 2 Elastic IP, muốn nhiều hơn phải yêu cầu tăng hạn mức), chia gateway theo availability zone và subnet, đặt cảnh báo cho chỉ số cấp phát cổng thất bại (AWS ErrorPortAllocation, trạng thái Failed của SNAT Connection Count trên Azure, OUT_OF_RESOURCES của dropped_sent_packets_count trên Google Cloud), với Google Cloud NAT thì tăng số cổng tối thiểu cho mỗi VM hoặc dùng cấp phát cổng động.
Con số tham khảo
AWS NAT gateway với một địa chỉ IP mở được tối đa 55.000 kết nối đồng thời tới cùng một đích (IP, cổng, giao thức), và có thể gắn tới 8 IP để tăng thêm. Kết nối im lặng 350 giây bị xóa, sau đó gói gửi qua kết nối này sẽ nhận về RST. Azure NAT Gateway có 64.512 cổng SNAT cho mỗi IP công cộng (tối đa 16 IP). Google Cloud NAT chia 64.512 cổng của mỗi NAT IP cho từng VM, nhưng số cổng tối thiểu mặc định cho mỗi VM là 64 (cấp phát tĩnh), nên với cấu hình mặc định, một VM thường chỉ mở được 64 kết nối đồng thời tới cùng một đích.
Trên đồ thị
Chạm giới hạn rồi đi ngang · Số kết nối đồng thời của NAT gateway, số lần cấp phát cổng thất bại
Chỗ cần xem
Với AWS, xem các chỉ số NAT gateway trên CloudWatch là ErrorPortAllocation, ActiveConnectionCount, PacketsDropCount (Azure: SNAT Connection Count lọc theo trạng thái Failed và Dropped Packets; Google Cloud: dropped_sent_packets_count với reason OUT_OF_RESOURCES) đặt cạnh thời điểm các lời gọi ra ngoài của server game thất bại
Đúng nếu
vào lúc lời gọi ra ngoài thất bại, ErrorPortAllocation (Azure: SNAT Connection Count ở trạng thái Failed, Google Cloud: gói bị bỏ với OUT_OF_RESOURCES) lớn hơn 0, và các lỗi dồn vào lời gọi tới một hai đích có nhiều kết nối như server xác thực, thanh toán
Loại trừ nếu
cấp phát cổng thất bại bằng 0 nhưng connect của server game thất bại với EADDRNOTAVAIL và TIME_WAIT gần chạm dải cổng tạm → xem “Cạn cổng tạm (ephemeral port) ở kết nối giữa các server”; kết nối được nhưng chỉ phản hồi chậm → xem “Phụ thuộc service bên ngoài”
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
Khác với “Cạn cổng tạm (ephemeral port) ở kết nối giữa các server”, vốn là tình trạng cổng tạm của một server bị cạn, giới hạn này nằm ở NAT gateway và được các server phía sau gateway dùng chung (Google Cloud NAT chia cho từng VM). Nếu TIME_WAIT và dải cổng tạm phía server vẫn còn dư mà chỉ lời gọi ra ngoài thất bại thì là trường hợp này. Cổng của kết nối đã đóng cũng không được dùng lại ngay cho cùng đích (Azure có thời gian cooldown, Google Cloud không dùng được trong thời gian TIME_WAIT), nên càng lặp lại kết nối ngắn thì càng nhanh chạm giới hạn.

Nguồn

  1. NAT gateway basics AWS
    Mỗi địa chỉ IPv4 mở được 55.000 kết nối đồng thời tới cùng một đích (IP, cổng, giao thức đích), gắn tới 8 IP để tăng thêm (Elastic IP của NAT gateway công cộng mặc định là 2, tăng bằng yêu cầu nâng hạn mức), băng thông tự tăng từ 5 lên 100 Gbps và thông lượng tự tăng từ 1 triệu lên 10 triệu gói mỗi giây, vượt giới hạn đó thì gói bị bỏ
  2. NAT gateway metrics and dimensions AWS
    ErrorPortAllocation: số lần không cấp phát được cổng nguồn (lớn hơn 0 nghĩa là quá nhiều kết nối đồng thời), ActiveConnectionCount, IdleTimeoutCount (kết nối bị dọn do nhàn rỗi 350 giây), PacketsDropCount
  3. Troubleshoot NAT gateways AWS
    Nhàn rỗi 350 giây thì kết nối hết hạn và gửi tiếp sẽ nhận RST, khuyến nghị keepalive ngắn hơn 350 giây, chạm giới hạn kết nối thì thêm gateway theo availability zone, thêm IP hoặc giảm số kết nối
  4. Source Network Address Translation (SNAT) with Azure NAT Gateway Microsoft Azure
    Mỗi IP công cộng có 64.512 cổng SNAT (tối đa 16 IP), mỗi kết nối tới cùng một đích cần một cổng khác nhau, cổng đã đóng phải qua cooldown trước khi dùng lại cho cùng đích
  5. Metrics and alerts for Azure NAT Gateway Microsoft Azure
    SNAT Connection Count lọc theo trạng thái Failed lớn hơn 0 thì có khả năng đã cạn cổng SNAT, Dropped Packets
  6. IP addresses and ports Google Cloud
    Mỗi NAT IP có 64.512 cổng riêng cho TCP và riêng cho UDP, số cổng tối thiểu mỗi VM mặc định 64 (cấp phát tĩnh), 32 (cấp phát động), số cổng dành cho VM giới hạn số kết nối đồng thời tới cùng một đích, kết nối đã đóng không dùng được trong thời gian TIME_WAIT
  7. Logs and metrics Google Cloud
    reason OUT_OF_RESOURCES của dropped_sent_packets_count: gói bị bỏ vì thiếu NAT IP hoặc cổng

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

Cùng tầng: L5 Thiết bị mạng trung tâm 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