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

คู่มือเกมแลค › L6 การ์ดเครือข่ายของเซิร์ฟเวอร์

ring buffer ไม่พอ RX ring buffer overflow

ID สาเหตุ nic-ring · ผู้รับผิดชอบหลัก อินฟราเซิร์ฟเวอร์ (ทีมอินฟรา)

เปิดการ์ดในฉบับหลักที่มีภาพและการทดลอง →

ถ้า ring buffer ที่ NIC ใช้พักแพ็กเก็ตไว้ชั่วคราวมีขนาดเล็ก เมื่อแพ็กเก็ตทะลักเข้ามาในชั่วขณะ บัฟเฟอร์จะล้นและแพ็กเก็ตถูกทิ้ง

ทำไม ring buffer เล็กตามค่าเริ่มต้น (256–2,048 สล็อต แล้วแต่ไดรเวอร์) → ผลคือ ตอนเกิด burst บัฟเฟอร์ล้นก่อนที่ CPU จะดึงออกไป → บนหน้าจอ แพ็กเก็ตหายเฉพาะตอน burst (วาร์ป, สกิลไม่ออก) ไม่มีร่องรอยใน log ของเซิร์ฟเวอร์เกม

อาการ
วาร์ป, กดไม่ติด/โรลแบ็ค
ปัจจัย
แพ็กเก็ตหาย
ใครเจอ
ทั้งเซิร์ฟเวอร์
เกิดเมื่อไร
ตอนคนแห่มารวมกัน
ผู้รับผิดชอบ
ผู้รับผิดชอบหลัก อินฟราเซิร์ฟเวอร์ (ทีมอินฟรา)
งานฝั่งทีมอินฟรา
ขยาย ring buffer (ethtool -G), เฝ้าดูตัวนับการทิ้ง (drop) เช่น rx_missed_errors ใน ethtool -S (ชื่อต่างกันตามไดรเวอร์)
ตัวเลขที่ควรรู้
ถ้าแพ็กเก็ตทะลักเข้ามา 1 ล้านแพ็กเก็ตต่อวินาที 1,024 สล็อตจะเต็มในเวลาประมาณ 1 ms ระหว่างนั้นถ้า CPU มาช้าแค่ครั้งเดียวก็ล้น NIC ส่วนใหญ่เพิ่มได้ถึงหลายพันสล็อต
บนกราฟ
พุ่งแบบสุ่มเป็นครั้งคราว · ตัวนับการทิ้งขาเข้าของ NIC
จุดที่ต้องดู
เก็บตัวนับการทิ้งขาเข้าใน ethtool -S (rx_missed_errors, rx_fifo_errors ฯลฯ ชื่อต่างกันตามไดรเวอร์) และ missed ใน ip -s -s link ด้วยช่วงเวลาสั้น ๆ และใช้ ethtool -g ดูขนาด ring ปัจจุบันกับค่าสูงสุด
สัญญาณว่าใช่
ตัวนับการทิ้งเพิ่มขึ้นตอนเกิด burst และขนาด ring ปัจจุบันเล็กกว่าค่าสูงสุดมาก เมื่อขยาย ring การทิ้งก็ลดลง
สัญญาณว่าไม่ใช่
ถ้าตัวนับการทิ้งไม่ขยับแต่มีแพ็กเก็ตหาย น่าจะเป็นขั้นถัดไปในเคอร์เนล (“บัฟเฟอร์ซ็อกเก็ตของเคอร์เนลไม่พอ”) หรือช่วงเครือข่าย ถ้า %soft ของคอร์เดียวอยู่ที่ 100% น่าจะเป็น “อินเทอร์รัปต์ของ NIC กระจุกที่คอร์เดียว”
วิธีตรวจ
ใช้เครื่องมือฝั่งอินฟรา (ไม่ต้องใช้โค้ดเกม)

แหล่งอ้างอิง

  1. Linux Base Driver for Intel(R) Ethernet Network Connection (e1000) Linux kernel
    receive descriptor ของ e1000 (สล็อตของ ring) ค่าเริ่มต้น 256 เพิ่มได้ถึง 4,096
  2. drivers/net/ethernet/intel/ice/ice.h (Linux v6.12) Linux kernel
    receive descriptor ของไดรเวอร์ ice ค่าเริ่มต้น 2,048 สูงสุด 8,160
  3. Interface statistics Linux kernel
    แพ็กเก็ตที่อุปกรณ์ทิ้งเพราะบัฟเฟอร์ไม่พอนับเป็น rx_missed_errors, สถิติเฉพาะไดรเวอร์ดูได้ด้วย ethtool -S
  4. ethtool(8) — Linux manual page ethtool
    -g ดูขนาด ring (ค่าปัจจุบันและค่าสูงสุด), -G เปลี่ยนขนาด, -S ดูสถิติเฉพาะไดรเวอร์

สาเหตุที่ควรดูประกอบ

ชั้นเดียวกัน: L6 การ์ดเครือข่ายของเซิร์ฟเวอร์

สาเหตุจากชั้นอื่นที่ทำให้เกิดอาการเดียวกัน (วาร์ป)

ดูการ์ดในฉบับหลักที่มีภาพและการทดลอง