• หลังปรับใช้เลเยอร์แคชใหม่ เวลาแฝงเฉลี่ยแย่ลงจาก 112ms เป็น 122ms แต่ค่ามัธยฐานดีขึ้นจาก 99ms เป็น 54ms และ p99 แย่ลงจาก 309ms เป็น 678ms ทำให้ ตัดสินความสำเร็จหรือล้มเหลวจากค่าสถิติเพียงค่าเดียวได้ยาก
  • หลังการปรับใช้ การกระจายของเวลาแฝงแยกจากยอดเดียวเป็นสองยอด และเมื่อซ้อน ฟังก์ชันการแจกแจงสะสม (CDF) กัน จะเห็นว่าประมาณ 140ms เป็นเส้นแบ่ง โดยคำขอที่เร็วดีขึ้น ส่วนคำขอที่ช้าแย่ลง
  • ฟังก์ชันการเลื่อน (shift function) ที่แสดงปริมาณการเปลี่ยนแปลงตามเปอร์เซ็นไทล์ รวมถึงกราฟ ridgeline และ heatmap รายวัน เผยให้เห็นขนาดของการปรับปรุงและการถดถอย ตลอดจนกระบวนการที่กลุ่มคำขอช้าขยายตัวระหว่างที่สัดส่วนการปรับใช้เพิ่มจาก 0% เป็น 100%
  • เมื่อแบ่งข้อมูลตามผลลัพธ์ของแคชและขนาดการตอบกลับ พบว่า cache hit ของการตอบกลับขนาดเล็กเร็วขึ้น ส่วน cache miss ของการตอบกลับขนาดใหญ่ช้าลงเพราะมี hop เพิ่มเติม จึงยืนยันสาเหตุที่ทำให้เกิดการกระจายแบบสองยอดได้
  • หากเลือกดูเฉพาะค่าเฉลี่ยหรือเปอร์เซ็นไทล์ใดเปอร์เซ็นไทล์หนึ่ง ก็สามารถหาเหตุผลสนับสนุนข้อสรุปที่ตรงข้ามกันได้ ดังนั้นต้องดู การกระจายทั้งหมดและกลุ่มย่อย ควบคู่กัน จึงจะนำไปสู่มาตรการอย่างการเพิ่มขนาดวัตถุสูงสุดในแคชหรือการแบ่งการตอบกลับขนาดใหญ่ได้

การปรับปรุงประสิทธิภาพที่มองไม่เห็นในโปรดักชัน

  • การปรับปรุงประสิทธิภาพเกี่ยวกับ lld ปรากฏใน benchmark แต่ในแดชบอร์ดโปรดักชันจริงกลับหาการเปลี่ยนแปลงที่ชัดเจนได้ยากเพราะสัญญาณรบกวนในข้อมูล
  • ความเร็วในการ build อาจแตกต่างกันมากตามตัวแปรหลายอย่าง เช่น cold cache, incremental build, การรันแบบ local/remote, สภาพระบบ และ workload
  • จากกรณีที่ใช้ฟังก์ชันการแจกแจงสะสม (CDF) ประเมินประสิทธิภาพการ build ทำให้เห็นความจำเป็นที่จะต้องดูตัวข้อมูลเองหลายวิธี แทนที่จะพึ่งภาพหรือค่าสถิติเพียงอย่างเดียว
  • ตัวอย่างทั้งหมดสร้างจาก ชุดข้อมูลสังเคราะห์ ชุดเดียวที่ใช้ seed คงที่ และ สคริปต์ทั้งหมด มี nix-shell shebang เพื่อให้สามารถสร้างภาพแต่ละภาพซ้ำได้เหมือนเดิมในสภาพแวดล้อม Nix
  • มีการใช้ AI ในการสร้างข้อมูลและแผนภูมิสำหรับเล่าเรื่อง

การปรับใช้แคชที่ดูเหมือนล้มเหลวเมื่อดูจากค่าเฉลี่ย

  • มีการปรับใช้เลเยอร์แคชใหม่เป็นเวลาหนึ่งสัปดาห์เพื่อลดเวลาแฝงของคำขอในเว็บเซอร์วิส แต่เวลาแฝงเฉลี่ยเพิ่มขึ้น 9% จาก 112ms เป็น 122ms
  • หากดูเฉพาะค่าเฉลี่ย ก็อาจตัดสินได้ง่ายว่าเป็นการถดถอยที่ควรถอนการเปลี่ยนแปลง เริ่มรับมือเหตุขัดข้อง และทำ postmortem

