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

Sách trắng lag game › L9 Tiến trình game phía server

Chi phí serialize và nén Serialization / compression cost

ID nguyên nhân sp-serialize · Phụ trách chính 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 →

Việc chuyển dữ liệu cần gửi thành byte và nén cũng tốn CPU, và khi đông người, chi phí này tăng vọt.

Vì sao Mỗi bản cập nhật đều phải chuyển struct thành byte rồi nén → Dẫn đến Chi phí tăng theo bình phương số người → Trên màn hình Dữ liệu gửi đi trễ, gây trễ thao tác

Triệu chứng
Trễ thao tác
Yếu tố
Ngưng trệ, Độ trễ
Ai gặp phải
Một địa điểm hoặc kênh
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)
Việc cần làm (Đội phát triển game)
Dùng lại gói đã tạo một lần cho nhiều người, dùng định dạng gọn nhẹ.
Trên đồ thị
Tăng theo số người và tải · Mức sử dụng CPU của server, CPU của thread tạo gói tin
Chỗ cần xem
Tỷ trọng của các hàm serialize, nén, mã hóa (kể cả hàm thư viện như zlib, LZ4, OpenSSL) trong thời gian CPU của tiến trình game qua perf top -p, so giữa lúc vắng và lúc đông người
Đúng nếu
người càng đông, tỷ trọng các hàm serialize, nén, mã hóa càng lớn, và thread tạo gói tin bão hòa trước tiên
Loại trừ nếu
các hàm này chiếm tỷ trọng nhỏ → tính toán tầm nhìn hoặc logic 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
Nếu kết nối có mã hóa gói tin (TLS, DTLS, v.v.), việc mã hóa và giải mã cũng tốn CPU. Mã hóa được làm riêng cho từng kết nối, nên dù dùng lại một gói cho nhiều người, chi phí mã hóa vẫn tăng theo số người nhận. Mã hóa đối xứng như AES-GCM nhanh đến mức một core xử lý được vài GB mỗi giây nên bình thường chiếm tỷ trọng nhỏ, nhưng tốc độ thay đổi nhiều theo kích thước của đơn vị mã hóa mỗi lần (record), nên với nhiều gói nhỏ như trong game, chi phí trên mỗi byte tăng lên. Ở bước handshake làm một lần cho mỗi kết nối, server ký bằng khóa của chứng chỉ và tính trao đổi khóa (ECDHE). Mỗi giây, một core ký được khoảng 1.100 lần (RSA 2048) đến 18.000 lần (ECDSA P-256) và trao đổi khóa khoảng 9.000 lần, nên khi đăng nhập dồn dập, đây là một gánh nặng.

Nguồn

  1. Introduction to Iris in Unreal Engine Epic Games
    Giữ trạng thái cần replicate dưới dạng một bản sao đã lượng tử hóa để giảm việc tốn kém, và các kết nối dùng chung phần việc đó
  2. VALORANT's 128-Tick Servers Riot Games
    Cách mỗi frame so sánh biến replicate cho từng client rồi gom các giá trị đã đổi là việc chậm vì phải đọc bộ nhớ rải rác nhiều chỗ, nên tốn nhiều CPU của server
  3. How "expensive" is crypto anyway? Cloudflare
    Đo trên BoringSSL: AES-128-GCM khoảng 3,7 GB mỗi giây (thay đổi nhiều theo kích thước record); mỗi core mỗi giây ký RSA 2048 được 1.120 lần, ký ECDSA P-256 được 18.477 lần, P-256 ECDHE được 9.394 lần; trên server edge của Cloudflare, thư viện TLS dùng khoảng 1,8% CPU
  4. perf-top(1) — Linux manual page perf
    Hiển thị theo thời gian thực tỷ trọng CPU theo từng hàm (symbol) của tiến trình (-p) đang chạy

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

Cùng tầng: L9 Tiến trình game phía 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