CPU的親和性,進程要在某個給定的 CPU 上盡量長時間地運行而不被遷移到其他處理器的傾向性,進程遷移的頻率小就意味著產(chǎn)生的負載小。親和性一詞是從affinity翻譯來的,實際可以稱為CPU綁定。
在多核運行的機器上,每個CPU本身自己會有緩存,在緩存中存著進程使用的數(shù)據(jù),而沒有綁定CPU的話,進程可能會被操作系統(tǒng)調度到其他CPU上,如此CPU cache(高速緩沖存儲器)命中率就低了,也就是說調到的CPU緩存區(qū)沒有這類數(shù)據(jù),要先把內存或硬盤的數(shù)據(jù)載入緩存。而當緩存區(qū)綁定CPU后,程序就會一直在指定的CPU執(zhí)行,不會被操作系統(tǒng)調度到其他CPU,性能上會有一定的提高。
另外一種使用CPU綁定考慮的是將關鍵的進程隔離開,對于部分實時進程調度優(yōu)先級提高,可以將其綁定到一個指定CPU核上,可以保證實時進程的調度,也可以避免其他CPU上進程被該實時進程干擾。
我們可以手動地為其分配CPU核,而不會過多的占用同一個CPU,所以設置CPU親和性可以使某些程序提高性能。
Linux操作系統(tǒng)的CPU親和性特征
—————————————
操作系統(tǒng)部分Linux的調度程序同時提供”軟CPU親和性”和”硬CPU親和性”。
● 軟親和性
進程要在指定的 CPU 上盡量長時間地運行而不被遷移到其他CPU。Linux 內核進程調度器天生就具有被稱為軟CPU親和性(Affinity)的特性,因此Linux通過這種軟的親和性試圖使某進程盡可能在同一個CPU上運行。
● 硬親和性
進程或者線程綁定到某一個指定的cpu核運行,雖然Linux盡力通過一種軟的親和性試圖使進程盡量在同一個處理器上運行,但它也允許用戶強制指定進程無論如何都必須在指定的處理器上運行。
硬性親和性使用場景
硬親和性場景一般發(fā)生在需要保持高CPU緩存命中率時和需要測試復雜的應用程序時。
● 保持高CPU緩存命中率
如果一個給定的進程遷移到其他地方去了,那么它就失去了利用 CPU 緩存的優(yōu)勢。實際上,如果正在使用的 CPU 需要為自己緩存一些特殊的數(shù)據(jù),那么所有其他 CPU 都會使這些數(shù)據(jù)在自己的緩存中失效。因此,如果有多個線程都需要相同的數(shù)據(jù),那么將這些線程綁定到一個特定的 CPU 上是非常有意義的,這樣就確保它們可以訪問相同的緩存數(shù)據(jù)(或者至少可以提高緩存的命中率)。否則,這些線程可能會在不同的 CPU 上執(zhí)行,這樣會頻繁地使其他緩存項失效。
● 測試復雜的應用程序
考慮一個需要進行線性可伸縮性測試的應用程序。有些產(chǎn)品聲明可以在使用更多硬件時執(zhí)行得更好。我們不用購買多臺機器(為每種處理器配置都購買一臺機器),而是可以采取以下方式:
1.購買一臺多處理器的機器;
2.不斷增加分配的處理器;
3.測量每秒的事務數(shù);
4.評估結果的可伸縮性。
在Linux操作系統(tǒng)中修改CPU親和性的手段
—————————————————
在Linux內核中,所有的進程都有一個相關的數(shù)據(jù)結構,稱為task_struct。這個結構非常重要,其中與親和性(affinity)相關度最高的是cpus_allowed 位掩碼。這個位掩碼由n位組成,與系統(tǒng)中的n個邏輯處理器對應。具有4個物理CPU的系統(tǒng)可以有4 位。如果這些CPU都啟用了超線程,那么這個系統(tǒng)就有8個位掩碼。 如果為給定的進程設置了給定的位,那么這個進程就可以在相關的 CPU 上運行。因此,如果一個進程可以在任何 CPU 上運行,并且能夠根據(jù)需要在處理器之間進行遷移,那么位掩碼就全是1。這是 Linux 中進程的預設狀態(tài)。
Linux 內核 API 提供了一些方法,讓用戶可以修改位掩碼或查看當前的位掩碼,控制和綁定進程在特定的CPU:
sched_set_affinity()(用來修改位掩碼)
sched_get_affinity()(用來查看當前的位掩碼)
cpus_allowed(用于控制進程可以在哪里處理器上運行)
sched_setaffinity(用于某個進程綁定到一個特定的CPU)
小知識
——
● 物理CPU
機器上實際安裝的CPU個數(shù),比如說你的主板上安裝了一塊8核CPU,那么物理CPU個數(shù)就是1個,所以物理CPU個數(shù)就是主板上安裝的CPU個數(shù)。
● 邏輯CPU
一般情況,我們認為一顆CPU可以有多個核,加上Intel的超線程技術(HT), 可以在邏輯上再分一倍數(shù)量的CPU core出來。
● 超線程技術(Hyper-Threading)
就是利用特殊的硬件指令,把單個物理CPU模擬成兩個CPU(邏輯CPU),實現(xiàn)多線程。我們常聽到的雙核四線程/四核八線程指的就是支持超線程技術的CPU。