講解CPU之NUMA硬件體系以及機制(lscpu查看相關信息)


 
先看看從系統層面反映出來的numa cpu信息。
采樣機器為實體機、80核、128內存。
[root@ht2 src]# lscpu
Architecture:          x86_64  #x86架構下的64位
CPU op-mode(s):        32-bit, 64-bit  #表示支持運行模式,getconf LONG_BIT 命令可以得到當前CPU運行在什么模式下,如果是64,但不代表CPU不支持32bi
Byte Order:            Little Endian #Intel的機器(X86平台)一般都采用小端,Little Endian代表小段字節對齊
CPU(s):                80  #邏輯cpu顆數
On-line CPU(s) list:   0-79 #正在運行的cpu邏輯內核
Thread(s) per core:    2   #每個核的線程數(每個 Core 的硬件線程數)
Core(s) per socket:    10  #多少核
Socket(s):             4   #服務器面板上有4個cpu槽位
NUMA node(s):          4   #numa nodes的數量
Vendor ID:             GenuineIntel    #cpu廠商ID
CPU family:            6   #CPU產品系列代號
Model:                 62  #CPU屬於其系列中的哪一代的代號
Model name:            Intel(R) Xeon(R) CPU  #cpu型號
E7-4830 v2 @ 2.20GHz  //型號
Stepping:              7           #步長
CPU MHz:               2180.664      #CPU的時鍾頻率(主頻),是指CPU運算時的工作的頻率,決定計算技術的運行速度,單位是Hz
CPU max MHz:           2700.0000     #cpu時鍾最大頻率
CPU min MHz:           1200.0000     #cpu時鍾最小頻率
BogoMIPS:              4389.73      #BogoMips 是衡量 CPU 速度的方法,它衡量的是“ CPU 每秒鍾什么都不能做的百萬次數”
Virtualization:        VT-x         #cpu支持的虛擬化技術,需要進入進入bios設置
//要結合着理解
L1d cache和L1i cache,他們兩個差一個字母d和i L1d cache: 32K      #ld cache 內容緩存 L1i cache: 32K       #li cache 指令緩存,L1是最靠近CPU核心的緩存。
L2 cache: 256K #CPU未命中L1的情況下繼續在L2尋求命中,L2二級緩存比L1一級緩存的容量要更大,但是L2的速率要更慢,離cpu遠
L3 cache: 20480K      #
#這里看到,cpu是采用numa硬件體系架構,首先確認看到cpu硬件是否支持numa的.
#通過lscpu 、numactl  --hardware、grep -i numa  /var/log/dmesg等命令可以看到相關配置。
#緩存速度上 L1 > L2 > L3 > DDR
NUMA node0 CPU(s):     0-9,40-49     #0-9和40-49 是由numa node0 來管理的
NUMA node1 CPU(s): 10-19,50-59 #...
NUMA node2 CPU(s): 20-29,60-69 #...
NUMA node3 CPU(s): 30-39,70-79 #...
Flags: fpu .....                     #cpu支持的技術特征 這里省略了.另外章節介紹
注意: 如果是 1個Sockets, 4個Cores,2 Thread(s) per core 1個cpu,4核8線程
由上面上面
NUMA 引出了,numa架構問題。

#一個沒有啟用numa的服務器。

[root@ht20 redis]# lscpu
NUMA node(s):          1
NUMA node0 CPU(s):     0-15
 

 

一、先看下X86主板布局圖



從圖中可以看出,靠近CPU的是北橋芯片(North Bridge)
1、北橋芯片中集成了內存控制器、PCI控制器等, 主要負責和高速設備通信,如內存、顯卡等。
2、北橋芯片附近的是南橋芯片(South Bridge),主要負責和一些低速外設之間的通信。
 另外,內存插槽和PCI插槽都是靠近北橋芯片的,目的就是減少這些插槽到北橋芯片之間的布線長度,
從而降低北橋芯片和這些設備的通信延遲和干擾。

二、芯片組系統框架(北橋)