ข้อมูลชุดเดียวให้ข้อสรุปได้สี่แบบ

  • สถิติก่อนและหลังการปรับใช้ชี้ไปคนละทิศทาง
    • ค่าเฉลี่ย: 112ms → 122ms, แย่ลง 9%
    • ค่ามัธยฐาน p50: 99ms → 54ms, ดีขึ้น 46%
    • p95: 224ms → 454ms, แย่ลง 103%
    • p99: 309ms → 678ms, แย่ลง 119%
  • ค่าเฉลี่ยบ่งชี้การถดถอยเล็กน้อย แต่ค่ามัธยฐานบอกว่าคำขอทั่วไปเร็วขึ้นเกือบสองเท่า ขณะที่ p99 แสดงปัญหารุนแรงว่าคำขอที่แย่ที่สุดช้าลงมากกว่าสองเท่า
  • ค่าเฉลี่ยและค่ามัธยฐาน ที่คำนวณจากข้อมูลเดียวกันชี้ไปคนละทิศทาง จึงง่ายที่จะเลือกเฉพาะสถิติที่สนับสนุนการตัดสินของตนเอง

รูปทรงการกระจายเผยให้เห็นคำขอสองกลุ่ม

  • ในกราฟความหนาแน่น การกระจายก่อนปรับใช้มี ยอดเดียว แต่หลังปรับใช้แยกเป็นสองยอด
  • รูปทรงนี้ช่วยอธิบายความขัดแย้งระหว่างค่าสถิติ แต่กราฟความหนาแน่นก็มีข้อจำกัด
    • รูปทรงเปลี่ยนไปตาม พารามิเตอร์การทำให้เรียบ ที่เลือก
    • เมื่อพื้นที่ทึบของสองการกระจายซ้อนกัน จะอ่านยาก
    • เห็นการมีอยู่ของสองกลุ่ม แต่ระบุตำแหน่งเปอร์เซ็นไทล์อย่างค่ามัธยฐานได้ไม่ทันที

เปรียบเทียบเปอร์เซ็นไทล์ทั้งหมดด้วย CDF

  • ฟังก์ชันการแจกแจงสะสม (CDF) แสดง สัดส่วนของคำขอที่เสร็จภายใน x มิลลิวินาทีหรือน้อยกว่า สำหรับเวลาแฝงแต่ละค่า x
  • เมื่อซ้อน CDF ก่อนและหลังการปรับใช้ในแผนภูมิเดียว จะเห็นว่าแต่ละเปอร์เซ็นไทล์ขยับอย่างไรในกลุ่มคำขอทั้งหมด
  • หลังการปรับใช้ เส้นโค้งเลื่อนไปทางซ้ายในช่วงต่ำกว่า 140ms ทำให้มีคำขอมากขึ้นที่เร็วกว่าเดิม แต่หลัง 140ms กลับมีคำขอมากขึ้นที่ช้าลง
  • จุดที่เส้นโค้งสองเส้นตัดกันที่ประมาณ 140ms คือเส้นแบ่งที่ผลของการเปลี่ยนแปลงเปลี่ยนจากดีขึ้นเป็นแย่ลง
  • เมื่อ CDF สองเส้นตัดกัน ทิศทางของผลลัพธ์จะขึ้นอยู่กับเปอร์เซ็นไทล์ที่เลือก ดังนั้น ไม่มีเปอร์เซ็นไทล์เดี่ยวใดสรุปการเปลี่ยนแปลงทั้งหมดได้

วัดปริมาณการเปลี่ยนแปลงในแต่ละเปอร์เซ็นไทล์

  • CDF แสดงให้เห็นว่าแต่ละช่วงเร็วขึ้นหรือช้าลง แต่ไม่ได้แสดงปริมาณการเปลี่ยนแปลงโดยตรง
  • ฟังก์ชันการเลื่อน (shift function) คำนวณส่วนต่างระหว่างเวลาแฝงหลังปรับใช้กับก่อนปรับใช้ในแต่ละเปอร์เซ็นไทล์ p
    • ต่ำกว่า 0 คือช่วงที่ดีขึ้น
    • สูงกว่า 0 คือช่วงที่ช้าลง
  • วิธีนี้ทำให้เห็นทั้งทิศทางและ ขนาด ของการเปลี่ยนแปลงในแต่ละจุดของการกระจาย

