lscpu

lscpu命令可以显示CPU架构相关的信息,包括缓存大小。这个信息是来自对proc/cpuinfo文件的读取

$ lscpu
架构:           aarch64
字节序:         Little Endian # 在内存中存储多字节数据(如整数、浮点数)时的排列顺序;
                              # 小端序数据的低位字节存储在低内存地址,高位字节存储在高内存地址。
CPU:             256
在线 CPU 列表:  0-255
每个核的线程数: 2
每个座的核数:   64
座:             2
NUMA 节点:      4          # 两个socket,每个socket64核心,这是物理上的。但是有4个numa节点,每个物理CPU插槽通常对应一个或多个 NUMA 节点。
厂商 ID:        HiSilicon
BIOS Vendor ID:  HiSilicon
型号:           0
BIOS Model name: HUAWEI Kunpeng 920 V200 7270Z
步进:           0x0
CPU 最大 MHz:   2900.0000
CPU 最小 MHz:   400.0000
BogoMIPS:       200.00
L1d 缓存:       64K
L1i 缓存:       64K
L2 缓存:        1280K
L3 缓存:        57344K
NUMA 节点0 CPU: 0-63 
NUMA 节点1 CPU: 64-127 # 每个NUMA节点有独立的内存通道,访问本地内存速度更快,跨节点访问延迟更高。
NUMA 节点2 CPU: 128-191
NUMA 节点3 CPU: 192-255
标记:           fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma lrcpc dcpop sha3 sm3 sm4 asimddp sha512 sve asimdfhm dit uscat ilrcpc flagm ssbs 
sb dcpodp flagm2 frint svei8mm svef32mm svef64mm svebf16 i8mm bf16 dgh rng ecv

我还是不清楚,物理上128核,每个numa64核,是每个numa32物理核32逻辑核,还是有的numa64逻辑核。应该是前者吧,后者共享cache没法有独立内存通道啊。

/sys文件系统中可以找到有关CPU缓存的信息。

cat /sys/devices/system/cpu/cpu0/cache/index0/size  # L1d Cache
cat /sys/devices/system/cpu/cpu0/cache/index1/size  # L1i Cache
cat /sys/devices/system/cpu/cpu0/cache/index2/size  # L2 Cache
cat /sys/devices/system/cpu/cpu0/cache/index3/size  # L3 Cache

如果我想获取每个socket的代表core(因为一些场景下,对寄存器的写入要指定core,但是起作用的是整个socket)

import (
	"os/exec"
	"strconv"
	"strings"
)

// getSocketLeaderCores 使用 lscpu 命令获取每个插槽的第一个核心
func getSocketLeaderCores() ([]int, error) {
	cmd := exec.Command("lscpu", "-p=SOCKET,CORE") // 以0,63一行的形式列出了每个socket对应的物理core编号
	output, err := cmd.Output()
	if err != nil {
		return nil, err
	}
	socketFirstCore := make(map[int]int)
	lines := strings.Split(string(output), "\n")
	for _, line := range lines {
		if strings.HasPrefix(line, "#") || line == "" {
			continue
		}
		parts := strings.Split(line, ",")
		if len(parts) < 2 {
			continue
		}
		socketID, err := strconv.Atoi(parts[0])
		if err != nil {
			continue
		}
		coreID, err := strconv.Atoi(parts[1])
		if err != nil {
			continue
		}
		// 记录每个 socket 的最小 core ID
		if firstCore, exists := socketFirstCore[socketID]; !exists || coreID < firstCore {
			socketFirstCore[socketID] = coreID
		}
	}
	// 转换为有序切片
	result := make([]int, 0, len(socketFirstCore))
	for _, coreID := range socketFirstCore {
		result = append(result, coreID)
	}
	return result, nil
}

dmidecode

dmidecode命令可以获取系统硬件的详细信息,包括CPU缓存。

sudo dmidecode --type cache

从下面信息可以知道:每个物理 CPU 1 个 IMC(Integrated Memory Controller),每个 IMC 管理 8 个 channel,每个channel 2个 DIMM。64GB,DDR5 内存,传输速率 4400MT/s(最高传输频率),channel 的位宽 64 bits。