如圖上圖所示,intel 82915P是一款典型的北橋芯片,intel ICH6x是南橋芯片,這兩款芯片加在一起被稱為i915P芯片組。
某個芯片組的名稱其實就是以北橋芯片的型號來命名的。
從上圖可以了解到以下信息:
1、CPU和北橋芯片之間通過前端總線FSB通信
2、北橋芯片負責和顯卡、內存設備通信
3、南橋芯片負責和低速外設通信,如USB設備、硬盤等
4、南橋芯片不能直接和CPU通信,必須經過DMI總線和北橋芯片通信,然后統一由北橋與CPU通信

 另外 Intel南橋芯片叫ICH與北橋芯片叫MCH是構成主板最重要的部分。MCH是內存控制器中心的英文縮寫,負責連接CPU,AGP總線和內存

 這個架構當然是比較的落后了,但是還是很能說明問題,畢竟芯片以及主板技術發展迅猛。
 現在北橋的大部分功能已經被整合進cpu處理器中,如內存控制器和PCIe控制器。
 在intel某些型號的處理器中,南橋也被整合進處理器中,從而主板上只剩下處理器一顆芯片,更類似於ARM處理器系統中的架構。

 

三、SMP cpu架構體系

SMP (Symmetric Multiprocessing),對稱多處理器。
在SMP中所有的處理器都是對等的,所有CPU Core都是通過共享一個北橋(pci bus)來讀取內存,
這也就導致了系統中所有資源(CPU、內存、I/O等)都是共享的,當我們打開服務器的背板蓋,如果發現有多個cpu的槽位,
但是卻連接到同一個內存插槽的位置,那一般就是smp架構的服務器。常見的pc啊,筆記本啊,手機還有一些老的服務器都是這個架構

ls /sys/devices/system/node/# 如果只看到一個node0 那就是smp架構

  [root@ht4 ~]# ls /sys/devices/system/node/
  has_cpu has_memory has_normal_memory node0 node1 online possible power uevent   //numa架構

  [root@ht20 redis]# ls /sys/devices/system/node/
  has_cpu has_memory has_normal_memory node0 online possible power uevent         //smp架構

smp基本工作如下圖所示:

 
 

 四、NUMA cpu架構體系

  在NUMA硬件架構出現之前,內存控制器還是被設計在主板的北橋芯片組中,
  所有CPU對內存的訪問都要通過北橋芯片組來完成。
  此時所有CPU訪問內存都是“一致的”,在傳統的對稱多處理器SMP體系架構中,
  整個計算機中的所有cpu共享一個單獨的內存控制器。
 當所有的cpu同時訪問內存時,這個內存控制器往往會成為系統的性能瓶頸。
 同時,smp架構也不能適應使用大量的cpu的場景。於是,為了解決這些問題,
 越來越多的現代計算機系統開始采用了CC/NUMA(緩存一致性/非對稱訪存)架構。
 例如AMD* Opteron*, IBM* Power5*, HP* Superdome, and SGI* Altix*等。

注意: 如果linux 內核不支持的話numa的話也白搭,你如果看linux 內核代碼會發現很多內核會涉及到numa,同時在head.S中也有它的影子。

NUMA和SMP是兩種不同的CPU硬件體系架構,可以形象的認為numa是多對多(一個node-->多個cpu core-->內存),
而SMP是 內存控制器--->多個cpu core。
NUMA 綁核是用來隔離 CPU 資源的一種方法,適合高配置物理機環境部署多實例使用,主要為了防止 CPU 資源的爭搶,引發性能衰退

1、IMC 的全稱是Integrated Memory Controller,集成內存控制器。IMC是內存通道控制模組。
2、QPI ,又名CSI,Common System Interface公共系統接口,是一種可以實現芯片間直接互聯的架構。
3、Intel的QuickPath Interconnect技術縮寫為QPI,譯為快速通道互聯。官方名字叫做CSI。
4、NUMA 全稱 Non-Uniform Memory Access,翻譯為“非一致性內存訪問”。

    numa 構架下,每個node都有自己獨立的內存控制器和CPU core,
   我們看一個開啟了numa架構的服務器.

[root@ht4 ~]# numactl --hardware
available: 2 nodes (0-1) #如果是2或多個nodes就說明numa沒關掉
node 0 cpus: 0 1 2 3 4 5 6 7 16 17 18 19 20 21 22 23
node 0 size: 16355 MB
node 0 free: 12392 MB
node 1 cpus: 8 9 10 11 12 13 14 15 24 25 26 27 28 29 30 31
node 1 size: 16384 MB
node 1 free: 7290 MB
node distances:
node   0   1 
  0:  10  20 
  1:  20  10  
也就是說每個 Node 都有自己的集成內存控制器(imc)

