Linux如何將進程綁定CPU核心以提高性能

在Linux系統(tǒng)中箱玷,進程的調(diào)度切換是由內(nèi)核自動完成的,在多核CPU上俭茧,進程有可能在不同的CPU核上來回切換執(zhí)行,這對CPU的緩存不是很有利漓帚。為什么呢母债?先看一張 Intel i5 CPU 的緩存簡單示意圖:

CPU cache簡單示意圖

在多核CPU結(jié)構(gòu)中,每個核心有各自的L1、L2緩存毡们,而L3緩存是共用的迅皇。如果一個進程在核心間來回切換,各個核心的緩存命中率就會受到影響衙熔。相反如果進程不管如何調(diào)度登颓,都始終可以在一個核心上執(zhí)行,那么其數(shù)據(jù)的L1红氯、L2 緩存的命中率可以顯著提高框咙。

1. 如何設(shè)置進程與CPU核心綁定

在 Linux 系統(tǒng)里,可以使用 CPU_* 系列函數(shù)和 sched_setaffinity() 可以實現(xiàn)綁定痢甘,具體步驟如下:

  1. 使用 CPU_系列函數(shù)喇嘱,必須定義 _GNU_SOURCE 宏,告訴編譯器啟用這些函數(shù):
#define _GNU_SOURCE
  1. 首先聲明一個 cpu_set_t塞栅,然后用 CPU_ZERO()初始化bit數(shù)據(jù):
cpu_set_t mask;
CPU_ZERO(&mask);

cpu_set_t其實是一個bit串者铜,每個bit表示進程是否要與某個CPU核綁定。

  1. 接下來把進程綁定到某幾個CPU核心构蹬,這要用CPU_SET()來設(shè)置cpu_set_t中相應(yīng)的bit位王暗,比如想讓進程只在核心1或核心5上執(zhí)行:
CPU_SET(1, &mask);
CPU_SET(5, &mask);
  1. 最后用sched_setaffinity完成實際的綁定:
sched_setaffinity(0, sizeof(cpu_set_t), &mask);

設(shè)置起來并不難。那怎么驗證我們的綁定真的起作用了呢庄敛?我們來做個實驗:

假定有一臺雙核機器俗壹,這段程序我們起了20個進程,從0開始每個進程分配一個進程號(注意是這里值我們自己起的進程號藻烤,不是進程pid)绷雏,奇數(shù)進程號綁定綁定在 Core 0上執(zhí)行,偶數(shù)號的進程綁定在 Core 1上執(zhí)行怖亭。

我們用for讓進程循環(huán)涎显,用 sched_getcpu() 函數(shù)獲得當前進程運行在哪個CPU核心上,每次for循環(huán)檢查下進程是否真的在分配的核心執(zhí)行兴猩。

#define _GNU_SOURCE
#include <sched.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

void run(int c, int n) {

    cpu_set_t mask;
    CPU_ZERO(&mask);
    CPU_SET(n, &mask);
    sched_setaffinity(0, sizeof(cpu_set_t), &mask);

    int i;
    for (i = 0; i != 10000; i++) {
        printf("%d-%d\n", c, sched_getcpu());
    }
}

int main()
{
    int i;
    for (i = 0; i != 20; i++) {
        int pid = fork();
        if (pid == 0) {
            run(i, i % 2);
            exit(0);
        }
    }
}

執(zhí)行上面的程序期吓,就會打印每個進程綁定的CPU核號,進程與核號的關(guān)系肯定不會變倾芝。如果把 sched_setaffinity() 注釋掉讨勤,CPU進程就失去綁定。

2. 設(shè)置親和性后的性能測試

設(shè)置了進程與CPU綁定后晨另,我們來看看是否能真的帶來性能的提升潭千。修改上面的run()函數(shù),每個進程創(chuàng)建一個數(shù)組借尿,然后計算數(shù)組中值的累加刨晴,創(chuàng)建數(shù)組的意圖是保證進程用到了CPU核心的L1屉来、L2緩存:

void run(int c, int n) {

    cpu_set_t mask;
    CPU_ZERO(&mask);
    CPU_SET(n, &mask);
    sched_setaffinity(0, sizeof(cpu_set_t), &mask);

    struct timeval tv;
    gettimeofday(&tv, NULL);
    long begin = tv.tv_sec * 1000 + tv.tv_usec / 1000;

    int i;
    int arr[N];
    for (i = 0; i != N; i++) {
        arr[i] = i;
    }
    long sum = 0;
    for (i = 0; i != N; i++) {
        sum += arr[i];
    }
    gettimeofday(&tv, NULL);
    long end = tv.tv_sec * 1000 + tv.tv_usec / 1000;
    printf("%ld\n", end - begin);
}

然后執(zhí)行20次程序,10次沒有CPU綁定狈癞,10次有CPU綁定茄靠,記錄每個進程的耗時毫秒數(shù),就有下面的結(jié)果:

CPU綁定測試

P1~P20是進程號亿驾,A1~A10列是沒有CPU綁定的情況嘹黔,B1~B10列是有CPU綁定的情況,耗時越久單元格越紅莫瞬。可見綁定了CPU的情況下性能有近10%的提升郭蕉。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末疼邀,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子召锈,更是在濱河造成了極大的恐慌旁振,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件涨岁,死亡現(xiàn)場離奇詭異拐袜,居然都是意外死亡,警方通過查閱死者的電腦和手機梢薪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門蹬铺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人秉撇,你說我怎么就攤上這事甜攀。” “怎么了琐馆?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵规阀,是天一觀的道長。 經(jīng)常有香客問我瘦麸,道長谁撼,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任滋饲,我火速辦了婚禮厉碟,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘了赌。我一直安慰自己墨榄,他們只是感情好,可當我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布勿她。 她就那樣靜靜地躺著袄秩,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上之剧,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天郭卫,我揣著相機與錄音,去河邊找鬼背稼。 笑死贰军,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的蟹肘。 我是一名探鬼主播词疼,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼帘腹!你這毒婦竟也來了贰盗?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤阳欲,失蹤者是張志新(化名)和其女友劉穎舵盈,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年斥废,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赴蝇。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖锨能,靈堂內(nèi)的尸體忽然破棺而出扯再,到底是詐尸還是另有隱情,我是刑警寧澤址遇,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布熄阻,位于F島的核電站,受9級特大地震影響倔约,放射性物質(zhì)發(fā)生泄漏秃殉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一浸剩、第九天 我趴在偏房一處隱蔽的房頂上張望钾军。 院中可真熱鬧,春花似錦绢要、人聲如沸吏恭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽樱哼。三九已至哀九,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間搅幅,已是汗流浹背阅束。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留茄唐,地道東北人息裸。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像沪编,于是被迫代替她去往敵國和親呼盆。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容