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

Sách trắng lag game › L13 Kiến trúc và vận hành server

Đi qua gateway hoặc proxy Gateway / proxy hop

ID nguyên nhân in-gateway · 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), 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 →

Khi đặt một server trung gian giữa client và server game, mỗi lần đi qua nó lại cộng thêm thời gian xử lý, và server đó trở thành điểm lỗi duy nhất (single point of failure).

Vì sao Cấu trúc client ↔ gateway ↔ server game → Dẫn đến Server trung gian cộng thêm thời gian xử lý và chờ, khi quá tải thì ảnh hưởng đến tất cả mọi người → Trên màn hình Ping của mọi người đều tăng, khi gateway gặp sự cố thì toàn bộ người chơi đi qua gateway đó bị mất kết nối

Triệu chứng
Trễ thao tác, Mất kết nối
Yếu tố
Độ trễ, Ngưng trệ
Ai gặp phải
Cả server
Khi nào
Khi đông người, Luôn luôn
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), Phát triển client (Đội phát triển game)
Việc cần làm (Đội phát triển game)
Server: thiết kế để có thể tăng lên nhiều gateway; khi một gateway chết, kết nối lại qua gateway khác thì nhân vật vẫn tiếp tục như cũ (kết nối lại phiên). Client: tự động kết nối lại khi mất kết nối với gateway.
Việc cần làm (Đội hạ tầng)
Mở rộng gateway theo chiều ngang (thêm máy), giám sát CPU, số kết nối và độ trễ xử lý của từng gateway.
Con số tham khảo
Vì nằm trong cùng một trung tâm dữ liệu nên bình thường mỗi lần đi qua mất chưa tới 1 ms. Khi gateway quá tải, con số này tăng lên vài chục đến vài trăm ms.
Trên đồ thị
Tăng theo số người và tải · Độ trễ xử lý của gateway, CPU và số kết nối của gateway
Chỗ cần xem
CPU, số kết nối của gateway và Recv-Q của socket trên gateway (ss, netstat), chênh lệch độ trễ trước và sau khi qua gateway. Với lời gọi HTTP, gRPC đi qua service mesh: so sánh chỉ số chuẩn của Istio istio_request_duration_milliseconds, tách theo bên gửi (reporter=source) và bên nhận (reporter=destination)
Đúng nếu
thời gian xử lý của server game không đổi nhưng riêng độ trễ ở đoạn gateway tăng, và cùng lúc đó CPU của gateway bão hòa hoặc Recv-Q dồn lên
Loại trừ nếu
đường không qua gateway (kết nối trực tiếp, gateway khác) cũng chậm y như vậy → nguyên nhân nằm ở đường truyền hoặc phía server game
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
Khi dùng service mesh (Istio, v.v.), sidecar proxy (Envoy) gắn bên cạnh mỗi server cũng thêm một chặng nữa. Yêu cầu giữa các service lần lượt đi qua sidecar bên gửi rồi sidecar bên nhận, và proxy càng được gắn thêm tính năng như thu thập log, chỉ số thì thời gian xử lý và thời gian chờ càng tăng.
Sự cố thực tế
Riot Games 2020: League of Legends: host edge của server châu Âu và Brazil bị quá tải

Nguồn

  1. The Unique Architecture behind Amazon Games’ Seamless MMO New World AWS
    Ở New World, client kết nối vào một trong 4 server cổng vào (REP) có địa chỉ công cộng, rồi giao tiếp với các server mô phỏng (hub) phía sau
  2. Designs, Lessons and Advice from Building Large Distributed Systems Google
    Bài phát biểu chính tại LADIS 2009 (Jeff Dean). Khứ hồi trong cùng một trung tâm dữ liệu khoảng 0,5 ms
  3. Site Reliability Engineering, Chapter 22: Addressing Cascading Failures Google
    Khi quá tải làm hàng đợi dài ra, thời gian chờ tăng lên gấp nhiều lần thời gian xử lý (xử lý mất 100 ms, hàng đợi dài gấp 10 lần số thread thì mất 1,1 giây)
  4. Performance and Scalability Istio
    Ở chế độ sidecar, yêu cầu lần lượt đi qua sidecar proxy bên gửi rồi bên nhận; càng thêm tính năng thì đường xử lý bên trong proxy càng dài, và việc thu thập telemetry làm tăng thời gian chờ của yêu cầu tiếp theo
  5. What is Envoy Envoy
    Envoy là một tiến trình chạy riêng bên cạnh mỗi server ứng dụng, ứng dụng gửi và nhận dữ liệu thông qua Envoy trên localhost
  6. Istio Standard Metrics Istio
    istio_request_duration_milliseconds (phân bố thời gian xử lý yêu cầu HTTP, gRPC), dùng nhãn reporter để phân biệt proxy bên gửi (source) và bên nhận (destination)
  7. netstat(8) — Linux manual page net-tools
    Recv-Q: số byte trên socket đã kết nối mà chương trình người dùng chưa lấy đi

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

Cùng tầng: L13 Kiến trúc và vận hành server

Nguyên nhân ở tầng khác gây cùng triệu chứng (Trễ thao tác)

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