處理器親和性(processor affinity)
當你在同一張書桌工作時,你的紙張、筆和筆記都在伸手可及之處;換到一張新書桌,你得把一切重新拿過來才能有產出。一顆 CPU 核心就像那張書桌,它的快取就是攤開好的工作空間。處理器親和性是排程器「偏好讓一個行程繼續在它先前跑過的同一顆核心上執行」的傾向,好讓它能重用已經暖在那顆核心快取裡的資料。
這個偏好為何存在:每顆核心有自己的快速快取,存著最近用過的資料與指令。一個行程執行時會用它的工作集暖好那個快取。若排程器接著把該行程移到另一顆核心,新核心的快取對它而言是「冷」的——它必須從較慢的記憶體重新載入一切,而舊核心快取裡存著那些資料則被浪費(或必須失效)。所以遷移一個行程有真實的隱藏成本,而親和性就是「在合理時避免那個成本」的政策。親和性有兩種強度:軟親和性是作業系統可為平衡負載而推翻的盡力偏好,而硬親和性讓程式把自己釘在特定核心上、拒絕移動。
為什麼重要與張力:親和性藉由提高快取命中率而直接改善效能,對記憶體密集的工作負載尤其如此,它也與硬體佈局互動(在 NUMA 系統中,核心存取它本地的記憶體較快,這讓親和性更加重要)。但親和性與負載平衡相拉扯:把每個行程都黏在它的「家」核心上,可能讓一顆核心過載而另一顆閒置。真實排程器把親和性當作強烈的提示、而非絕對規則,只在不平衡嚴重到值得付快取成本時才遷移。
一個資料庫執行緒在核心 2 上執行,用索引頁填滿它的快取。若排程器把它留在那裡(親和性),它下一段爆發會命中暖快取、跑得快。若負載平衡改把它移到閒置的核心 5,它會以冷快取開始,最初的數千次存取都得跑去慢記憶體,直到它再次暖起來。
親和性讓行程留在它的暖快取附近;遷移它則要付一筆冷快取的代價。
親和性是效能上的啟發法,而非正確性的要求——行程在任何核心上都能正確執行。用硬親和性釘住可能因阻止負載平衡而適得其反,所以只在你測量出真實的快取好處時才用它。