Gói tin đã đến được server nhưng bị bỏ vì ring buffer của NIC (bộ đệm tạm giữ gói tin vừa đến) bị tràn, hoặc core xử lý nhận gói của kernel bị bão hòa.
Vì sao Số người vào tăng vọt, ngắt dồn vào một core, CPU steal trên máy ảo, switch ảo quá tải → Dẫn đến Bị bỏ ở ring buffer (rx_missed_errors và các counter tương tự, tên khác nhau tùy driver) hoặc ở hàng đợi nhận của kernel (softnet dropped) → Trên màn hình Khi đông người, cả server cùng lúc bị trễ thao tác và khựng
Thêm counter bỏ gói như rx_missed_errors trong ethtool -S và dropped trong /proc/net/softnet_stat vào giám sát, tăng kích thước ring buffer (ethtool -G), phân tán RSS và ngắt ra nhiều core, tách core xử lý nhận gói khỏi thread game, bảo đảm CPU còn dư, nếu là máy ảo thì kiểm tra CPU steal và tải của switch ảo.
Con số tham khảo
Gói mà server đã nhận rồi bỏ thì client sẽ gửi lại. Vì vậy chỉ số truyền lại của server ít khi phản ánh vấn đề này; nó hiện ra trước ở các counter bỏ gói như rx_missed_errors trong ethtool -S (tên khác nhau tùy driver) và cột dropped trong /proc/net/softnet_stat.
Trên đồ thị
Chạm giới hạn rồi đi ngang · Mức sử dụng softirq theo core, counter bỏ gói của NIC
Chỗ cần xem
Counter bỏ gói trong ethtool -S (rx_missed_errors và các counter tương tự; với mlx5 là rx_out_of_buffer và rx_discards_phy), missed trong ip -s -s link, cột thứ 2 (dropped) và cột thứ 3 (time_squeeze) của /proc/net/softnet_stat; xem %soft (thời gian xử lý ngắt mềm) theo core bằng mpstat -P ALL. Nếu là máy ảo thì xem cả %steal
Đúng nếu
vào lúc đông người, counter bỏ gói hoặc softnet dropped tăng, %soft của core phụ trách nhận gói lên gần 100% rồi không tăng thêm được. Mọi kết nối của server đó cùng lúc bị trễ thao tác
Loại trừ nếu
counter bỏ gói của server không đổi và truyền lại dồn vào kết nối của một khu vực hoặc nhà mạng nhất định → mất gói trên tuyến đường. Nếu gói server gửi đi bị mất trên đường thì TcpRetransSegs trong nstat của server tăng, còn các counter này không đổi
Cách kiểm tra
Kiểm tra bằng công cụ hạ tầng (không cần code game)
Nguồn
Interface statisticsLinux kernel rx_missed_errors là số gói host không nhận được vì hết bộ đệm (trong /proc/net/dev được cộng vào drop), xem bằng ip -s -s link
mpstat(1) — Linux manual pagesysstat mpstat -P ALL cho biết mức sử dụng theo core; %soft là thời gian xử lý ngắt mềm, %steal là thời gian phải chờ vì hypervisor đang phục vụ CPU ảo khác
net/ipv4/proc.cLinux kernel TcpRetransSegs trong nstat (RetransSegs của mục Tcp)