系統板的北橋最重要的功能是內存控制器。cpu里集成內存控制器的,因為這樣可以減少我們【cpu<--->內存】之間的延遲,以往的內存控制器是集成在北橋里的。
而現在的Intel CPU已經將內存控制器集成到了內部。在 Node內部,架構類似SMP架構,使用 IMC Bus 進行不同核心內部間的通信;
不同的 Node 間通過QPI進行通信

 

intel numa cpu模型就比較清楚的解釋了運行機制

+-----------------------Node0/smp架構---------------+    +-----------------------Node1/smp架構----------------+
| +++++++++++++++  +++++++++++++++  +++++++++++++++ |    | +++++++++++++++  +++++++++++++++  +++++++++++++++ |
| |     CPU0     |  |     CPU2     |  |     CPU3    |    | |     CPU6    |  |     CPU7     |  |     CPU8   | |
| +++++++++++++++  +++++++++++++++  +++++++++++++++ |    | +++++++++++++++  +++++++++++++++  +++++++++++++++ |
|        |                |                |        |    |        |                |                |        |
|        |                |                |        |    |        |                |                |        |
|   -------------------IMC BUS--------------------  |    |   -------------------IMC BUS--------------------  |
|                |                 |                |    |                |                 |                |
|                |                 |                |    |                |                 |                |
|          +++++++++++++++   +++++++++++++++        |    |          +++++++++++++++   +++++++++++++++        |
|           |    memory   |   |    memory |      |    |            |    memory   |   |    memory      | |
|       +++++++++++++++   +++++++++++++++ |           +        +++++++++++++++++ +++++++++++++++        |
+___________________________________________________+    +___________________________________________________+
                           |                                                         |
                           |                                                         |
                           |                                                         |
  ----------------------------------------------------QPI---------------------------------------------------

一般來說,一個內存插槽對應一個 Node。
需要注意的一個特點是,QPI的延遲要高於內存IMC Bus,也就是說CPU訪問內存有了遠近(remote/local)之別后,這個差別非常明顯

在Linux中,對於NUMA有以下幾個需要注意的地方:

默認情況下,內核不會將內存頁面從一個 NUMA Node 遷移到另外一個 NUMA Node;
但是有現成的工具可以實現將冷頁面遷移到遠程(Remote)的節點:NUMA Balancing;
關於不同 NUMA Node 上內存頁面遷移的規則,社區中有依然有不少爭論。

 下面我們看下內核分析  numa node

E:\linux內核\linux-2.6.0\linux-2.6.0\arch\x86_64\kernel\head64.c  //內核啟動代碼時候
#ifdef CONFIG_DISCONTIGMEM
  s = strstr(saved_command_line, "numa="); 
  //啟動參數存入后command_line后,會在setup_command_line中,再次將啟動參數拷貝到static_command_line中
  if (s != NULL)
  numa_setup(s+5);
#endif

E:\linux內核\linux-2.6.0\linux-2.6.0\arch\x86_64\mm\numa.c    //初始化的時候

{
.....

void __init paging_init(void)
{
int i;
for_all_nodes(i) {
setup_node_zones(i);
}
}

/* [numa=off] */
__init int numa_setup(char *opt)
{
if (!strncmp(opt,"off",3))
numa_off = 1;  //默認關閉
return 1;
}......


}

 在centos下查看和關閉numa,看查看文檔 
https://access.redhat.com/solutions/23216
E:\linux內核\linux-2.6.0\linux-2.6.0\Documentation\x86_64\boot-options.txt 
 //內核文檔有闡述,系統關閉默認將僅僅安裝為單節點。(124行)

//查看linux內核啟動行,這個是grub會讀取的
[root@ht2 cpu0]# cat /proc/cmdline
BOOT_IMAGE=/vmlinuz-3.10.0-693.el7.x86_64 root=/dev/mapper/centos-root ro rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet LANG=en_US.UTF-8

[root@ht2 cpu0]# cat /etc/default/grub
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet"
GRUB_DISABLE_RECOVERY="true"
//安裝后的系統里面修改啟用numa。
[root@ht2 cpu0]# vi /etc/default/grub
## replace numa=off to numa=on
[root@ht2 cpu0]#grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg
[root@ht2 cpu0]#shutdown -r now

安裝numa的工具,查看numa和管理numa,工具使用我用了另外一台機器,因為ht2機房太慢了
這個工具有點類似 taskset 可以對cpu的行為造成影響。
[root@fp-web-112 ~]# yum -y install numactl   //centos7下很容易安裝,網速足夠快的情況下,安裝很簡單。
[root@fp-web-112 ~]# numactl -h
語法:
numactl [--interleave nodes] [--preferred node] [--membind nodes]
  [--cpunodebind nodes] [--physcpubind cpus] [--localalloc] [--] {arguments ...}
