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