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

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

GC pause ของสคริปต์เอนจิน Scripting VM GC (Lua, etc.)

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

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

แม้เซิร์ฟเวอร์จะเขียนด้วย C++ แต่ถ้ารันเควสต์, AI และสกิลด้วยสคริปต์อย่าง Lua ระหว่างที่ GC ของสคริปต์เอนจินทำงาน โซนนั้นจะหยุดชะงัก

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

อาการ
กระตุก, ค้าง
ปัจจัย
การหยุดชะงัก
ใครเจอ
บางจุด/บางแชนแนล
เกิดเมื่อไร
ตอนคนแห่มารวมกัน, เป็นรอบสม่ำเสมอ
ผู้รับผิดชอบ
ผู้รับผิดชอบหลัก พัฒนาเซิร์ฟเวอร์ (ทีมพัฒนาเกม)
งานฝั่งทีมพัฒนาเกม
ตั้งค่า GC แบบ incremental หรือ generational, ให้ GC ทำงานทีละน้อยทุกทิก, ลดออบเจ็กต์ชั่วคราวในสคริปต์
ตัวเลขที่ควรรู้
เมื่อ heap ของสคริปต์โตถึงหลายร้อย MB การเก็บคืนรวดเดียว (เมื่อปิด incremental collection หรือเป็น full collection ในโหมด generational) อาจใช้เวลาหลายสิบถึงหลายร้อย ms
บนกราฟ
พุ่งเป็นรอบ · เวลาต่อทิกแยกตามโซน, หน่วยความจำของสคริปต์เอนจิน
จุดที่ต้องดู
บันทึกเวลาต่อทิกของแต่ละโซนและปริมาณหน่วยความจำของสคริปต์เอนจินในโซนนั้น (Lua ใช้ collectgarbage("count")) ทุกทิก แล้ววางซ้อนบนกราฟเดียวกัน
สัญญาณว่าใช่
จังหวะที่หน่วยความจำของสคริปต์ดิ่งลง (เก็บคืนรวดเดียว) ตรงกับจังหวะที่ทิกของโซนนั้นพุ่ง และโซนอื่นปกติดี
สัญญาณว่าไม่ใช่
ทิกพุ่งโดยหน่วยความจำของสคริปต์ไม่เปลี่ยน: น่าจะเป็นโหลดหรือล็อกของโซนนั้น ถ้าทุกโซนบนเซิร์ฟเวอร์พุ่งพร้อมกัน น่าจะเป็น GC ของเซิร์ฟเวอร์ (mem-gc) หรือสวอป (mem-swap)
วิธีตรวจ
ต้องมี log หรือเมตริกจากเซิร์ฟเวอร์/ไคลเอนต์เกม

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

  1. Lua 5.4 Reference Manual Lua.org
    โหมด incremental แบ่งการเก็บคืนเป็นขั้นเล็ก ๆ แทรกระหว่างการรันโปรแกรม (ถ้าตั้งขั้นใหญ่จะกลายเป็น stop-the-world), major collection ในโหมด generational เป็น stop-the-world ที่ไล่ทุกออบเจ็กต์, collectgarbage("count") คือปริมาณหน่วยความจำทั้งหมดที่ Lua ใช้ (KB)

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

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

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

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