一文讀懂多核高性能 cpu 配置,看過來~
我們知道現(xiàn)在服務(wù)器都是多核, 最新的intel Sandybridge是NUMA IO結(jié)構(gòu), 以網(wǎng)卡為例, 也就是說PCI插槽并不像westmere一樣, 通過一個(gè)bridge連接到cpu上, 目前SNB是直接pci鏈接到cpu上。
有時(shí)候我們測試performance的時(shí)候會(huì)看到性能忽高忽低的現(xiàn)象, 原因比較難找, 一頭霧水, 下面我根據(jù)自己的實(shí)際經(jīng)驗(yàn)列出下面幾個(gè)cpu對(duì)性能的影響:
多核并行編程cpu的親和性以及frequence對(duì)性能的影響可能比較大, 如果設(shè)置不好cpu的affinity, 通過跨QPI 來訪問另一個(gè)CPU上的內(nèi)存, 那么性能差距經(jīng)過測試, 會(huì)有10倍的差距(兩個(gè)10G網(wǎng)口收包, 平均包長256, 最壞的情況2.5Gbps, 最好的情況19.8Gbps, 64byte小包在L4 上能達(dá)到16.5Gbps)。
首先我們保證在硬件cpu上不受影響,在這里暫時(shí)不考慮cache一致性的問題 :
1.保證cpu運(yùn)行最高的頻率, 目前默認(rèn)基本都是ondemand, 也就是根據(jù)cpu的空閑程度來自動(dòng)調(diào)節(jié)頻率, C state, 為了保證CPU 運(yùn)行在P狀態(tài), 也就是performance狀態(tài)(當(dāng)然耗電會(huì)大一些)?
2.cpu的set affinity或者taskset僅僅對(duì)用戶層的程序有用, 陷入內(nèi)核后就無法保證當(dāng)前線程運(yùn)行在哪個(gè)cpu上了, 我們要保證在內(nèi)核上分配內(nèi)存時(shí)通過vmalloc_node來指定正確的socket。
3.linux 內(nèi)核目前提供了offline cpu的功能, 當(dāng)然cpu core 0目前是無法進(jìn)行offline的(我認(rèn)識(shí)的一個(gè)內(nèi)核大師正在做cpu 0 offline的功能, 估計(jì)很快內(nèi)核會(huì)支持), 所以我們?yōu)榱伺懦齝pu NUMA的影響, 可以將socket 1上的所有的core進(jìn)行l(wèi)ogical offline, 這樣內(nèi)核就看不到socket 1上的所有的cpu core了, 內(nèi)存分配會(huì)自動(dòng)到node 0上。