8 คะแนน โดย GN⁺ 2025-03-11 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • Strobelight คือ orchestrator สำหรับการทำ profiling ของ Meta ที่ผสานเทคโนโลยีโอเพนซอร์สหลายตัวเข้าด้วยกัน เพื่อช่วยให้วิศวกรปรับปรุงประสิทธิภาพและการใช้ทรัพยากรได้ดีขึ้น
    • หลังนำมาใช้ สามารถลดความต้องการความจุรายปีได้เทียบเท่ากับ เซิร์ฟเวอร์ประมาณ 15,000 เครื่อง

Strobelight ทำงานอย่างไร

  • Strobelight ไม่ใช่ profiler ตัวเดียว แต่เป็น orchestrator ที่คอยประสาน profiler หลายตัว
  • ทำงานอยู่บนโฮสต์ production ทั้งหมดของ Meta และเก็บตัวชี้วัดด้านประสิทธิภาพดังต่อไปนี้
    • การใช้ CPU
    • การจัดสรรหน่วยความจำ
    • เมตริกด้านประสิทธิภาพอื่น ๆ
  • วิศวกรสามารถใช้ข้อมูลนี้เพื่อตรวจหาคอขวดด้านประสิทธิภาพและปัญหาการใช้ทรัพยากรสิ้นเปลือง พร้อมนำไปสู่การปรับแต่งโค้ดได้

บทบาทและความจำเป็นของ profiler

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

profiler หลากหลายแบบใน Strobelight

  • Strobelight มี profiler รวมทั้งหมด 42 ตัว
    • memory profiler บนพื้นฐาน jemalloc
    • profiler สำหรับจำนวนครั้งที่มีการเรียกฟังก์ชัน
    • profiler แบบ event-based ตามภาษา เช่น Python, Java, Erlang
    • profiler สำหรับ AI/GPU
    • profiler สำหรับติดตามเวลา off-CPU
    • profiler สำหรับติดตาม latency ของ service request
  • เครื่องมือ profiling สามารถรันได้จากเครื่องมือบรรทัดคำสั่งหรือเว็บ UI
  • สามารถตั้งค่าได้ทั้ง continuous profiling และ profiling แบบ trigger ตามเงื่อนไขเฉพาะ

รองรับ ad-hoc profiler

  • หากวิศวกรต้องการเพิ่ม profiler ใหม่ เดิมทีจำเป็นต้องแก้หลายส่วนของโค้ดและต้อง deploy
  • สามารถเขียนสคริปต์ bpftrace เพื่อเพิ่ม profiler ได้อย่างรวดเร็ว
  • ช่วยให้วิศวกรติดตามและวิเคราะห์ปัญหาประสิทธิภาพของฟังก์ชันเฉพาะจุดได้อย่างรวดเร็ว

ป้องกันการชนกันระหว่าง profiler

  • Strobelight มีระบบในตัวสำหรับป้องกันการแย่งใช้ทรัพยากรระหว่าง profiler
  • มีการบังคับใช้กติกา เช่น ระหว่างติดตาม CPU cycle จะไม่อนุญาตให้ใช้ PMU counter อื่น
  • ลดการชนกันของทรัพยากรด้วยระบบจัดการการรันพร้อมกันและคิวรอ

profiling อัตโนมัติและ dynamic sampling

  • Strobelight รัน profiling โดยอัตโนมัติในทุกบริการของ Meta
  • ปรับความถี่และระยะเวลาของการสุ่มตัวอย่างโดยอัตโนมัติตาม workload ของแต่ละบริการ
  • ปรับแก้ความน่าจะเป็นในการสุ่มตัวอย่างและความถี่การเก็บข้อมูลโดยอัตโนมัติ เพื่อให้ได้ข้อมูลที่สม่ำเสมอ

ตัวอย่างการปรับแต่งประสิทธิภาพและลดความจุที่ต้องใช้

LBR profiler

  • รองรับการสุ่มตัวอย่าง Last Branch Record (LBR) ซึ่งเป็นความสามารถด้านฮาร์ดแวร์ของ Intel
  • ใช้ใน FDO (Feedback Directed Optimization) เพื่อเพิ่มประสิทธิภาพของไบนารี
  • ใน 200 บริการอันดับต้น ๆ ของ Meta ช่วยลดการใช้ CPU cycle ได้สูงสุด 20%

event profiler

  • ทำงานคล้ายกับเครื่องมือ perf ของ Linux
  • สุ่มตัวอย่างและแสดงผล performance event เช่น CPU cycle, L3 cache miss เป็นต้น
  • ช่วยตรวจพบและแก้ไขปัญหาที่เกิดบนเส้นทางการทำงานของโค้ดได้ล่วงหน้า

Stack Schemas และ Strobemeta

