คู่มือเกมแลค › L7 OS ของเซิร์ฟเวอร์ (เคอร์เนล)
ตาราง conntrack ของเซิร์ฟเวอร์เต็ม conntrack table full
ID สาเหตุ so-conntrack · ผู้รับผิดชอบหลัก อินฟราเซิร์ฟเวอร์ (ทีมอินฟรา) · ร่วมกับ พัฒนาเซิร์ฟเวอร์ (ทีมพัฒนาเกม), พัฒนาไคลเอนต์ (ทีมพัฒนาเกม)
เปิดการ์ดในฉบับหลักที่มีภาพและการทดลอง →
เมื่อตาราง connection tracking (conntrack) ที่ไฟร์วอลล์ของ Linux ใช้บันทึกทุกการเชื่อมต่อแตะขีดจำกัด แพ็กเก็ตใหม่จะถูกทิ้ง
ทำไม การเชื่อมต่อทะลักและการเชื่อมต่อสั้น ๆ ซ้ำไปมาทำให้รายการในตารางเพิ่มขึ้น → ผลคือ ตารางเต็ม การเชื่อมต่อใหม่และแพ็กเก็ตบางส่วนถูกทิ้ง → บนหน้าจอ เข้าเกมไม่ได้ และวาร์ปเพราะแพ็กเก็ตหายโดยไม่รู้สาเหตุ
- อาการ
- เข้าเกมไม่ได้/โหลดไม่จบ, วาร์ป
- ปัจจัย
- แพ็กเก็ตหาย
- ใครเจอ
- ทั้งเซิร์ฟเวอร์
- เกิดเมื่อไร
- หลังล็อกอิน/หลังปิดปรับปรุง, ตอนคนแห่มารวมกัน
- ผู้รับผิดชอบ
- ผู้รับผิดชอบหลัก อินฟราเซิร์ฟเวอร์ (ทีมอินฟรา) · ร่วมกับ พัฒนาเซิร์ฟเวอร์ (ทีมพัฒนาเกม), พัฒนาไคลเอนต์ (ทีมพัฒนาเกม)
- งานฝั่งทีมพัฒนาเกม
- เซิร์ฟเวอร์: ลดการเชื่อมต่อสั้น ๆ (ใช้การเชื่อมต่อซ้ำสำหรับการเรียกระหว่างเซิร์ฟเวอร์) ไคลเอนต์: เมื่อเชื่อมต่อไม่สำเร็จหรือหลุด ให้เพิ่มช่วงห่างการลองใหม่ขึ้นเรื่อย ๆ และสุ่มให้กระจาย
- งานฝั่งทีมอินฟรา
- เพิ่มขนาดตาราง (nf_conntrack_max), ไม่ติดตามพอร์ตเกม (NOTRACK ในตาราง raw), ตั้ง alert ปริมาณการใช้งาน
- ตัวเลขที่ควรรู้
- ขีดจำกัดเริ่มต้นอยู่ที่ประมาณ 60,000–260,000 รายการตามขนาดหน่วยความจำของเซิร์ฟเวอร์ ถ้าล้น log ของเคอร์เนลจะมี “nf_conntrack: table full, dropping packet”
- บนกราฟ
- ชนเพดานแล้วแบนราบ · จำนวนรายการ conntrack (nf_conntrack_count)
- จุดที่ต้องดู
- net.netfilter.nf_conntrack_count (จำนวนรายการปัจจุบัน) จาก sysctl วางบนกราฟเดียวกับ nf_conntrack_max และหา “nf_conntrack: table full, dropping packet” ใน dmesg
- สัญญาณว่าใช่
- nf_conntrack_count แบนราบที่ค่า max และตั้งแต่ตอนนั้น log ของเคอร์เนลขึ้น table full
- สัญญาณว่าไม่ใช่
- จำนวนรายการยังห่างจาก max มาก: ไม่ใช่สาเหตุนี้ ขีดจำกัด connection tracking ของตัวอินสแตนซ์ AWS เองให้ดู conntrack_allowance_exceeded ใน “เกินขีดจำกัด PPS ของคลาวด์”
- วิธีตรวจ
- ใช้เครื่องมือฝั่งอินฟรา (ไม่ต้องใช้โค้ดเกม)
แหล่งอ้างอิง
- Netfilter Conntrack Sysfs variables Linux kernel
ค่าเริ่มต้นของ nf_conntrack_max เท่ากับจำนวน hash bucket (nf_conntrack_buckets) ซึ่งกำหนดจากขนาดหน่วยความจำ - net/netfilter/nf_conntrack_core.c (Linux v6.12) Linux kernel
ขนาดเริ่มต้นคือ 65,536 ถ้าหน่วยความจำเกิน 1 GB และ 262,144 ถ้าเกิน 4 GB (64 บิต), เมื่อเต็มจะบันทึก “nf_conntrack: table full, dropping packet” แล้วทิ้ง - iptables-extensions(8) — Linux manual page netfilter
ใช้ CT --notrack ในตาราง raw เพื่อไม่ติดตามการเชื่อมต่อ
สาเหตุที่ควรดูประกอบ
ชั้นเดียวกัน: L7 OS ของเซิร์ฟเวอร์ (เคอร์เนล)
สาเหตุจากชั้นอื่นที่ทำให้เกิดอาการเดียวกัน (เข้าเกมไม่ได้/โหลดไม่จบ)
ดูการ์ดในฉบับหลักที่มีภาพและการทดลอง