Linux CPU 親和性

軟親和性意味着進程並不會在處理器之間頻繁遷移,而硬親和性則意味着進程需要在您指定的處理器上運行。


Linux調度程序同時提供軟硬CPU親和性機制。雖然它盡力通過一種軟的親和性試圖使進程儘量在同一個處理器上運行,但它也允許用戶強制指定“這個進程無論如何都必須在這些處理器上運行。”這種硬CPU親和性保存在進程task_struct的cpus_allowed這個位掩碼標誌中。該掩碼標誌的每一位對應一個系統可用的處理器。默認情況下,所有的位都被設置,進程可以在系統中所有可用的處理器上執行。用戶可以通過sched_setaffinity()設置一個不同的一個或幾個位組合的位掩碼。而調用sched_getaffinity()則返回當前的cpus_allowed位掩碼。

使用硬親和性的3個原因

1、有大量計算要做
基於大量計算的情形通常出現在科學和理論計算中,但是通用領域的計算也可能出現這種情況。一個常見的標誌是您發現自己的應用程序要在多處理器的機器上花費大量的計算時間。這時就可以通過sched_setaffinity()設置cpus_allowed位掩碼,使該計算進程在多個處理器上執行。


2、保持高CPU緩存命中率
如果一個給定的進程遷移到其他地方去了,那麼它就失去了利用 CPU 緩存的優勢。實際上,如果正在使用的 CPU 需要爲自己緩存一些特殊的數據,那麼所有其他 CPU 都會使這些數據在自己的緩存中失效。

因此,如果有多個線程都需要相同的數據,那麼將這些線程綁定到一個特定的 CPU 上是非常有意義的,這樣就確保它們可以訪問相同的緩存數據(或者至少可以提高緩存的命中率)。否則,這些線程可能會在不同的 CPU 上執行,這樣會頻繁地使其他緩存項失效。

3、實時進程的需要
例如,您可能會希望使用硬親和性來指定一個8路主機上的某個處理器專門來處理實時進程的調度,而同時允許其他7個處理器處理所有普通進程的調度。這種做法確保對時間敏感的應用程序可以得到運行,同時可以允許其他長時間運行的應用程序獨佔其餘的計算資源。


Linux內核提供的硬CPU親和性的方怯很簡單


首先,當進程第一次創建時,它繼承了其父進程的相關掩碼。由於父進程運行在指定處理器上,子進程也運行在相應處理器上。

其次,當處理器綁定關係改變時,內核會採用“移植線程”把任務推到合適的處理器上。

最後,加載平衡器只把任務拉到允許的處理器上(當然是由該進程描述符的cpus_allowed域設置的)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章