Stack Schemas

  • เพิ่มแท็กลงใน call stack เพื่อให้มองเห็นข้อมูลได้ชัดเจนขึ้น
  • สามารถตัดฟังก์ชันที่ไม่จำเป็นออกจากการกรองและการแสดงผลได้

Strobemeta

  • เพิ่ม metadata แบบไดนามิกลงใน call stack ระหว่าง runtime
  • ให้รายละเอียดที่เกี่ยวข้องกับ service endpoint, latency และข้อมูลอื่น ๆ

การทำ symbolization

  • แปลง virtual address ของไบนารีให้เป็นชื่อฟังก์ชันและข้อมูลซอร์สโค้ด
  • อาศัยเทคโนโลยีโอเพนซอร์ส เช่น DWARF, ELF, gsym, blazesym
  • ทำขั้นตอน symbolization หลัง profiling เสร็จ เพื่อลดผลกระทบต่อประสิทธิภาพ

เครื่องมือแสดงผลข้อมูลของ Strobelight

Scuba

  • เครื่องมือ query และ visualization บนพื้นฐาน SQL
  • สำหรับข้อมูล profiling มีทั้ง time series, distribution, flame graph เป็นต้น

Tracery

  • เครื่องมือแสดงผลข้อมูล profiling แบบผสมผสานตามเวลา
  • สามารถรวมและแสดงผล service request span, CPU cycle และข้อมูล off-CPU ได้

กรณีศึกษา "Biggest Ampersand"

  • วิศวกรค้นพบปัญหาการคัดลอก std::vector ผ่านข้อมูลของ Strobelight
  • เพิ่ม & หลังคีย์เวิร์ด auto → ป้องกันการคัดลอกที่ไม่จำเป็น
  • ผลลัพธ์คือช่วยลดการใช้ทรัพยากรได้เทียบเท่ากับ เซิร์ฟเวอร์ราว 15,000 เครื่องต่อปี

โอเพนซอร์ส

1 ความคิดเห็น

 
GN⁺ 2025-03-11
ความคิดเห็นจาก Hacker News
  • แนะนำ Pyroscope ของ Grafana สำหรับ continuous profiling ใช้งานอยู่กับ Go และทำงานได้ดี
    • รองรับหลายภาษาและใช้ eBPF
  • โค้ด C++ ของ Meta/FB อ่านง่ายกว่าโค้ดของบริษัทเทคขนาดใหญ่เก่าแก่อื่น ๆ
  • Strobelight เป็นเหมือนเส้นชีวิตที่ช่วยให้มองเห็นได้ง่ายว่าอะไรคุ้มค่าที่จะปรับแต่ง โดยเฉพาะในบริการที่มี qps สูง
  • ไบนารี user space ของ Meta มี frame pointer รวมอยู่ด้วย จึงทำให้สามารถไล่ดู stack ได้
    • ไม่เช่นนั้นก็คงต้องใช้วิธีที่ซับซ้อนและไม่มีประสิทธิภาพ
  • มีการอ้างว่ามี event profiler สำหรับภาษาที่ไม่ใช่ native (เช่น Python)
    • แต่ยังไม่ชัดเจนว่าอ่านสถานะของ Python อย่างไร
  • รีโพซิทอรี GitHub ของ Strobelight ยังอยู่ในระดับพื้นฐาน เลยสงสัยว่าจะอัปเดตเมื่อไร
  • ชื่อดูเหมือนจะอ้างถึงการใช้ strobe เพื่อตรวจสอบการเคลื่อนไหวแบบเป็นคาบความเร็วสูง
  • อยากให้โปรเจ็กต์โอเพนซอร์สถูกบูรณาการแบบนี้บ้าง
    • UI ภายในของ Facebook ดูโอเค
  • การทำโมเดลต้นทุนการคำนวณเป็นเรื่องยาก
    • ถ้านำ fluid dynamics มาปรับใช้กับความต้องการด้านการคำนวณก็น่าจะน่าสนุก
  • คิดว่าคู่แข่งรายใหญ่ของ AWS/Azure/GCP กำลังลำบากเพราะขาดเครื่องมือแบบนี้
    • ที่ Microsoft เคยสร้างเครื่องมือติดตาม network traffic และมีประโยชน์มากในการดีบัก
    • มองทุกอย่างของ Meta ด้วยความสงสัยไว้ก่อน
  • นี่คือ performance profiling
    • เห็นจากชื่อกับโดเมนแล้วนึกว่าเป็นการ profiling ผู้ใช้
  • กำลังพยายามทำให้ Strobelight เข้าถึงทุกคนผ่าน Parca และ Polar Signals
    • บางส่วนมีอยู่แล้ว และจะมีออกมาเพิ่มอีกภายในปีนี้