# 显示硬件信息,包括内存模块(DIMM)的详细信息
sudo dmidecode -t memory
Handle 0x0021, DMI type 17, 92 bytes
Memory Device
        Array Handle: 0x0000
        Error Information Handle: Not Provided
        Total Width: 80 bits
        Data Width: 64 bits
        Size: 64 GB
        Form Factor: DIMM
        Set: None
        Locator: DIMM171
        Bank Locator: SOCKET 1 CHANNEL 7 DIMM 1
        Type: DDR5
        Type Detail: Synchronous Registered (Buffered)
        Speed: 5600 MT/s
        Manufacturer: Hynix
        Serial Number: 80AD032407E12D1E69
        Asset Tag: 2407 
        Part Number: HMCG94AGBRA182N               
        Rank: 2
        Configured Memory Speed: 4400 MT/s
        Minimum Voltage: 1.067 V
        Maximum Voltage: 1.166 V
        Configured Voltage: 1.1 V
        Memory Technology: DRAM
        Memory Operating Mode Capability: None
        Firmware Version: Not Specified
        Module Manufacturer ID: Bank 1, Hex 0xAD
        Module Product ID: Unknown
        Memory Subsystem Controller Manufacturer ID: Unknown
        Memory Subsystem Controller Product ID: Unknown
        Non-Volatile Size: None
        Volatile Size: None
        Cache Size: None
        Logical Size: None

$ dmidecode -t memory | grep -A10 "Memory Device" | grep -E "Locator:|Size:"
        Size: 64 GB
        Locator: DIMM000
        Bank Locator: SOCKET 0 CHANNEL 0 DIMM 0
        Size: 64 GB
        Locator: DIMM001
        Bank Locator: SOCKET 0 CHANNEL 0 DIMM 1
        Size: 64 GB
        Locator: DIMM010
        Bank Locator: SOCKET 0 CHANNEL 1 DIMM 0
        Size: 64 GB
        Locator: DIMM011
        Bank Locator: SOCKET 0 CHANNEL 1 DIMM 1
        Size: 64 GB
        Locator: DIMM020
        Bank Locator: SOCKET 0 CHANNEL 2 DIMM 0
        Size: 64 GB
        Locator: DIMM021
        Bank Locator: SOCKET 0 CHANNEL 2 DIMM 1
        Size: 64 GB
        Locator: DIMM030
        Bank Locator: SOCKET 0 CHANNEL 3 DIMM 0
        Size: 64 GB
        Locator: DIMM031
        Bank Locator: SOCKET 0 CHANNEL 3 DIMM 1
        Size: 64 GB
        Locator: DIMM040
        Bank Locator: SOCKET 0 CHANNEL 4 DIMM 0
        Size: 64 GB
        Locator: DIMM041
        Bank Locator: SOCKET 0 CHANNEL 4 DIMM 1
        Size: 64 GB
        Locator: DIMM050
        Bank Locator: SOCKET 0 CHANNEL 5 DIMM 0
        Size: 64 GB
        Locator: DIMM051
        Bank Locator: SOCKET 0 CHANNEL 5 DIMM 1
        Size: 64 GB
        Locator: DIMM060
        Bank Locator: SOCKET 0 CHANNEL 6 DIMM 0
        Size: 64 GB
        Locator: DIMM061
        Bank Locator: SOCKET 0 CHANNEL 6 DIMM 1
        Size: 64 GB
        Locator: DIMM070
        Bank Locator: SOCKET 0 CHANNEL 7 DIMM 0
        Size: 64 GB
        Locator: DIMM071
        Bank Locator: SOCKET 0 CHANNEL 7 DIMM 1
        Size: 64 GB
        Locator: DIMM100
        Bank Locator: SOCKET 1 CHANNEL 0 DIMM 0
        Size: 64 GB
        Locator: DIMM101
        Bank Locator: SOCKET 1 CHANNEL 0 DIMM 1
        Size: 64 GB
        Locator: DIMM110
        Bank Locator: SOCKET 1 CHANNEL 1 DIMM 0
        Size: 64 GB
        Locator: DIMM111
        Bank Locator: SOCKET 1 CHANNEL 1 DIMM 1
        Size: 64 GB
        Locator: DIMM120
        Bank Locator: SOCKET 1 CHANNEL 2 DIMM 0
        Size: 64 GB
        Locator: DIMM121
        Bank Locator: SOCKET 1 CHANNEL 2 DIMM 1
        Size: 64 GB
        Locator: DIMM130
        Bank Locator: SOCKET 1 CHANNEL 3 DIMM 0
        Size: 64 GB
        Locator: DIMM131
        Bank Locator: SOCKET 1 CHANNEL 3 DIMM 1
        Size: 64 GB
        Locator: DIMM140
        Bank Locator: SOCKET 1 CHANNEL 4 DIMM 0
        Size: 64 GB
        Locator: DIMM141
        Bank Locator: SOCKET 1 CHANNEL 4 DIMM 1
        Size: 64 GB
        Locator: DIMM150
        Bank Locator: SOCKET 1 CHANNEL 5 DIMM 0
        Size: 64 GB
        Locator: DIMM151
        Bank Locator: SOCKET 1 CHANNEL 5 DIMM 1
        Size: 64 GB
        Locator: DIMM160
        Bank Locator: SOCKET 1 CHANNEL 6 DIMM 0
        Size: 64 GB
        Locator: DIMM161
        Bank Locator: SOCKET 1 CHANNEL 6 DIMM 1
        Size: 64 GB
        Locator: DIMM170
        Bank Locator: SOCKET 1 CHANNEL 7 DIMM 0
        Size: 64 GB
        Locator: DIMM171
        Bank Locator: SOCKET 1 CHANNEL 7 DIMM 1

