目錄
- 一、主流多核CPU
- 1.1 多核CPU快取結構
- 1.2 對redis的影響
- 二、NUMA CPU
- 2.1 UMA(SMP)架構VS NUMA 架構
- 2.2 對redis的影響
本文主要基于cpu的架構和運行機制來分析cpu架構對redis的性能影響,
一、主流多核CPU
1.1 多核CPU快取結構

訪問速度
- L1>L2>L3>記憶體,
權限
-
L1和L2為每個核私有(每一個物理核下面的邏輯核共享L1和L2)
-
L3快取為多核共享
訪問順序
- CPU訪問時先從L1和L2快取讀取資料,沒有會去L3快取訪問,
- 當前核頻繁執行的指令和資料會被存盤在L1和L2快取中,如果cpu每次執行都能從L1,L2快取中讀到資料,程式的性能會非常好,應該盡量提高L1和L2的快取命中率,
context switch
執行緒在多個CPU之間輪換叫做context switch,在多核環境下,如果發生context switch:
- Redis實體執行緒的運行環境從原有A核移動到了新的B核,那么首先背景關系資訊需要重新copy到新核,
- 同時原有的L1和L2快取的資料也失效了(私有),需要重新加載,這會影響程式的性能,【降低了L1,L2的命中率】
1.2 對redis的影響
Redis主操作雖然是單執行緒,自己不做執行緒調度,但是CPU本身可能會把這個主執行緒調度到不同的核上面,最終發生context switch,可以通過對redis實體進行綁核來解決這個問題,最終redis實體強制運行在一個cpu核上,從而徹底避免了context switch,
綁核產生的問題
redis實體除了主執行緒外還有其他額外的后臺執行緒,子執行緒,如果設定了綁核,把redis實體榜單到了特定的核,這會導致子執行緒和主執行緒競爭同一個核,子執行緒有可能會導致主執行緒阻塞,最終也會影響redis的性能,
解決競爭
如果對redis實體綁核,有兩個方法可以降低主子執行緒cpu的競爭
- redis實體和物理核系結,一個物理核有多個邏輯核,這樣子執行緒和主執行緒共享多個邏輯核,一定程度上減少競爭,
- 修改redis原始碼,將子執行緒系結到其他核,
二、NUMA CPU
2.1 UMA(SMP)架構VS NUMA 架構
單核或者多核計算機上的 CPU 計算機中的所有資源都是共享的,這種架構被稱作對稱多處理器架構(Symmetric Multi-Processor、SMP),或者稱為一致存盤器訪問結構(Uniform Memory Access、UMA),
SMP隨著核數量的增加,總線等會成為瓶頸,所有引入了多個CPU(多CPU Socket),NUMA(NON Uniform Memory Access)架構,NUMA節點包含獨立的物理CPU和記憶體,CPU Socket訪問本地記憶體和遠程記憶體的開銷是不一樣的,

2.2 對redis的影響
通過之前的綁核,可以解決redis實體本身在不同cpu之間切換導致的context switch開銷,
redis是基于網路部署的,內部采用了IO多路復用來實作(epoll機制):
- 網路中斷處理程式用于檢測IO資料是否到達
- redis主執行緒用于最終的命令實作
為了避免網路中斷處理程式和redis主執行緒競爭cpu,也為了避免網路中斷處理程式在不同CPU上進行調度,一般會把網路中斷處理程式也會和CPU核進行系結,從而提升redis的性能,
通過上面的分析可以看出,網路中斷處理程式和redis主執行緒最終是要進行資料互動的,在多numa架構下,如果網路中斷處理程式和redis主執行緒分別屬于不同的numa節點,這最侄訓變成跨numa的間接記憶體訪問,最終也會影響性能,
所以在numa架構下,如果要針對網路中斷處理程式綁核,要把網路中斷處理程式和redis實體系結在同一個numa節點下,避免夸numua記憶體訪問,

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/253458.html
標籤:NoSQL
上一篇:MySQL 幻象行
