- 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 ความคิดเห็น
ความคิดเห็นจาก Hacker News