Redis 多核CPU與NUMA架構優化

2021-10-14 02:00:21 字數 2411 閱讀 2310

當今的cpu一般會有多顆核心(我們稱為物理核心),每顆核心都有自己的一級快取(簡稱l1 cache)與二級快取(簡稱l2 cache),這兩集快取都比較小,一般都是kb級別,cpu核心訪問它們一般只有幾納秒,非常快。一級快取又可以進一步分為指令快取與資料快取。但是一級快取與二級快取都比較小,可以儲存的指令與資料比較少,如果指令或者資料沒有在l1與l2 cache命中,那麼就要訪問記憶體,記憶體的訪問速度就比較慢了,一般是100納秒左右,為此引入了共所有cpu核心共享的**快取,它的大小從幾mb到幾十mb不等。

當前主流的cpu,在乙個物理核心上一般可以執行2個超執行緒,也叫邏輯核,它們共享l1與l2 cache。如下圖所示是乙個2個核心的典型cpu架構:

由於l1快取比l2、l3快取離cpu核心更近,cpu物理核心訪問它們的速度依次是l1>l2>l3,如果指令或者資料沒有再l1快取命中,那麼會從l2、l3或者記憶體載入到l3、l2或者l1快取上。我們可以通過提高程式再快取的命中率,提公升程式的效能。

pidstat -w
如果程序有大量的上下文切換,那麼我們就需要考慮繫結cpu核心了,我們可以通過如下的命令繫結核心

taskset -c 1
可以通過如下的命令檢視cpu編號等資訊

lscpu
現在很多伺服器都有多顆cpu,每顆cpu在不同的socket上面,不同的cpu之間通過匯流排連線,每顆cpu都有自己的記憶體與l3快取,每顆物理核又都有自己的l1與l2快取。如下圖所示極為numa架構的cpu

程式可以在任意的cpu1的任意物理核執行。如果程式先在cpu1的核心上執行,然後切換到cpu2上執行,由於程式先在cpu1上執行,故它的執行時資訊、指令與資料都儲存在cpu1的快取與記憶體中,為此當切換到cpu2上執行時,需要訪問cpu1的記憶體上的指令與資料。這種訪問非本cpu的記憶體的指令與資料,我們稱之為遠端記憶體訪問。由於遠端記憶體離cpu相較本地記憶體遠,因此其訪問延遲比本地記憶體長。

在多cpu架構下,程式訪問本地記憶體與遠端的記憶體的延遲並不一致,我們把這種不一致叫做非統一記憶體訪問(non uniform memory access,簡稱numa)。這也是cpu numa架構的由來。

為了提公升網路處理效能,我們一般會把網路中斷處理程式繫結到某個cpu物理核心上。我們知道網路的收發流程如下:

那麼如果網路中斷處理程式繫結到了cpu1物理核心1上,那麼套接字緩衝區就在cpu1的本地記憶體中,如果程式繫結到了cpu2的核心上,那麼cpu2收發網路資料就需要訪問遠端記憶體,從而導致程式延時變長,影響效能。因此這種情況下,我們需要將應用程式與網路中斷處理程式繫結到同一顆cpu的不同核心上。

我們知道redis的aof重寫與rdb快照生成是通過fork子程序實現的,而綁核操作會繼承給子程序,從而導致子程序與主線程爭搶同乙個核心,影響redis效能。而且redis還會建立一些執行緒,用於執行非同步刪除,過期資料刪除與快取淘汰等,他們也會爭搶同乙個核心的資源。

我們可以通過以下兩種方案解決:

1、將redis繫結到乙個物理核心上,這樣主線程,後台執行緒與子程序可以共享乙個cpu核心的兩個邏輯核,也可以在一定程度上緩解爭搶cpu資源的問題。需要注意的是cpu的乙個物理核的兩個邏輯核的編碼並不是連續的,linux會先一次編碼物理核心的第乙個邏輯核,然後再依次編碼第二個邏輯核。對於numa架構,會先依次編碼不同cpu的物理核的第乙個邏輯核,然後再編碼第二個物理核。如下所示就是乙個numa架構的cpu編碼

lscpu

architecture: x86_64

...numa node0 cpu(s): 0-5,12-17

numa node1 cpu(s): 6-11,18-23

...

2、修改**,使得redis的主線程,後台執行緒與子程序分別繫結到不同的邏輯核上。linux提供了如下的函式,用於繫結核心

cpu_set_t 資料結構:是乙個位圖,每一位用來表示伺服器上的乙個 cpu 邏輯核。

cpu_zero 函式:以 cpu_set_t 結構的點陣圖為輸入引數,把點陣圖中所有的位設定為 0。

cpu_set 函式:以 cpu 邏輯核編號和 cpu_set_t 點陣圖為引數,把點陣圖中和輸入的邏輯核編號對應的位設定為 1。

sched_setaffinity 函式:以程序 / 執行緒 id 號和 cpu_set_t 為引數,檢查 cpu_set_t 中哪一位為 1,就把輸入的 id 號所代表的程序 / 執行緒綁在對應的邏輯核上。

numa 與 cpu 親和性

improving performance on numa systems red hat linux numa supportfor hp proliant servers p320h performance on non uniform memory access numa systems th...

多核與多個CPU啥區別

處理器如今已經成為影響人們購買it產品的重要因素,無論是pc 手機還是伺服器市場,處理器的型號直接影響到產品的 情況。對於手機和pc等消費產品來說,使用者可以從cpu頻率 核心數等要素分辨出處理器效能的優劣。但是對於多核心的伺服器產品來說,如何來分辨多核心與多個cpu產品的效能呢?要分辨出多核心處理...

多核與多個CPU啥區別?

處理器如今已經成為影響人們購買it產品的重要因素,無論是pc 手機還是伺服器市場,處理器的型號直接影響到產品的 情況。對於手機和pc等消費產品來說,使用者可以從cpu頻率 核心數等要素分辨出處理器效能的優劣。但是對於多核心的伺服器產品來說,如何來分辨多核心與多個cpu產品的效能呢?要分辨出多核心處理...