標籤:自己的 命中率 機制 大量 tps 主機 elf sel 並且
將進程與cpu綁定,最直觀的好處就是減少cpu之間的cache同步和切換,提高了cpu cache的命中率,提高代碼的效率。
從cpu架構上,NUMA擁有獨立的本地記憶體,節點之間可以通過互換模組做串連和資訊互動,因此每個CPU可以訪問整個系統的記憶體,但是訪問遠地記憶體訪問效率大大降低,綁定cpu操作對此類系統運行速度會有較大提升,UMA架構下,多cpu通過系統匯流排訪問儲存模組。不難看出,NUMA使用cpu綁定時,每個核心可以更專註地處理一件事情,資源體系被充分使用,減少了同步的損耗。
簡單地說,CPU 親和性(affinity)就是進程要在某個給定的 CPU 上盡量長時間地運行而不被遷移到其他處理器的傾向性。
軟親和性(affinity): 就是進程要在指定的 CPU 上盡量長時間地運行而不被遷移到其他處理器,Linux 核心進程調度器天生就具有被稱為 軟 CPU 親和性(affinity) 的特性,這意味著進程通常不會在處理器之間頻繁遷移。這種狀態正是我們希望的,因為進程遷移的頻率小就意味著產生的負載小。
2.6 版本的 Linux 核心還包含了一種機制,它讓開發人員可以編程實現硬 CPU 親和性(affinity)。這意味著應用程式可以顯式地指定進程在哪個(或哪些)處理器上運行。
硬親和性(affinity):簡單來說就是利用linux核心提供給使用者的API,強行將進程或者線程綁定到某一個指定的cpu核運行。
在 Linux 核心中,所有的進程都有一個相關的資料結構,稱為 task_struct 。這個結構非常重要,原因有很多;其中與 親和性(affinity)相關度最高的是cpus_allowed 位元遮罩。這個位元遮罩由n位組成,與系統中的n個邏輯處理器一一對應。 具有 4 個物理 CPU 的系統可以有 4 位。如果這些 CPU 都啟用了超執行緒,那麼這個系統就有一個 8 位的位元遮罩。
如果為給定的進程設定了給定的位,那麼這個進程就可以在相關的 CPU 上運行。因此,如果一個進程可以在任何 CPU 上運行,並且能夠根據需要在處理器之間進行遷移,那麼位元遮罩就全是 1。實際上,這就是 Linux 中進程的預設狀態。
一般情況下,在應用程式中只需使用預設的調度器行為。然而,您可能會希望修改這些預設行為以實現效能的最佳化。讓我們來看一下使用硬親和性(affinity) 的 3 個原因。
原因 1. 有大量計算要做
基於大量計算的情形通常出現在科學和理論計算中,但是通用領域的計算也可能出現這種情況。一個常見的標誌是您發現自己的應用程式要在多處理器的機器上花費大量的計算時間。
原因 2. 提高Cache命中率
在多核啟動並執行機器上,每個CPU都有自己的緩衝,緩衝著進程使用的資訊,而進程可能會被OS調度到其他CPU上,如此一來CPU Cache命中率就低了。當綁定CPU後,程式就會一直在指定的cpu跑,不會由OS調度到其他CPU上,提高CPU Cache命中率。
原因 3. 正在已耗用時間敏感的、決定性的進程
我們對 CPU 親和性(affinity)感興趣的最後一個原因是即時(對時間敏感的)進程。例如,您可能會希望使用硬親和性(affinity)來指定一個 8 路主機上的某個處理器,而同時允許其他 7 個處理器處理所有普通的系統調度。這種做法確保長時間運行、對時間敏感的應用程式可以得到運行,同時可以允許其他應用程式獨佔其餘的計算資源。
進程設定:
1 cpu_set_t mask;2 /* 初始化set集,將set設定為空白*/3 CPU_ZERO(&mask);4 /* 依次將0、1號cpu加入到集合*/5 CPU_SET(0, &mask);6 CPU_SET(1, &mask);7 /*將當前進程綁定到cpu */8 sched_setaffinity(0, sizeof(mask), &mask);
線程設定:
1 cpu_set_t mask;2 /* 初始化set集,將set設定為空白*/3 CPU_ZERO(&mask);4 /* 依次將0、1號cpu加入到集合*/5 CPU_SET(0, &mask);6 CPU_SET(1, &mask);7 /*將當前線程程綁定到cpu */8 pthread_setaffinity_np(pthread_self(), sizeof(mask), &mask);
節選自:
https://zhuanlan.zhihu.com/p/38541212
cpu親和性綁定