การถดถอยที่เติบโตขึ้นระหว่างการปรับใช้

  • เลเยอร์แคชใหม่ถูกขยายแบบค่อยเป็นค่อยไปจาก 0% เป็น 100% ของทราฟฟิกตลอดหนึ่งสัปดาห์ และหากเทียบเพียงสองจุดเวลาก่อน-หลังการปรับใช้ ก็จะพลาดการเปลี่ยนแปลงระหว่างทาง
  • ใน กราฟ ridgeline ที่ซ้อนการกระจายรายวัน จะเห็นว่าเมื่อการปรับใช้ดำเนินไป ยอดหลักของคำขอที่เร็วเลื่อนไปทางซ้าย และยอดที่สองของคำขอที่ช้าปรากฏขึ้นทางขวา
  • ในขณะที่ค่ามัธยฐานลดลง จำนวนและเวลาแฝงของคำขอที่ช้ากลับค่อย ๆ เพิ่มขึ้นอย่างเงียบ ๆ
  • เวลาแฝงมีลักษณะใกล้เคียงการแจกแจงแบบ log-normal จึงใช้ สเกลลอการิทึม บนแกน x
    • หากใช้แกนเชิงเส้น ยอดของคำขอที่เร็วจะพุ่งสูง และคำขอที่ช้าจะกระจายจาง ๆ ทำให้อ่านสองยอดพร้อมกันได้ยาก
  • ใน heatmap ที่แสดงคอลัมน์รายวันและปริมาณทราฟฟิกตามเวลาแฝงด้วยสี ก็เห็นกลุ่มคำขอใหม่ปรากฏขึ้นอย่างจาง ๆ เช่นกัน
  • หากรวมทั้งสัปดาห์เป็นค่ารวมค่าเดียว การกระจายรายวันทั้งเจ็ดแบบและแนวโน้มการเปลี่ยนแปลงจะหายไป

แยกการกระจายสองยอดด้วย cache hit และ miss

  • ในการวิเคราะห์ lld จริง ต้องแบ่งข้อมูลตามขนาดไบนารี เช่น เกิน 50MiB หรือไม่ จึงจะเห็นการกระจายเวลาแฝงแบบสองยอดได้
  • ในกรณีสังเคราะห์ของเลเยอร์ใหม่ คำขอแบ่งออกเป็น hit ที่จัดการได้จากแคช และ miss ที่ส่งต่อไปยัง backend พร้อมผ่าน hop เพิ่มเติม
  • เมื่อแยก CDF ของคำขอหลังปรับใช้ตามผลลัพธ์ของแคช แต่ละกลุ่มกลับมามียอดเดียว
    • cache hit เลื่อนไปทางซ้ายจาก baseline เดิม จึงเร็วขึ้น
    • cache miss อยู่ทางขวากว่ามากเพราะต้นทุนของ hop เพิ่มเติม

สาเหตุและมาตรการที่พบจากขนาดการตอบกลับ

  • cache miss เป็นเพียงกลไกการทำงานเท่านั้น หากต้องการเข้าใจว่าคำขอใด miss และเพราะเหตุใด ต้องดู ขนาดการตอบกลับ ควบคู่กัน
  • แคชจะเก็บวัตถุที่เล็กและถูกใช้บ่อย แต่ object ขนาดใหญ่จะถูกขับออกหรือไม่สามารถเข้าแคชได้ตั้งแต่แรก
  • ใน jointplot ที่แยกความสัมพันธ์ระหว่างเวลาแฝงกับขนาดการตอบกลับด้วยสีของ cache hit/miss และรวมการกระจายความหนาแน่นของแต่ละแกน จะเห็นสองกลุ่มอย่างชัดเจน
    • กลุ่มการตอบกลับขนาดเล็กและเวลาแฝงต่ำคือ cache hit
    • กลุ่มการตอบกลับขนาดใหญ่และเวลาแฝงสูงคือ cache miss
  • การกระจายเวลาแฝงแบบสองยอดมีที่มาจากความเป็นสองยอดของการกระจายขนาดการตอบกลับ และสามารถรับมือได้ด้วยการ เพิ่มขนาดวัตถุสูงสุดของแคชหรือแบ่งการตอบกลับขนาดใหญ่

มองการกระจายทั้งหมดให้ไกลกว่ากราฟเดียว

  • แผงหรือกราฟเดียวไม่เพียงพอที่จะครอบคลุมสถานการณ์ทั้งหมด และในบางกรณีอาจนำไปสู่การตัดสินที่ผิดพลาด
  • ต้องดูข้อมูลเดียวกันด้วยหลายวิธี เพื่อเข้าใจรูปทรงของการกระจาย ผลกระทบตามเปอร์เซ็นไทล์ การเปลี่ยนแปลงตามเวลา กลุ่มย่อย และสาเหตุร่วมกัน
  • โดยเฉพาะ CDF มีประโยชน์ในการเปรียบเทียบกลุ่มคำขอหลายกลุ่มพร้อมบรรจุการกระจายทั้งหมดไว้ในแผนภูมิเดียว

ยังไม่มีความคิดเห็น

ยังไม่มีความคิดเห็น