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