numactl --show
numactl --hardware
numactl [--huge] [--offset offset] [--shmmode shmmode] [--length length] [--strict]
[--shmid id] --shm shmkeyfile | --file tmpfsfile
[--touch] [--dump] [--dump-nodes] memory policy
主要參數:
--interleave=nodes, -i nodes
          這個選項用於設定內存的交織分配模式。 也就是說系統在為多個節點分配內存空間的時候,將會以輪詢分發的方式被分配給這多個節點.
          如果在當前眾多的交織分配內存節點中的目標節點無法正確的分配內存空間的話,內存空間將會由其他的節點來分配。
--membind=nodes, -m nodes
           選項 '--membind' 僅用來從節點中分配內存空間所用。 如果在這些節點中無法分配出所請求的空間大小的話該分配操作將會失敗.
           上述命令中指定需要分配空間的 nodes 的方式可以遵照上述 N,N,N , N-N ,N 這種方式來指定.
--cpunodebind=nodes, -N nodes
          上述命令僅用於施加在運行與 cpu 上的進程。這個命令用於顯示 cpu 的個數,
cpu 數目信息同樣記錄在系統中的存放處理器領域信息的 /proc/cpuinfo 文件夾下,
          或者是按照關聯的中央處理器信息 在當前的中央處理器集中所存放.          
--localalloc , -l
           這個命令選項通常是為當前的節點分配內存的
--preferred=node
               該命令由於指定優先分配內存空間的節點,如果無法將空間分配給該節點的話,應該分配給該節點上的空間將會被分發到其他的節點上               
                該命令選項后面僅接收一個單獨的節點標號.  相關的表示方式也可以使用.
--show,-s  該命令用於顯示 NUMA 機制作用在當前運行的那些進程上
--hardware , -H 該命令用於顯示當前系統中有多少個可用的節點.
--huge     當創建一個基於大內存頁面的系統級的共享內存段的時候,使用 --huge 這個選項。
           --huge 選項僅在 --shmid 或是 --shm 命令的后面使用才有效.
--offset   該參數選項用於指定共享內存段中的位移量的偏移。 默認的情況下偏移量是 0 。 有效的偏移量單位是 m (用於表示 MB)
            g (用於表示 GB) , k (用於表示 KB ), 其他沒有指定的被認為是以字節為單位.
--strict 
             這個參數選項 當施加了 NUMA 調度機制的共享內存段區域的頁面被施加了另一個機制而導致錯誤的時候,
            使用 --strict 選項將會把錯誤信息顯示出來. 默認情況是不使用該選項的。
--shmmode shmmode
          該選項僅在 --shmid 或是 --shm 之前使用才會生效。 當創建一個共享內存段的時候,通過整型數值來指定
           共享內存的共享的模式類型.
--length length
            Apply policy to length range in the shared memory segment or make the segment length long Default is to use the remaining
           length Required when a shared memory segment is created and specifies the length of the new segment then .
            Valid units are m ( for MB ) , g( for GB) , k ( for KB) , otherwise it specifies bytes.
--shmid id
             通過ID 號碼來創建或使用一個共享內存段。
               (如果共享內存段已經存在,那么通過 shmid 來指定下面要使用某個 ID 的共享內存段 ;  如果該 ID 對應的共享內存段並不存在的話,那么就創建一個)
--shm shmkeyfile
             通過存放在 shmkeyfile(共享內存-鍵文件)中的 ID 號碼來創建或者是使用一個共享內存段。
             訪問 shmkeyfile 文件的進程是通過 fork(3 arguments) 方法來實現的.
--file tmpfsfile
         將 numa 機制施加於文件上面, 這個文件屬於 tmpfs或者是 hugetlbfs 這種特殊的文件系統
--touch
         通過將 numa 機制施加於剛剛頁面上來實現內存的早期 numa 化。
         默認情況下是不使用該選項,如果存在映射或是訪問頁面的應用的話,將會使用該早期實行 NUMA 機制的這種方法.
--dump
         該選項用於廢除將已經 numa 化的特定區域上的 NUMA性質.
