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

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

อินเทอร์รัปต์ของ NIC กระจุกที่คอร์เดียว Single-queue NIC / no RSS

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

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

ถ้า NIC ส่งอินเทอร์รัปต์แจ้งว่าแพ็กเก็ตมาถึงไปที่คอร์ CPU เพียงคอร์เดียว คอร์นั้นจะกลายเป็นคอขวด

ทำไม มี receive queue เดียว หรือปิด RSS ที่กระจายไปหลายคอร์ → ผลคือ คอร์หนึ่งขึ้นถึง 100% จนดึงแพ็กเก็ตออกมาไม่ทัน → บนหน้าจอ ตอนคนแห่มารวมกัน ทั้งเซิร์ฟเวอร์มีแพ็กเก็ตหายและความหน่วง (วาร์ป, อินพุตดีเลย์)

อาการ
วาร์ป, ดีดกลับ, อินพุตดีเลย์
ปัจจัย
แพ็กเก็ตหาย, ความหน่วง
ใครเจอ
ทั้งเซิร์ฟเวอร์
เกิดเมื่อไร
ตอนคนแห่มารวมกัน
ผู้รับผิดชอบ
ผู้รับผิดชอบหลัก อินฟราเซิร์ฟเวอร์ (ทีมอินฟรา)
งานฝั่งทีมอินฟรา
ตั้งค่า RSS (NIC กระจาย) และ RPS (เคอร์เนลกระจาย), กระจายอินเทอร์รัปต์ไปหลายคอร์, ตั้งให้ UDP แบ่งคิวโดยดูถึงพอร์ตด้วย (rx-flow-hash udp4 sdfn ของ ethtool -N), แยกคอร์ที่จัดการอินเทอร์รัปต์ออกจากคอร์ของเธรดทิกเกม, เฝ้าดู %soft แยกตามคอร์
ตัวเลขที่ควรรู้
ปริมาณที่คอร์หนึ่งประมวลผลผ่านเคอร์เนลได้อยู่ที่ราวหลายแสนแพ็กเก็ตต่อวินาที ขึ้นกับขนาดแพ็กเก็ตและการตั้งค่า ถ้าดูอัตราการใช้งานแยกตามคอร์แล้วพบว่าสัดส่วนงานรับแพ็กเก็ต (%soft ของ mpstat) กระจุกอยู่ที่คอร์เดียว ก็คือกรณีนี้
บนกราฟ
ชนเพดานแล้วแบนราบ · %soft แยกตามคอร์, จำนวนแพ็กเก็ตรับต่อวินาที
จุดที่ต้องดู
ใช้ mpstat -P ALL 1 ดู %soft (สัดส่วนเวลาจัดการ software interrupt) แยกตามคอร์ แล้วตรวจด้วย /proc/interrupts ว่าอินเทอร์รัปต์ของแต่ละคิวของ NIC ไปที่คอร์ไหน ใช้ ethtool -l ดูจำนวนคิว และ ethtool -S ดูจำนวนแพ็กเก็ตแยกตามคิว (ชื่อต่างกันตามไดรเวอร์)
สัญญาณว่าใช่
มีคอร์เดียวที่ %soft ติดอยู่ใกล้ 100% ส่วนคอร์อื่นว่าง และอินเทอร์รัปต์กับแพ็กเก็ตกระจุกอยู่ที่คิวเดียว ตั้งแต่นั้นจำนวนแพ็กเก็ตรับต่อวินาทีก็ไม่ขึ้นอีก
สัญญาณว่าไม่ใช่
ถ้า %soft กระจายเท่า ๆ กันในหลายคอร์ ก็ไม่ใช่สาเหตุนี้ ถ้า CPU ว่างแต่มีแพ็กเก็ตหาย น่าจะเป็น “เกินขีดจำกัด PPS ของคลาวด์” หรือ “ring buffer ไม่พอ”
วิธีตรวจ
ใช้เครื่องมือฝั่งอินฟรา (ไม่ต้องใช้โค้ดเกม)
รายละเอียดเพิ่มเติม
แม้มีหลายคิว ถ้าทราฟฟิกส่วนใหญ่มาจาก IP ไม่กี่ตัว เช่น เกตเวย์หรือ proxy ก็จะไปกองที่คิวเดียว สำหรับ UDP การตั้งค่าเริ่มต้นของ NIC บางรุ่นแบ่งคิวโดยดูแค่ IP ต้องเปลี่ยนให้ดูถึงพอร์ตด้วยจึงจะกระจายได้เท่า ๆ กัน

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

  1. Scaling in the Linux Networking Stack Linux kernel
    RSS (NIC กระจายไปหลาย receive queue) และ RPS (เคอร์เนลกระจาย), การตั้งให้แต่ละคิวมีอินเทอร์รัปต์ของตัวเองแล้วแบ่งไปหลายคอร์, ถ้าการจัดการอินเทอร์รัปต์ขาเข้าเป็นคอขวด แนะนำ RSS
  2. How to receive a million packets per second Cloudflare
    ผลการวัดที่ receive queue เดียวไปที่คอร์เดียว ทำให้คอร์นั้นตันที่ราว 350,000–430,000 แพ็กเก็ตต่อวินาที, กรณีที่ NIC hash UDP ด้วย IP อย่างเดียวจนไปกองที่คิวเดียว
  3. ethtool(8) — Linux manual page ethtool
    ออปชัน ethtool -N rx-flow-hash udp4 ที่ใส่พอร์ต (f และ n) ลงใน hash ของ UDP ด้วย
  4. mpstat(1) — Linux manual page sysstat
    %soft: สัดส่วนเวลาที่ CPU ใช้จัดการ software interrupt, -P ALL ดูแยกตามคอร์

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

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

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

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