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

คู่มือเกมแลค › L12 ฐานข้อมูล

cold cache (หลังรีสตาร์ตใหม่ ๆ) Cold buffer pool after restart

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

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

เมื่อรีสตาร์ต DB แคชในหน่วยความจำจะว่างเปล่า ช่วงหนึ่งข้อมูลทุกอย่างที่ดึงจึงต้องอ่านจากดิสก์

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

อาการ
เข้าเกมไม่ได้/โหลดไม่จบ, อินพุตดีเลย์
ปัจจัย
ความหน่วง
ใครเจอ
ทั้งเซิร์ฟเวอร์
เกิดเมื่อไร
หลังล็อกอิน/หลังปิดปรับปรุง
ผู้รับผิดชอบ
ผู้รับผิดชอบหลัก อินฟรา DB (ทีมอินฟรา) · ร่วมกับ พัฒนาเซิร์ฟเวอร์ (ทีมพัฒนาเกม)
งานฝั่งทีมพัฒนาเกม
เปิดให้เข้าแบบค่อยเป็นค่อยไป (ใช้คิวล็อกอินเพิ่มจำนวนคนที่ล็อกอินทีละขั้น)
งานฝั่งทีมอินฟรา
วอร์มแคชหลังรีสตาร์ต (warming, ตรวจการตั้งค่าบันทึกและกู้คืน buffer pool), DB ที่กู้มาจากสแนปช็อตให้อ่านดิสก์ล่วงหน้าด้วย
บนกราฟ
พุ่งทันทีหลังเปิดเซิร์ฟ/ปิดปรับปรุง · การอ่านดิสก์, อัตรา hit ของ buffer cache
จุดที่ต้องดู
MySQL ดูอัตราส่วนระหว่าง Innodb_buffer_pool_reads (จำนวนครั้งที่ไม่มีใน buffer pool จนต้องอ่านจากดิสก์) กับ Innodb_buffer_pool_read_requests และความคืบหน้าการวอร์ม Innodb_buffer_pool_load_status ส่วน PostgreSQL ดู blks_read และ blks_hit ใน pg_stat_database และดูจำนวนการอ่านดิสก์ของเซิร์ฟเวอร์ DB ประกอบ
สัญญาณว่าใช่
หลังรีสตาร์ตใหม่ ๆ การอ่านดิสก์พุ่งและอัตรา hit ต่ำ แล้วค่อย ๆ ฟื้นตามเวลา และช่วงนั้นล็อกอินและโหลดช้า
สัญญาณว่าไม่ใช่
อัตรา hit เท่าปกติแต่หลังปิดปรับปรุงยังช้า: น่าจะเป็นคนแห่ล็อกอินและ N+1 (db-login-storm) หรือ connection pool (db-pool)
วิธีตรวจ
ใช้เครื่องมือฝั่งอินฟรา (ไม่ต้องใช้โค้ดเกม)
รายละเอียดเพิ่มเติม
MySQL จะบันทึกรายการ page ใน buffer pool ตอนปิด แล้วอ่านกลับเข้ามาเบื้องหลังตอนเปิด แต่ต้องใช้เวลากว่าจะเต็ม ถ้ากู้ DB บนคลาวด์มาจากสแนปช็อต (สำเนาดิสก์) ตัวดิสก์เองก็ช้าในทุกบล็อกที่อ่านครั้งแรก อาการจึงนานขึ้นไปอีก
กรณีจริง
Roblox 2021: Roblox ล่ม 73 ชั่วโมง: การแย่งทรัพยากรในคลัสเตอร์ service discovery (Consul)

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

  1. Saving and Restoring the Buffer Pool State MySQL
    เพื่อลดเวลาวอร์มหลังรีสตาร์ต จะบันทึกรายการ page ที่ใช้ล่าสุด (ค่าเริ่มต้น 25%) ตอนปิดแล้วอ่านกลับตอนเปิด, ทั้งสองอย่างเปิดเป็นค่าเริ่มต้น
  2. pg_prewarm — preload relation data into buffer caches PostgreSQL
    บันทึกเนื้อหาของ shared buffer ไว้เป็นระยะแล้วโหลดกลับหลังรีสตาร์ต (autoprewarm)
  3. Initialize Amazon EBS volumes AWS
    volume ที่สร้างจากสแนปช็อตจะมีดีเลย์สูงขึ้นและประสิทธิภาพตกจนกว่าจะดึงครบทุกบล็อก
  4. Server Status Variables MySQL
    Innodb_buffer_pool_reads (จำนวน logical read ที่ไม่มีใน buffer pool จนต้องอ่านจากดิสก์โดยตรง), Innodb_buffer_pool_read_requests, Innodb_buffer_pool_load_status (ความคืบหน้าการวอร์ม)
  5. The Cumulative Statistics System (PostgreSQL Documentation) PostgreSQL
    blks_read (จำนวนบล็อกที่อ่านจากดิสก์) และ blks_hit (จำนวนบล็อกที่เจอใน buffer cache) ใน pg_stat_database

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

ชั้นเดียวกัน: L12 ฐานข้อมูล

สาเหตุจากชั้นอื่นที่ทำให้เกิดอาการเดียวกัน (เข้าเกมไม่ได้/โหลดไม่จบ)

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