如何识别Linux上的CPU处理器架构
如今,多核处理器架构变得越来越流行。支持高性能计算应用程序、硬件虚拟化和数据中心服务器整合的需求加速了这一趋势。如果您是服务器管理员和云架构师,您必须充分了解服务器的CPU处理器架构,以便部署的应用程序能够充分利用底层硬件能力。
高核心密度硬件的趋势也引导了软件开发的发展,引入了新型并行编程模型。在这些模型下开发的多线程应用程序必须能够利用跨不同内核的并行执行、多级缓存、CPU/内存亲和性等。
本教程介绍如何在 Linux 上通过命令行识别 CPU 处理器架构。 CPU处理器架构的特点是物理插槽/处理器的数量、每个处理器的核心数量、多级(L1/L2/L3)缓存、NUMA(非均匀内存访问)配置等。
方法一:likwid
likwid
((Like I Knew What I'm Doing) is a suite of command line tools that are designed to support application designers for multi-threaded application development. likwid
works with Linux kernel 2.6 and higher, and is regularly updated to support the latest generations of Intel/AMD processors, such as Intel's Sandy, Ivy, Haswell, Broadwell, Skylake processors, and AMD K8, K10, and Bulldozer (Interlagos).
在 Linux 上安装 likwid
$ tar xvfvz likwid-3.0.0.tar.gz
$ cd likwid-3.0.0
$ sudo make install
likwid
附带了几个命令行工具:
likwid-topology
:显示 NUMA 和缓存拓扑。likwid-perfctr
:显示处理器的硬件性能计数器。likwid-features
:显示和更改 Intel Core 2 处理器上的硬件预取控制位。likwid-pin
:将多线程应用程序固定到特定的 CPU。likwid-bench:用于线程汇编内核快速原型设计的基准测试工具。
likwid-mpirun
:支持 MPI 和 MPI/线程混合应用程序的 CPU 固定的脚本。likwid-perfscope:likwid-perfctr 的前端,允许实时绘制性能指标。
likwid-powermeter
:用于访问 RAPL 计数器并查询 Intel 处理器上的 Turbo 模式步骤的工具。likwid-memsweeper
:清理 ccNUMA(缓存一致性 NUMA)内存域的工具。
可视化 CPU 处理器架构:
$ likwid-topology -g
-------------------------------------------------------------
CPU type: Intel Core Westmere processor
*************************************************************
Hardware Thread Topology
*************************************************************
Sockets: 2
Cores per socket: 4
Threads per core: 2
-------------------------------------------------------------
HWThread Thread Core Socket
0 0 0 0
1 0 0 1
2 0 10 0
3 0 10 1
4 0 1 0
5 0 1 1
6 0 9 0
7 0 9 1
8 1 0 0
9 1 0 1
10 1 10 0
11 1 10 1
12 1 1 0
13 1 1 1
14 1 9 0
15 1 9 1
-------------------------------------------------------------
Socket 0: ( 0 8 4 12 6 14 2 10 )
Socket 1: ( 1 9 5 13 7 15 3 11 )
-------------------------------------------------------------
*************************************************************
Cache Topology
*************************************************************
Level: 1
Size: 32 kB
Cache groups: ( 0 8 ) ( 4 12 ) ( 6 14 ) ( 2 10 ) ( 1 9 ) ( 5 13 ) ( 7 15 ) ( 3 11 )
-------------------------------------------------------------
Level: 2
Size: 256 kB
Cache groups: ( 0 8 ) ( 4 12 ) ( 6 14 ) ( 2 10 ) ( 1 9 ) ( 5 13 ) ( 7 15 ) ( 3 11 )
-------------------------------------------------------------
Level: 3
Size: 12 MB
Cache groups: ( 0 8 4 12 6 14 2 10 ) ( 1 9 5 13 7 15 3 11 )
-------------------------------------------------------------
*************************************************************
NUMA Topology
*************************************************************
NUMA domains: 2
-------------------------------------------------------------
Domain 0:
Processors: 0 2 4 6 8 10 12 14
Relative distance to nodes: 10 20
Memory: 4207.48 MB free of total 8181.75 MB
-------------------------------------------------------------
Domain 1:
Processors: 1 3 5 7 9 11 13 15
Relative distance to nodes: 20 10
Memory: 4020.77 MB free of total 8192 MB
-------------------------------------------------------------
*************************************************************
Graphical:
*************************************************************
Socket 0:
+-----------------------------------------+
| +-------+ +-------+ +-------+ +-------+ |
| | 0 8 | | 4 12 | | 6 14 | | 2 10 | |
| +-------+ +-------+ +-------+ +-------+ |
| +-------+ +-------+ +-------+ +-------+ |
| | 32kB | | 32kB | | 32kB | | 32kB | |
| +-------+ +-------+ +-------+ +-------+ |
| +-------+ +-------+ +-------+ +-------+ |
| | 256kB | | 256kB | | 256kB | | 256kB | |
| +-------+ +-------+ +-------+ +-------+ |
| +-------------------------------------+ |
| | 12MB | |
| +-------------------------------------+ |
+-----------------------------------------+
Socket 1:
+-----------------------------------------+
| +-------+ +-------+ +-------+ +-------+ |
| | 1 9 | | 5 13 | | 7 15 | | 3 11 | |
| +-------+ +-------+ +-------+ +-------+ |
| +-------+ +-------+ +-------+ +-------+ |
| | 32kB | | 32kB | | 32kB | | 32kB | |
| +-------+ +-------+ +-------+ +-------+ |
| +-------+ +-------+ +-------+ +-------+ |
| | 256kB | | 256kB | | 256kB | | 256kB | |
| +-------+ +-------+ +-------+ +-------+ |
| +-------------------------------------+ |
| | 12MB | |
| +-------------------------------------+ |
+-----------------------------------------+
上面是 HP ProLiant DL380 G7 的示例输出,其中显示了两个物理插槽、每个插槽中支持超线程的四核 CPU、32kB L1 缓存、256kB L2 缓存和 12MB L3 缓存。
方法二:hwloc
hwloc
是一个命令行套件,它收集了底层处理器架构的各种属性,例如 NUMA 内存节点、多级缓存、处理器插槽、处理器内核、PCI 设备/桥等。
在 Debian、Ubuntu 或 Linux Mint 上安装 hwloc
$ sudo apt-get install hwloc
在 Fedora、CentOS 或 RHEL 上安装 hwloc
$ sudo yum install hwloc
一旦安装了hwloc
软件包,您就可以使用lstopo
来显示处理器架构,如下所示。
$ lstopo --no-io
如果您在 Linux 桌面环境中运行 lstopo
,它将弹出一个窗口,其中可以很好地显示底层处理器架构和缓存层次结构,如下所示。

如果在无桌面服务器环境中调用lstopo
,它将以文本格式显示输出,如下所示。
Machine (16GB)
NUMANode L#0 (P#0 8182MB) + Socket L#0 + L3 L#0 (12MB)
L2 L#0 (256KB) + L1 L#0 (32KB) + Core L#0
PU L#0 (P#0)
PU L#1 (P#8)
L2 L#1 (256KB) + L1 L#1 (32KB) + Core L#1
PU L#2 (P#2)
PU L#3 (P#10)
L2 L#2 (256KB) + L1 L#2 (32KB) + Core L#2
PU L#4 (P#4)
PU L#5 (P#12)
L2 L#3 (256KB) + L1 L#3 (32KB) + Core L#3
PU L#6 (P#6)
PU L#7 (P#14)
NUMANode L#1 (P#1 8192MB) + Socket L#1 + L3 L#1 (12MB)
L2 L#4 (256KB) + L1 L#4 (32KB) + Core L#4
PU L#8 (P#1)
PU L#9 (P#9)
L2 L#5 (256KB) + L1 L#5 (32KB) + Core L#5
PU L#10 (P#3)
PU L#11 (P#11)
L2 L#6 (256KB) + L1 L#6 (32KB) + Core L#6
PU L#12 (P#5)
PU L#13 (P#13)
L2 L#7 (256KB) + L1 L#7 (32KB) + Core L#7
PU L#14 (P#7)
PU L#15 (P#15)
您可以通过指定输出文件,让 lstopo
将处理器架构可视化导出到单独的图像文件,如下所示。
$ lstopo --no-io topo.png
方法三:numactl
numactl
是一个命令行工具,用于调整 NUMA 硬件(例如将进程或线程固定到特定的物理核心或 ccNUMA 节点)。
在 Debian、Ubuntu 或 Linux Mint 上安装 numactl
$ sudo apt-get install numactl
在 Fedora、CentOS 或 RHEL 上安装 numactl
$ sudo yum install numactl
如果您想使用 numactl
检查可用的 NUMA 节点,请执行以下操作:
$ numactl --hardware
available: 2 nodes (0-1)
node 0 cpus: 0 2 4 6 8 10 12 14
node 0 size: 8181 MB
node 0 free: 4235 MB
node 1 cpus: 1 3 5 7 9 11 13 15
node 1 size: 8191 MB
node 1 free: 4048 MB
node distances:
node 0 1
0: 10 20
1: 20 10