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)
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
NAT gateway basicsAWS 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ỏ
NAT gateway metrics and dimensionsAWS 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
Troubleshoot NAT gatewaysAWS 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
Metrics and alerts for Azure NAT GatewayMicrosoft 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
IP addresses and portsGoogle 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
Logs and metricsGoogle Cloud reason OUT_OF_RESOURCES của dropped_sent_packets_count: gói bị bỏ vì thiếu NAT IP hoặc cổng