- บทความนี้กล่าวถึงข้อถกเถียงในชุมชน Rust เกี่ยวกับการใช้งานตัวดำเนินการแบบหลายเธรด ซึ่งเป็น async runtime ที่ทำ work-stealing เพื่อกระจายงานอย่างสมดุล
- ผู้ใช้ Rust บางส่วนเสนอแนวทางสถาปัตยกรรมทางเลือกที่เรียกว่า "thread-per-core" โดยให้เหตุผลว่าน่าจะให้ประสิทธิภาพดีกว่าและติดตั้งใช้งานได้ง่ายกว่า
- คำว่า "thread-per-core" อาจทำให้เข้าใจผิดได้ เพราะตัวดำเนินการแบบหลายเธรดทุกตัวก็เป็น thread-per-core อยู่แล้ว โดยสร้าง OS thread หนึ่งตัวต่อหนึ่งคอร์ และจัดตารางงานบนเธรดเหล่านั้น
- Thread-per-core เป็นการผสาน 3 แนวคิดเข้าด้วยกัน: การจัดการ concurrency ใน user space, ทำให้ I/O เป็น asynchronous เพื่อหลีกเลี่ยงการบล็อกเธรด, และแบ่งข้อมูลตาม CPU core เพื่อตัดต้นทุนการ synchronization และการย้ายข้อมูลระหว่าง CPU cache
- ข้อถกเถียงนี้มุ่งไปที่ประเด็นที่สามเป็นหลัก และการใช้ async Rust ก็สามารถตอบโจทย์สองข้อแรกได้
- ในสถาปัตยกรรม thread-per-core สามารถทำ optimization ได้สองแบบ: ขโมยงานระหว่างเธรด และแชร์สถานะให้น้อยที่สุดเท่าที่ทำได้
- Work-stealing ช่วยให้ทุกเธรดมีงานทำอยู่เสมอ จึงช่วยปรับปรุง tail latency แต่ทำได้ยากในการติดตั้งใช้งาน และอาจทำให้เกิดต้นทุนจากการ synchronization กับ cache miss
- Share-nothing ช่วยปรับปรุง tail latency โดยคงข้อมูลไว้ใน cache ที่เร็วกว่าและเป็นของ CPU core เดียว แต่ก็อาจติดตั้งใช้งานได้ยากสำหรับแอปพลิเคชันที่ซับซ้อนซึ่งต้องเปลี่ยนสถานะในหลายพาร์ทิชัน
- บทความนี้เสนอว่าในระบบที่ใช้ shared state นั้น work-stealing อาจช่วยเพิ่มการใช้ CPU ภายใต้โหลดได้
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
Send + Sync + 'staticและบางคนมองว่านี่เป็นภาระasyncก็ถูกมองว่าเป็นการเพิ่มประสิทธิภาพก่อนเวลาอันควรสำหรับโปรแกรม Rust จำนวนมาก