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

คู่มือเกมแลค › L10 หน่วยความจำ

การจัดสรรหน่วยความจำพุ่ง Allocation storms

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

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

ถ้าสร้างออบเจ็กต์ชั่วคราวจำนวนมากระหว่างอีเวนต์ GC จะทำงานบ่อยกว่าปกติมาก

ทำไม ออบเจ็กต์ชั่วคราวพุ่งจากไอเทมดรอป, log การต่อสู้ และของรางวัลอีเวนต์ → ผลคือ GC ทำงานบ่อยขึ้นหลายเท่า และออบเจ็กต์ที่ยังไม่ทันถูกทิ้งย้ายไปอยู่ใน Old generation ทำให้ Full GC มาเร็วขึ้นด้วย → บนหน้าจอ หยุดแวบเป็นรอบเฉพาะช่วงอีเวนต์

อาการ
กระตุก, ค้าง
ปัจจัย
การหยุดชะงัก
ใครเจอ
ทั้งเซิร์ฟเวอร์, บางจุด/บางแชนแนล
เกิดเมื่อไร
ตอนคนแห่มารวมกัน
ผู้รับผิดชอบ
ผู้รับผิดชอบหลัก พัฒนาเซิร์ฟเวอร์ (ทีมพัฒนาเกม)
งานฝั่งทีมพัฒนาเกม
ใช้ object pool, ใช้บัฟเฟอร์ซ้ำ, ทำ allocation profiling
บนกราฟ
สูงตามจำนวนคนและโหลด · จำนวนครั้งที่ GC ทำงาน, อัตราการจัดสรรหน่วยความจำ
จุดที่ต้องดู
นับจำนวนครั้งที่ GC ทำงานต่อนาทีจาก GC log (Java -Xlog:gc, Go GODEBUG=gctrace=1) ส่วน .NET ดูปริมาณการจัดสรรและจำนวนครั้งของ GC ใน dotnet-counters (ตั้งแต่ .NET 9 คือ dotnet.gc.heap.total_allocated และ dotnet.gc.collections, 8 ลงไปคือ Allocation Rate และ Gen 0 GC Count) วางซ้อนกับจำนวนผู้เล่นออนไลน์พร้อมกันและเวลาของอีเวนต์
สัญญาณว่าใช่
พออีเวนต์เริ่ม อัตราการจัดสรรและจำนวนครั้งของ GC เพิ่มชันกว่าจำนวนผู้เล่นที่เพิ่มขึ้น และหยุดสั้น ๆ ถี่ขึ้น พออีเวนต์จบก็กลับเป็นปกติ
สัญญาณว่าไม่ใช่
จำนวนครั้งของ GC เท่าเดิมแต่หยุดแต่ละครั้งนานขึ้น: ข้อมูลที่ยังใช้อยู่เพิ่มขึ้น (mem-gc-thrash, mem-leak)
วิธีตรวจ
ใช้เครื่องมือฝั่งอินฟรา (ไม่ต้องใช้โค้ดเกม)

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

  1. Garbage Collector Implementation Oracle
    เมื่อ Young generation เต็มจะเกิด minor GC, ออบเจ็กต์ที่รอดบางส่วนย้ายไป Old generation และเมื่อ Old เต็มจะเก็บคืนทั้ง heap (นานกว่า minor มาก), -Xlog:gc เขียนหนึ่งบรรทัดต่อ GC หนึ่งครั้ง
  2. A Guide to the Go Garbage Collector Go
    ยิ่งอัตราการจัดสรรสูง รอบ GC ยิ่งถี่, ใช้ GODEBUG=gctrace=1 แสดงผลการติดตาม GC
  3. dotnet-counters diagnostic tool .NET
    ตั้งแต่ .NET 9 แสดงเป็น dotnet.gc.heap.total_allocated และ dotnet.gc.collections ส่วน .NET 8 ลงไปแสดงเป็น Allocation Rate และ Gen 0 GC Count

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

ชั้นเดียวกัน: L10 หน่วยความจำ

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

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