Processor Affinity การกำหนดค่าให้โปรเซสทำงานบน CPU ของตนเอง
สรุปใจความสำคัญ
- Processor Affinity ช่วยลด Cache Misses โดยการให้โปรเซสทำงานบน CPU คอร์เดิม
- Affinity Mask เป็นบิตแมสก์ที่ใช้ระบุคอร์ของ CPU ที่โปรเซสสามารถทำงานได้
- ในระบบ NUMA การกำหนด Processor Affinity ช่วยลดความหน่วงในการเข้าถึงหน่วยความจำข้ามโหนด
ในทางวิทยาการคอมพิวเตอร์ Processor Affinity (หรือที่เรียกว่า CPU Pinning หรือ Cache Affinity) คือความสามารถในการผูกมัด (binding) และยกเลิกการผูกมัดของโปรเซส (process) หรือเธรด (thread) ให้ทำงานบนหน่วยประมวลผลกลาง (CPU) หรือกลุ่มของ CPU ที่กำหนดไว้ เพื่อให้โปรเซสหรือเธรดนั้นทำงานบน CPU ที่ระบุเท่านั้น แทนที่จะปล่อยให้ระบบปฏิบัติการเลือก CPU ตัวใดตัวหนึ่งตามความเหมาะสม
การทำงานของ Processor Affinity
การกำหนดค่านี้เปรียบเสมือนการปรับปรุงอัลกอริทึมการจัดตารางเวลา (scheduling algorithm) ของระบบปฏิบัติการแบบ Symmetric Multiprocessing (SMP) โดยปกติแล้ว ระบบปฏิบัติการจะใช้คิวกลาง (central queue) และนำงานให้ CPU ทุกตัวในระบบทำงาน โดยที่แต่ละงานในคิวจะมีแท็กระบุว่าควรทำงานบน CPU ตัวใดเป็นพิเศษ หากมีการจัดสรรทรัพยากร งานนั้นจะถูกส่งไปยัง CPU ที่ระบุไว้ก่อนเป็นอันดับแรก
การปรับเปลี่ยนตามประสิทธิภาพ
การนำ Processor Affinity มาใช้ในแต่ละระบบปฏิบัติการอาจแตกต่างกัน โดยในบางกรณี ระบบปฏิบัติการอาจอนุญาตให้งานย้ายไปทำงานบน CPU ตัวอื่นหากการทำเช่นนั้นจะช่วยให้ระบบโดยรวมมีประสิทธิภาพสูงขึ้น ตัวอย่างเช่น หากมีงานที่ใช้ CPU เข้มข้น (CPU-intensive tasks) สองงาน (A และ B) ที่ถูกกำหนดให้ทำงานบน CPU ตัวเดียว ในขณะที่ CPU ตัวอื่นว่างอยู่ ระบบจัดตารางเวลาอาจย้ายงาน B ไปยัง CPU ตัวที่สองเพื่อเพิ่มประสิทธิภาพการใช้งาน CPU ให้สูงสุด ซึ่งในกรณีนี้ งาน B จะสร้างความสัมพันธ์ (affinity) กับ CPU ตัวที่สองแทน
Affinity Mask
ในระบบปฏิบัติการส่วนใหญ่ ชุดของโปรเซสเซอร์ที่โปรเซสหรือเธรดได้รับอนุญาต (หรือถูกกำหนดให้) ทำงานบนนั้นจะถูกระบุด้วย Affinity Mask ซึ่งเป็นบิตแมสก์ (bit mask) ที่สอดคล้องกับจำนวนคอร์ของระบบเซกชัน>
วัตถุประสงค์ของการใช้ Processor Affinity
มีเหตุผลหลายประการที่ทำให้ Processor Affinity มีประโยชน์ในการเพิ่มประสิทธิภาพการทำงานของคอมพิวเตอร์ ดังนี้:
1. ความเป็นท้องถิ่นของแคชและหน่วยความจำ (Locality of Cache and Memory)
การทำงานของเธรดอาจถูกขัดจังหวะโดยตัวจัดตารางเวลาของ OS เพื่อให้โปรแกรมอื่นทำงานแทน หากเธรดนั้นถูกส่งกลับมาทำงานบน CPU ตัวเดิมที่เคยทำงานอยู่ อาจมีข้อมูลที่ยังคงค้างอยู่ใน CPU Cache ซึ่งสามารถนำกลับมาใช้ซ้ำได้ ทำให้เกิด cache misses น้อยลง และเพิ่มความเร็วในการประมวลผล
การตั้งค่า Processor Affinity จะช่วยให้มั่นใจว่าเธรดจะทำงานบน CPU ตัวเดิมเสมอ แต่ในขณะเดียวกันก็อาจทำให้เธรดนั้นต้องรอจนกว่า CPU ตัวนั้นจะว่าง ซึ่งฟีเจอร์นี้จะมีประโยชน์อย่างยิ่งสำหรับโปรเซสที่ใช้ CPU เข้มข้นและมีการขัดจังหวะน้อย การนำไปใช้กับโปรแกรมทั่วไปที่ถูกขัดจังหวะบ่อยครั้งอาจทำให้เครื่องช้าลงเนื่องจากต้องรอ CPU ตัวที่กำหนดไว้
2. Simultaneous Multi-Threading (SMT)
ใน CPU ที่มีเทคโนโลยี SMT (หรือที่รู้จักกันในชื่อ Hyper-Threading ของ Intel) คอร์ทางกายภาพหนึ่งคอร์จะมี "เธรด" (โปรเซสเซอร์ทางตรรกะ หรือ Virtual Cores) สองตัวหรือมากกว่า ซึ่งเธรดเหล่านี้จะใช้ L1 และ L2 แคชร่วมกัน ดังนั้น ในแง่ของความสัมพันธ์กับแคช (affinity for locality) เธรดที่ทำงานบน Virtual Cores ของคอร์เดียวกันจะถือว่าเหมือนกัน
3. Non-Uniform Memory Access (NUMA)
ในระบบ NUMA ปัญหาเรื่องความหน่วง (latency) ความหน่วงนี้ไม่ได้เกิดจาก L1/L2 cache misses แต่เกิดจาก L3 misses และการเข้าถึงหน่วยความจำข้ามโหนด (cross-node memory access) การจำกัดให้เธรดทั้งหมดของโปรแกรมทำงานบนโหนด NUMA เดียวกัน (หรืออย่างน้อยที่สุดคือบน CPU socket เดียวกัน) จะช่วยให้เธรดเหล่านั้นสามารถใช้ L3 แคชร่วมกันได้ และอาจต้องมีการกำหนดค่าเพิ่มเติมเพื่อให้หน่วยความจำถูกจัดสรรจากโหนด NUMA ท้องถิ่น
คำถามที่พบบ่อย
Processor Affinity คืออะไร?
คือการผูกมัดโปรเซสหรือเธรดให้ทำงานบน CPU คอร์ที่กำหนดไว้ แทนที่จะให้ระบบปฏิบัติการเลือกคอร์ให้โดยอัตโนมัติ
ข้อดีของการใช้ Processor Affinity คืออะไร?
ช่วยเพิ่มประสิทธิภาพการประมวลผลโดยการใช้ข้อมูลที่ยังคงค้างอยู่ใน CPU Cache (Cache Locality) และลดการย้ายงานระหว่างคอร์
Processor Affinity มีประโยชน์ต่อระบบ NUMA อย่างไร?
ช่วยให้เธรดของโปรแกรมสามารถใช้ L3 แคชร่วมกันและลดความหน่วงที่เกิดจากการเข้าถึงหน่วยความจำข้ามโหนด (cross-node memory access)