(--dump ) 選項后,有效指定 node 的書寫方式
         all  用於將所有的節點上的 NUMA 特性移除
         number  通過指定 node 后接的數值來廢除該數字對應的 node
         number1(number2)  node number1(node number2)上的 NUMA 特性將會被移除
         number1-number2    node number1 -- node number2 區間上的所有存在的 node 的 NUMA 特性將會被移除
         !nodes                除了 nodes 所指定的節點以外的所有節點上的 NUMA 特性全都會被移除


//我們查看,linux內核文檔寫的很清楚,默認是關閉的,關閉的情況下僅僅是安裝為單個節點。 //原文: numa=off Only set up a single NUMA node spanning all memory. [root@fp-web-112 ~]# numactl --hardware available: 1 nodes (0) //1個節點有效 node 0 cpus: 0 1 2 3 4 5 6 7 //8核都安裝在這個節點下 node 0 size: 16383 MB //將近16G內存都由該節點控制 node 0 free: 3710 MB //3.6g是空閑 node distances: node 0 0: 10

查看當前的numa策略

 [root@ht4 drivers]# numactl --show
 policy: default
 preferred node: current
 physcpubind: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
 cpubind: 0 1
 nodebind: 0 1
 membind: 0 1

 可顯示各node中內存使用情況 

 [root@ht4 drivers]# numactl -H
 available: 2 nodes (0-1)
 node 0 cpus: 0 1 2 3 4 5 6 7 16 17 18 19 20 21 22 23
 node 0 size: 16355 MB
 node 0 free: 12093 MB
 node 1 cpus: 8 9 10 11 12 13 14 15 24 25 26 27 28 29 30 31
 node 1 size: 16384 MB
 node 1 free: 7247 MB
 node distances:
 node 0 1
 0: 10 20
 1: 20 10

 



//查看numa狀態
[root@fp-web-112 ~]# numastat
node0
numa_hit 5740940530
numa_miss 0
numa_foreign 0
interleave_hit 21170
local_node 5740940530
other_node 0
-m:顯示每個節點中,系統范圍內使用內存的情況,可以與其他參數組合使用
[root@ht4 drivers]# numastat -m

Per-node system memory usage (in MBs):
                          Node 0          Node 1           Total
                 --------------- --------------- ---------------
MemTotal                16355.61        16384.00        32739.61
MemFree                 12096.06         7244.43        19340.49
MemUsed                  4259.55         9139.57        13399.12
Active                    799.33         3653.24         4452.57
Inactive                 1053.88         2466.18         3520.05
Active(anon)              171.07          145.52          316.58
Inactive(anon)             97.50          107.89          205.38
Active(file)              628.27         3507.73         4135.99
Inactive(file)            956.38         2358.29         3314.67
Unevictable                 0.00            0.00            0.00
Mlocked                     0.00            0.00            0.00
Dirty                       0.02            0.23            0.25
Writeback                   0.00            0.00            0.00
FilePages                1587.35         5874.20         7461.55
Mapped                     38.65          207.97          246.62
AnonPages                 266.27          245.56          511.82
Shmem                       0.40            0.64            1.05
KernelStack                11.89           11.91           23.80
PageTables                  5.46            5.90           11.36
NFS_Unstable                0.00            0.00            0.00
Bounce                      0.00            0.00            0.00
WritebackTmp                0.00            0.00            0.00
Slab                     1639.97         2257.53         3897.50
SReclaimable              810.03         1119.70         1929.73
SUnreclaim                829.94         1137.82         1967.76
AnonHugePages             124.00          128.00          252.00
HugePages_Total             0.00            0.00            0.00
HugePages_Free              0.00            0.00            0.00
HugePages_Surp              0.00            0.00            0.00

-c:緊湊的顯示信息,將內存四舍五入到MB單位,適合節點較多時使用

[root@ht4 drivers]# numastat -c
Per-node numastat info (in MBs):
                 Node 0   Node 1    Total
                ------- -------- --------
Numa_Hit        8830145 17715290 26545435
Numa_Miss         59522  6479342  6538864
Numa_Foreign    6479342    59522  6538864
Interleave_Hit       61       62      123
Local_Node      8829485 17723254 26552738
Other_Node        60182  6471378  6531560

https://www.percona.com/doc/percona-server/5.5/performance/innodb_numa_support.html
https://dom.as/2014/01/17/on-swapping-and-kernels/
https://engineering.linkedin.com/performance/optimizing-linux-memory-management-low-latency-high-throughput-databases
https://engineering.linkedin.com/performance/optimizing-linux-memory-management-low-latency-high-throughput-databases
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM