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

Sách trắng lag game › Nguyên nhân gốc của truyền lại TCP

Tường lửa và theo dõi kết nối bỏ gói Stateful firewall / conntrack drops

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

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

Tường lửa hoặc tính năng theo dõi kết nối của Linux (conntrack, ghi các kết nối đi qua vào một bảng) sẽ bỏ gói tin khi bảng đầy hoặc khi xác định trạng thái kết nối không khớp.

Vì sao Bảng theo dõi kết nối đầy (table full), hoặc chiều đi và chiều về khác đường nên chỉ một chiều đi qua tường lửa (tuyến đường bất đối xứng) → Dẫn đến Tường lửa coi đó là gói của “kết nối lạ” hoặc có “số thứ tự nằm ngoài phạm vi cửa sổ” rồi bỏ đi → Trên màn hình Bảng đầy thì kết nối mới bị chặn; tuyến đường lệch thì chỉ người đi tuyến đó bị truyền lại liên tục rồi mất kết nối

Triệu chứng
Đứng hình, Mất kết nối, Không vào được·kẹt loading
Yếu tố
Mất gói
Ai gặp phải
Cả server, Một khu vực hoặc nhà mạng
Khi nào
Khi đông người, Ngay sau đăng nhập hoặc bảo trì, Thỉnh thoảng bất chợt
Phụ trách
Phụ trách chính Hạ tầng mạng (Đội hạ tầng) · Phối hợp Hạ tầng server (Đội hạ tầng), Phát triển server (Đội phát triển game), Phát triển client (Đội phát triển game)
Việc cần làm (Đội phát triển game)
Server: phòng khi bảng đầy, dùng hệ thống hàng chờ đăng nhập để điều tiết lượng kết nối dồn vào, tái sử dụng kết nối để không lặp lại các kết nối ngắn (kể cả gọi giữa các server), dọn trước các kết nối đã mất heartbeat. Client: khi kết nối thất bại hoặc bị ngắt, tăng dần khoảng cách thử lại và rải ngẫu nhiên (để không cùng dồn lại một lượt khi bảng đầy).
Việc cần làm (Đội hạ tầng)
Mạng: tăng kích thước bảng theo dõi kết nối của tường lửa, cho cổng game ra khỏi theo dõi kết nối, chỉnh định tuyến để chiều đi và chiều về qua cùng một tường lửa, xem lại cấu hình kiểm tra cửa sổ TCP của tường lửa. Thiết bị server·OS: tăng kích thước bảng trên Linux (nf_conntrack_max), cho cổng game ra khỏi theo dõi kết nối (NOTRACK), xem lại cấu hình kiểm tra cửa sổ TCP (nf_conntrack_tcp_be_liberal), trên AWS thì kiểm tra thêm conntrack_allowance_exceeded.
Con số tham khảo
Giới hạn mặc định của conntrack trên Linux (nf_conntrack_max) từ vài chục nghìn đến vài trăm nghìn mục, tùy dung lượng bộ nhớ. Khi số hiện tại (nf_conntrack_count) chạm giới hạn, log sẽ ghi “nf_conntrack: table full, dropping packet”.
Trên đồ thị
Chạm giới hạn rồi đi ngang · Số mục conntrack (nf_conntrack_count), số kết nối mới thất bại
Chỗ cần xem
Trên server Linux: nf_conntrack_count và nf_conntrack_max, “nf_conntrack: table full, dropping packet” trong dmesg, drop và invalid trong /proc/net/stat/nf_conntrack (mỗi core một dòng, số hệ 16). Với tường lửa: mức sử dụng bảng phiên và log drop; trên AWS: conntrack_allowance_exceeded trong ethtool -S
Đúng nếu
số mục đi ngang ở mức giới hạn, cùng lúc đó log table full và drop, hoặc conntrack_allowance_exceeded tăng. Nếu là tuyến đường bất đối xứng thì giới hạn vẫn còn dư nhưng invalid và log drop của tường lửa tăng ở các kết nối đi một tuyến nhất định
Loại trừ nếu
số mục còn xa giới hạn, invalid và log drop cũng không đổi → nguyên nhân khác. Bảng còn dư nhưng CPU hoặc số gói mỗi giây của tường lửa đã kịch trần → “Thiết bị trung gian vượt giới hạn xử lý”
Cách kiểm tra
Kiểm tra bằng công cụ hạ tầng (không cần code game)

Nguồn

  1. Netfilter Conntrack Sysfs variables Linux kernel
    Giá trị mặc định của nf_conntrack_max bằng số hash bucket (bộ nhớ ÷ 16384, từ 1.024 đến 262.144), số hiện tại là nf_conntrack_count, nf_conntrack_tcp_be_liberal chỉ coi RST nằm ngoài cửa sổ là INVALID
  2. net/netfilter/nf_conntrack_core.c Linux kernel
    Khi bảng đầy thì ghi log “nf_conntrack: table full, dropping packet” rồi bỏ gói (thống kê drop tăng); gói không khớp trạng thái kết nối làm thống kê invalid tăng
  3. iptables-extensions(8) — Linux manual page netfilter
    Loại khỏi theo dõi kết nối bằng CT --notrack trong bảng raw
  4. Amazon EC2 security group connection tracking AWS
    Vượt giới hạn số kết nối được theo dõi của mỗi instance thì gói bị bỏ, xem qua conntrack_allowance_exceeded; khuyến nghị tránh tuyến đường bất đối xứng
  5. net/netfilter/nf_conntrack_standalone.c Linux kernel
    /proc/net/stat/nf_conntrack có mỗi core một dòng, số hệ 16, gồm các cột như entries, invalid, insert_failed, drop, early_drop

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

Cùng tầng: Nguyên nhân gốc của truyền lại TCP

Nguyên nhân ở tầng khác gây cùng triệu chứng (Đứng hình)

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