numa節點是不是物理cpu?
NUMA是一種關于多個cpu如何訪問內存的架構模型,現在的cpu基本都是numa架構,linux內核2.5開始支持numa。
numa架構簡單點兒說就是,一個物理cpu(一般包含多個邏輯cpu或者說多個核心)構成一個node,這個node不僅包括cpu,還包括一組內存插槽,也就是說一個物理cpu以及一塊內存構成了一個node。每個cpu可以訪問自己node下的內存,也可以訪問其他node的內存,但是訪問速度是不一樣的,自己node下的更快。numactl --hardware命令可以查看node狀況。
通過numactl啟動程序,可以指定node綁定規則和內存使用規則。可以通過cpunodebind參數使進程使用固定node上的cpu,使用localalloc參數指定進程只使用cpu所在node上分配的內存。如果分配的node上的內存足夠用,這樣可以減少抖動,提供性能。如果內存緊張,則應該使用interleave參數,否則進程會因為只能使用部分內存而out of memory或者使用swap區造成性能下降。
NUMA的內存分配策略有localalloc、preferred、membind、interleave。
localalloc規定進程從當前node上請求分配內存;
preferred比較寬松地指定了一個推薦的node來獲取內存,如果被推薦的node上沒有足夠內存,進程可以嘗試別的node。
membind可以指定若干個node,進程只能從這些指定的node上請求分配內存。
interleave規定進程從指定的若干個node上以RR(Round Robin 輪詢調度)算法交織地請求分配內存。