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

Sách trắng lag game › L6 Card mạng server

Ngắt NIC dồn vào một core Single-queue NIC / no RSS

ID nguyên nhân nic-irq · Phụ trách chính Hạ tầng server (Đội hạ tầng)

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

Nếu NIC chỉ gửi ngắt báo gói tin đến cho một core CPU, core đó sẽ thành điểm nghẽn.

Vì sao Chỉ có một hàng đợi nhận, hoặc RSS (phân tán ra nhiều core) đang tắt → Dẫn đến Một core lên 100% nên không lấy gói tin ra kịp → Trên màn hình Khi đông người, toàn server bị mất gói và trễ (dịch chuyển tức thời, trễ thao tác)

Triệu chứng
Dịch chuyển tức thời, Kéo ngược, Trễ thao tác
Yếu tố
Mất gói, Độ trễ
Ai gặp phải
Cả server
Khi nào
Khi đông người
Phụ trách
Phụ trách chính Hạ tầng server (Đội hạ tầng)
Việc cần làm (Đội hạ tầng)
Cấu hình RSS (NIC phân tán), RPS (kernel phân tán), phân tán ngắt ra nhiều core, với UDP thì cấu hình để chia hàng đợi dựa cả trên cổng (rx-flow-hash udp4 sdfn của ethtool -N), tách core xử lý ngắt khỏi core chạy thread tick của game, giám sát %soft theo từng core.
Con số tham khảo
Lượng một core xử lý được qua kernel vào khoảng vài trăm nghìn gói mỗi giây, tùy kích thước gói và cấu hình. Nếu xem mức sử dụng theo từng core mà phần xử lý nhận (%soft của mpstat) chỉ dồn vào một core thì là trường hợp này.
Trên đồ thị
Chạm giới hạn rồi đi ngang · %soft theo core, số gói nhận mỗi giây
Chỗ cần xem
Dùng mpstat -P ALL 1 xem %soft (tỷ lệ xử lý ngắt mềm) của từng core, xem /proc/interrupts để biết ngắt của từng hàng đợi NIC đi tới core nào, ethtool -l để xem số hàng đợi, ethtool -S để xem số gói theo từng hàng đợi (tên khác nhau tùy driver)
Đúng nếu
chỉ một core có %soft bám sát 100%, các core còn lại rảnh, ngắt và gói tin dồn vào một hàng đợi. Từ lúc đó số gói nhận mỗi giây không tăng thêm được
Loại trừ nếu
%soft trải đều trên nhiều core → không phải nguyên nhân này; CPU rảnh mà vẫn mất gói → xem “Vượt giới hạn PPS trên cloud” hoặc “Ring buffer không đủ”
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
Dù có nhiều hàng đợi, nếu phần lớn lưu lượng đến từ vài địa chỉ như gateway hay proxy thì vẫn dồn vào một hàng đợi. Với UDP, cấu hình mặc định của NIC đôi khi chỉ dựa vào địa chỉ để chia hàng đợi, phải đổi sang dựa cả trên cổng thì mới phân tán đều.

Nguồn

  1. Scaling in the Linux Networking Stack Linux kernel
    RSS (NIC phân tán vào nhiều hàng đợi nhận), RPS (kernel phân tán), cấu hình cho mỗi hàng đợi một ngắt riêng và chia ra nhiều core, khuyến nghị RSS nếu xử lý ngắt nhận là điểm nghẽn
  2. How to receive a million packets per second Cloudflare
    Số đo cho thấy khi một hàng đợi nhận chỉ đi tới một core, core đó nghẽn ở khoảng 350.000–430.000 gói mỗi giây; trường hợp NIC hash UDP chỉ theo địa chỉ IP nên dồn vào một hàng đợi
  3. ethtool(8) — Linux manual page ethtool
    Tùy chọn ethtool -N rx-flow-hash udp4 để đưa cả cổng (f, n) vào hash UDP
  4. mpstat(1) — Linux manual page sysstat
    %soft: tỷ lệ thời gian CPU dùng để xử lý ngắt mềm, -P ALL để xem theo từng core

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

Cùng tầng: L6 Card mạng server

Nguyên nhân ở tầng khác gây cùng triệu chứng (Dịch chuyển tức thời)

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