从下面信息可以算出来:物理 CPU 理论内存带宽:
单CPU带宽=8通道×4400MT/s×64bit÷8= 281,600MB/s=275 GB/s

$ dmidecode -t memory | grep "Bank Locator"
        Bank Locator: SOCKET 0 CHANNEL 0 DIMM 0
        Bank Locator: SOCKET 0 CHANNEL 0 DIMM 1
        Bank Locator: SOCKET 0 CHANNEL 1 DIMM 0
        Bank Locator: SOCKET 0 CHANNEL 1 DIMM 1
        Bank Locator: SOCKET 0 CHANNEL 2 DIMM 0
        Bank Locator: SOCKET 0 CHANNEL 2 DIMM 1
        Bank Locator: SOCKET 0 CHANNEL 3 DIMM 0
        Bank Locator: SOCKET 0 CHANNEL 3 DIMM 1
        Bank Locator: SOCKET 0 CHANNEL 4 DIMM 0
        Bank Locator: SOCKET 0 CHANNEL 4 DIMM 1
        Bank Locator: SOCKET 0 CHANNEL 5 DIMM 0
        Bank Locator: SOCKET 0 CHANNEL 5 DIMM 1
        Bank Locator: SOCKET 0 CHANNEL 6 DIMM 0
        Bank Locator: SOCKET 0 CHANNEL 6 DIMM 1
        Bank Locator: SOCKET 0 CHANNEL 7 DIMM 0
        Bank Locator: SOCKET 0 CHANNEL 7 DIMM 1
        Bank Locator: SOCKET 1 CHANNEL 0 DIMM 0
        Bank Locator: SOCKET 1 CHANNEL 0 DIMM 1
        Bank Locator: SOCKET 1 CHANNEL 1 DIMM 0
        Bank Locator: SOCKET 1 CHANNEL 1 DIMM 1
        Bank Locator: SOCKET 1 CHANNEL 2 DIMM 0
        Bank Locator: SOCKET 1 CHANNEL 2 DIMM 1
        Bank Locator: SOCKET 1 CHANNEL 3 DIMM 0
        Bank Locator: SOCKET 1 CHANNEL 3 DIMM 1
        Bank Locator: SOCKET 1 CHANNEL 4 DIMM 0
        Bank Locator: SOCKET 1 CHANNEL 4 DIMM 1
        Bank Locator: SOCKET 1 CHANNEL 5 DIMM 0
        Bank Locator: SOCKET 1 CHANNEL 5 DIMM 1
        Bank Locator: SOCKET 1 CHANNEL 6 DIMM 0
        Bank Locator: SOCKET 1 CHANNEL 6 DIMM 1
        Bank Locator: SOCKET 1 CHANNEL 7 DIMM 0
        Bank Locator: SOCKET 1 CHANNEL 7 DIMM 1

$ dmidecode -t memory | grep speed -i
        Speed: 5600 MT/s
        Configured Memory Speed: 4400 MT/s

lstopo

使用lstopo命令来绘制CPU拓扑图。这个命令是hwloc工具的一部分。但是这个在有图形化界面的机器上更好看一些。

sudo apt install hwloc
sudo yum install hwloc
lstopo output.png

文章作者: 易百分
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 易百分 !
  目录