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

คู่มือเกมแลค › ต้นเหตุของการส่งซ้ำใน TCP

เครื่องเซิร์ฟเวอร์ฝั่งรับทิ้งแพ็กเก็ต Receiver host drops (ring, softirq, CPU)

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

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

แพ็กเก็ตมาถึงเซิร์ฟเวอร์แล้ว แต่ถูกทิ้งเพราะ ring buffer ของ NIC (บัฟเฟอร์ที่พักแพ็กเก็ตที่มาถึงไว้ชั่วคราว) ล้น หรือคอร์ที่เคอร์เนลใช้ประมวลผลขาเข้าทำงานเต็ม

ทำไม ผู้เล่นทะลักเข้ามา, อินเทอร์รัปต์กระจุกที่คอร์เดียว, CPU steal ของ VM, virtual switch โหลดเกิน → ผลคือ ถูกทิ้งที่ ring buffer (เช่น rx_missed_errors ซึ่งชื่อต่างกันตามไดรเวอร์) หรือที่คิวรับของเคอร์เนล (softnet dropped) → บนหน้าจอ ช่วงที่คนเยอะ อินพุตเข้าช้าและหยุดแวบพร้อมกันทั้งเซิร์ฟเวอร์

อาการ
อินพุตดีเลย์, ค้าง, กรอเร็ว, วาร์ป
ปัจจัย
แพ็กเก็ตหาย, การหยุดชะงัก
ใครเจอ
ทั้งเซิร์ฟเวอร์
เกิดเมื่อไร
ตอนคนแห่มารวมกัน
ผู้รับผิดชอบ
ผู้รับผิดชอบหลัก อินฟราเซิร์ฟเวอร์ (ทีมอินฟรา)
งานฝั่งทีมอินฟรา
เพิ่มตัวนับการทิ้ง เช่น rx_missed_errors ใน ethtool -S และ dropped ใน /proc/net/softnet_stat เข้าในการมอนิเตอร์, เพิ่มขนาด ring buffer (ethtool -G), กระจาย RSS และอินเทอร์รัปต์ไปหลายคอร์, แยกคอร์ของเธรดเกมกับคอร์ที่ประมวลผลขาเข้า, เผื่อ CPU ให้เหลือ, ถ้าเป็น VM ให้ตรวจ CPU steal และโหลดของ virtual switch
ตัวเลขที่ควรรู้
แพ็กเก็ตที่เซิร์ฟเวอร์รับแล้วทิ้งไป ไคลเอนต์จะเป็นฝ่ายส่งใหม่ จึงไม่ค่อยเห็นในเมตริกการส่งซ้ำของเซิร์ฟเวอร์ สัญญาณจะโผล่ก่อนในตัวนับการทิ้ง เช่น rx_missed_errors ใน ethtool -S (ชื่อต่างกันตามไดรเวอร์) และ dropped ใน /proc/net/softnet_stat
บนกราฟ
ชนเพดานแล้วแบนราบ · อัตราการใช้ softirq ต่อคอร์, ตัวนับการทิ้งของ NIC
จุดที่ต้องดู
ตัวนับการทิ้งใน ethtool -S (เช่น rx_missed_errors, ส่วน mlx5 คือ rx_out_of_buffer และ rx_discards_phy), missed ใน ip -s -s link, คอลัมน์ที่ 2 (dropped) และคอลัมน์ที่ 3 (time_squeeze) ของ /proc/net/softnet_stat และ %soft (การประมวลผล soft interrupt) ต่อคอร์จาก mpstat -P ALL ถ้าเป็น VM ดู %steal ด้วย
สัญญาณว่าใช่
ช่วงที่คนเยอะ ตัวนับการทิ้งหรือ softnet dropped เพิ่มขึ้น และ %soft ของคอร์ที่ประมวลผลขาเข้าตันอยู่ใกล้ 100% อินพุตช้าลงพร้อมกันในทุกการเชื่อมต่อของเซิร์ฟเวอร์นั้น
สัญญาณว่าไม่ใช่
ตัวนับการทิ้งของเซิร์ฟเวอร์ไม่ขยับ และการส่งซ้ำกระจุกที่การเชื่อมต่อจากบางพื้นที่/บาง ISP: น่าจะเป็นแพ็กเก็ตหายระหว่างทาง ถ้าแพ็กเก็ตที่เซิร์ฟเวอร์ส่งไปหายระหว่างทาง TcpRetransSegs ใน nstat ของเซิร์ฟเวอร์จะเพิ่มขึ้น ส่วนตัวนับเหล่านี้ไม่ขยับ
วิธีตรวจ
ใช้เครื่องมือฝั่งอินฟรา (ไม่ต้องใช้โค้ดเกม)

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

  1. Interface statistics Linux kernel
    rx_missed_errors คือจำนวนแพ็กเก็ตที่โฮสต์รับไม่ได้เพราะไม่มีบัฟเฟอร์ (ใน /proc/net/dev นับรวมใน drop) ตรวจด้วย ip -s -s link
  2. drivers/net/ethernet/intel/igb/igb_ethtool.c Linux kernel
    ไดรเวอร์เป็นผู้กำหนดชื่อตัวนับใน ethtool -S (เช่น rx_missed_errors และ rx_no_buffer_count ของ igb)
  3. Ethtool counters Linux kernel
    rx_out_of_buffer (ไม่มีบัฟเฟอร์ในคิวรับ) และ rx_discards_phy (ทิ้งเพราะบัฟเฟอร์ของพอร์ตไม่พอ) ของไดรเวอร์ mlx5
  4. net/core/net-procfs.c Linux kernel
    /proc/net/softnet_stat มีหนึ่งบรรทัดต่อ CPU เป็นเลขฐาน 16 คอลัมน์ที่ 2 คือ dropped และคอลัมน์ที่ 3 คือ time_squeeze
  5. Documentation for /proc/sys/net/ Linux kernel
    netdev_max_backlog: ขีดจำกัดของคิวรับที่ใช้พักแพ็กเก็ตเมื่อแพ็กเก็ตเข้ามาเร็วกว่าที่เคอร์เนลประมวลผลทัน
  6. Scaling in the Linux Networking Stack Linux kernel
    RSS: NIC แบ่งแพ็กเก็ตไปหลายคิวรับเพื่อให้หลาย CPU ประมวลผล
  7. ethtool(8) — Linux manual page ethtool
    เปลี่ยนขนาด ring buffer ด้วย -G (--set-ring)
  8. proc_stat(5) — Linux manual page Linux man-pages
    steal ใน /proc/stat: เวลาที่ OS อื่นใช้ CPU ในสภาพแวดล้อม virtualization
  9. mpstat(1) — Linux manual page sysstat
    ดูอัตราการใช้งานต่อคอร์ด้วย mpstat -P ALL %soft คือเวลาประมวลผล soft interrupt ส่วน %steal คือเวลาที่ต้องรอเพราะ hypervisor ไปประมวลผล virtual CPU ตัวอื่น
  10. net/ipv4/proc.c Linux kernel
    TcpRetransSegs ที่แสดงใน nstat (RetransSegs ในหมวด Tcp)

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

ชั้นเดียวกัน: ต้นเหตุของการส่งซ้ำใน TCP

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

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