读懂你的服务器:CPU / 内存 / 拓扑与硬件全景
读懂你的服务器CPU / 内存 / 拓扑与硬件全景系列导读《Linux 从入门到高阶4 节点华为云 ECS 全实操》第 3 篇。所有实验均在真实云主机执行输出可复现。摘要 / 写在前面你top看到 8 个 CPU但你知道它们是 4 个物理核开了超线程吗你知道 L1/L2/L3 缓存各多大、谁和谁共享吗你知道为什么有的程序绑错核就慢一倍吗为什么内存明明够延迟却忽高忽低往往和 NUMA、缓存有关本篇是硬件视角的看图说话用 node2ecs-7b14-81c9-0002的真实lscpu、numactl、lstopo、超线程兄弟核、以及一段现场编译运行的Cache 步长基准测试把CPU 架构、超线程、NUMA、缓存层级、字节序一次性讲透。每个数字都来自真实执行逐字段解释其工程含义。关于数据来源的重要说明本系列节点 node1 曾在一次 sshd 加固事故误设PermitRootLogin非法值中导致 root 口令登录临时失效而下线本章硬件普查执行时 node1 仍处于临时下线状态故本章全部实测数据取自 node2ecs-7b14-81c9-0002公网 121.36.x.x。四节点硬件规格完全一致同为 8 vCPU / 14 GiB、KVM 全虚拟化、AMD 平台因此 node2 的结论可完整推广到 node1/node3/node4特此如实说明未编造任何 node1 输出。一、为什么必须读懂硬件原理先行软件性能的上限由硬件拓扑决定。三个最典型的不懂硬件就踩坑场景绑核错误把两个吃 CPU 的线程绑到同一物理核的两个超线程上它们互相抢流水线吞吐反而比不绑还差。NUMA 跨节点访存双路服务器上进程在 node0 却分配了 node1 的内存访存延迟翻倍。本实验虽是单 NUMA 节点但原理必须懂。缓存失效抖动程序访问模式不连续stride 过大或过小会击穿缓存层级延迟从纳秒级跳到百纳秒级——这正是第 3.4 节基准测试要量给你的。读懂lscpu输出的每一行是性能调优、容器编排Kubernetes 的cpu-manager、NUMAtopology-manager、以及数据库/中间件参数设定的前提。二、lscpu 全字段解读node2 真实输出2.1 架构、字节序、地址宽度$ lscpu|head-30;echo--- flags ---;lscpu|grep-o-Evmx|svm|aes|avx2|avx512|sse4_2|ssse3|pni|hypervisor|sort-u|tr\n Architecture: x86_64 CPU op-mode(s): 32-bit, 64-bit Address sizes: 52 bits physical, 48 bits virtual Byte Order: Little Endian CPU(s): 8 On-line CPU(s) list: 0-7 Vendor ID: AuthenticAMD BIOS Vendor ID: Huawei Cloud Model name: General Purpose Processor BIOS Model name: pc-i440fx-7.1 CPU 2.0GHz BIOS CPU family: 1 CPU family: 25 Model: 17 Thread(s) per core: 2 Core(s) per socket: 4 Socket(s): 1 Stepping: 1 BogoMIPS: 4799.99 Flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid tsc_known_freq pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm cmp_legacy cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw topoext perfctr_core ssbd ibrs ibpb stibp vmmcall fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves avx512_bf16 clzero xsaveerptr wbnoinvd arat avx512vbmi umip avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg avx512_vpopcntdq rdpid fsrm Hypervisor vendor: KVM Virtualization type: full L1d cache: 128 KiB (4 instances) L1i cache: 128 KiB (4 instances) L2 cache: 4 MiB (4 instances) L3 cache: 32 MiB (1 instance) NUMA node(s): 1 NUMA node0 CPU(s): 0-7 Vulnerability Gather data sampling: Not affected Vulnerability Indirect target selection: Not affected Vulnerability Itlb multihit: Not affected --- flags --- aes avx2 avx512 hypervisor pni sse4_2 ssse3逐字段解读第一部分架构与身份Architecture: x86_6464 位 x86 架构主流服务器架构。CPU op-mode(s): 32-bit, 64-bit既能跑 64 位也能兼容 32 位程序靠lm长模式标志。老版 32 位库如i386能否跑看这一行。Address sizes: 52 bits physical, 48 bits virtual物理地址 52 位可寻址 2^52 ≈ 4 PB远超实际内存留足扩展空间、虚拟地址 48 位每个进程用户空间 128 TB。这是 x86-64 的规范限制决定了单进程能 mmap 多大。Byte Order: Little Endian小端序——低位字节存低地址。网络协议如 TCP/IP是大端所以代码里常见htons/ntohl做转换理解字节序能避免二进制协议解析错乱。CPU(s): 8与On-line CPU(s) list: 0-7系统可见 8 个逻辑 CPU编号 0~7 全在线没有被离线/禁用的核。lscpu还可能有Off-line CPU(s) list行本机没有即全在线。Vendor ID: AuthenticAMDCPU 厂商是 AMD不是 Intel。BIOS Vendor ID: Huawei Cloud说明固件层标注华为云——云厂商把物理 AMD 核虚拟后vCPU 仍暴露 AMD 标识。底层是 AMD EPYC 平台。Model name: General Purpose Processor/BIOS Model name: pc-i440fx-7.1 CPU 2.0GHz华为云给通用型实例的通用代号pc-i440fx-7.1是 QEMU 机器型号2.0GHz是标称主频。注意这是虚拟主频实际频率会随物理宿主负载波动。CPU family: 25, Model: 17, Stepping: 1AMD 家族 25Zen 3 世代附近model 17步进 1。做内核/微码microcode兼容性判断时会用到。BogoMIPS: 4799.99内核启动时用忙循环粗略估算的每秒百万次假指令约等于主频 2.0GHz 的两倍因为现代 CPU 每周期可跑多条简单指令。BogoMIPS 没有真实性能意义只是内核内部延时循环校准用别拿它比快慢。Hypervisor vendor: KVMVirtualization type: full确认全虚拟化KVM客户机 OS 无感知自己跑在虚拟机里。Flags里含hypervisor标志位也是这个信号。2.2 CPU 拓扑Socket / Core / Thread超线程Thread(s) per core: 2 Core(s) per socket: 4 Socket(s): 1解读Socket × Cores × Threads 1 × 4 × 2 8个逻辑 CPU正好等于CPU(s): 8。Socket物理 CPU 插槽数。这里 1即单路云上单 vCPU 插槽。Core(s) per socket: 4每插槽 4 个物理核。Thread(s) per core: 2每核 2 线程 超线程Hyper-ThreadingAMD 叫 SMT。一个物理核对外暴露 2 个逻辑 CPU它们共享执行单元但各有独立寄存器/状态。工程含义8 个CPU里其实只有 4 个真核。把两个重负载线程分别放cpu0和cpu1同一物理核的两个兄弟线程会互相争抢执行单元放cpu0和cpu2不同物理核才能真正并行。第 3.3 节会给出兄弟线程的真实映射。实测 flags 里含hthyper-threading标志印证了超线程已开启。2.3 缓存层级Cache HierarchyL1d cache: 128 KiB (4 instances) L1i cache: 128 KiB (4 instances) L2 cache: 4 MiB (4 instances) L3 cache: 32 MiB (1 instance)解读括号里的instances是有多少个这样的缓存块L1d数据/ L1i指令各 128 KiB × 4每物理核独享一对 L1数据 32KiB 指令 32KiB4 核 × 32KiB 128KiB所以写 128KiB/4 instances。L1 最快~1ns、最小、每核私有。L2 4 MiB × 4每物理核独享 1 MiB L24 核 × 1MiB 4MiB。L2 比 L1 慢一截但大得多。L3 32 MiB × 1所有 4 核共享32 MiB L3。L3 最慢仍远快于内存但最大是核间共享最后一层缓存。关键认知L1/L2 是核私有的L3 是核共享的。一个核修改了某数据并存在自己 L1另一个核要读就得经 MESI 协议在 L1/L2/L3 间同步——这就是伪共享false sharing“性能坑的来源。第 3.4 节的 Cache 基准测试本质就是在量工作集大小越过 L1→L2→L3→内存边界时延迟怎么变”。2.4 NUMA内存也有就近原则NUMA node(s): 1 NUMA node0 CPU(s): 0-7解读本机只有1 个 NUMA 节点全部 8 个 CPU 都属于node0。NUMANon-Uniform Memory Access非一致内存访问是指多路服务器里CPU 访问本节点内存快、访问远端节点内存慢跨 QPI/UPI 总线有额外延迟。单 NUMA 节点是最简单、最无坑的形态任何 CPU 访存延迟一致无需刻意绑内存。这正适合 8 vCPU 的中小型云主机。但原理必须懂双路/四路物理机常常是 2~4 个 NUMA 节点。如果在那种机器上把进程绑在 node0 的核、却numactl --membind1分配了 node1 的内存跨节点访存会让延迟翻倍、带宽砍半。第 3.2 节用numactl --hardware展示真实拓扑。2.5 Flags你的 CPU 会哪些加速指令Flags一行巨长是 CPU 支持的指令集特性。挑生产最相关的几个aes/sha_ni硬件加解密AES-NI、SHA 扩展。数据库 TLS、磁盘加密、SSH 握手都靠它没有就纯软件算、慢 10 倍以上。avx2/avx512*avx512f/dq/cd/bw/vl/ifma/vbmi/vnni/bitalg/vpopcntdq 等一大串向量化指令单指令并行处理 256/512 位数据。机器学习、科学计算、压缩、图像处理的加速核心。注意avx512 满载时功耗/发热大可能触发降频这也是为什么有些云厂商默认关部分 avx512——但本机完整支持。sse4_2/ssse3/pnisse3 的 SSE4 前称更早的向量扩展老程序也受益。pclmulqdq/vpclmulqdq/gfni多项式乘法用于 AES-GCM、纠删码Ceph/RAID 重建加速。rdseed/rdrand硬件随机数给/dev/random、密钥生成供熵。smep/smap/nx内存保护禁止内核执行用户页、禁止访问用户页安全加固。ibrs/ibpb/stibp/ssbdSpectre/Meltdown 等侧信道漏洞的硬件缓解。hypervisor跑在虚拟机里见 2.1。实测 filters 出的关键子集aes avx2 avx512 hypervisor pni sse4_2 ssse3——印证了加解密、向量化、虚拟化全部就绪。2.6 Vulnerability漏洞缓解状态Vulnerability Gather data sampling: Not affected Vulnerability Indirect target selection: Not affected Vulnerability Itlb multihit: Not affected解读lscpu末尾会列出已知 CPU 侧信道/硬件漏洞及本机的缓解状态Not affected硬件层面不受该漏洞影响、Mitigation: ...已缓解、Vulnerable未缓解需警惕。本机三项均Not affected说明底层 AMD 微架构或云厂商已打微码无需额外处理。生产上若看到Vulnerable要查内核是否开启了对应mitigationson并考虑升级。三、numactl 拓扑与 lstopo 硬件全景3.1numactl --hardware真实拓扑$ numactl--hardwareavailable: 1 nodes (0) node 0 cpus: 0 1 2 3 4 5 6 7 node 0 size: 15131 MB node 0 free: 11313 MB node distances: node 0 0: 10解读available: 1 nodes (0)只有 node0 一个 NUMA 节点。node 0 cpus: 0 1 2 3 4 5 6 7node0 拥有全部 8 个逻辑 CPU。node 0 size: 15131 MB/node 0 free: 11313 MB该节点总内存约 14.77 GiB、空闲约 11.05 GiB与第 1 章free14Gi 量级一致。node distances矩阵0: 10表示访问本节点内存的相对距离 10基准值。多节点机器会出现0: 10 1: 21这样的非对角值跨节点距离更大本机只有对角线说明无任何跨节点延迟。3.2lstopo-no-graphics拓扑树Machine (15GB total) Package L#0 NUMANode L#0 (P#0 15GB) L3 L#0 (32MB) L2 L#0 (1024KB) L1d L#0 (32KB) L1i L#0 (32KB) Core L#0 PU L#0 (P#0) PU L#1 (P#1) L2 L#1 (1024KB) L1d L#1 (32KB) L1i L#1 (32KB) Core L#1 PU L#2 (P#2) PU L#3 (P#3) L2 L#2 (1024KB) L1d L#2 (32KB) L1i L#2 (32KB) Core L#2 PU L#4 (P#4) PU L#5 (P#5) L2 L#3 (1024KB) L1d L#3 (32KB) L1i L#3 (32KB) Core L#3 PU L#6 (P#6) PU L#7 (P#7) HostBridge PCI 00:01.1 (IDE) PCI 00:02.0 (VGA) PCI 00:03.0 (Ethernet) Net eth0 2 x { PCI 00:04.0-05.0 (SCSI) } PCIBridge PCI 02:01.0 (SCSI) Block vda解读这张树把lscpu的扁平字段可视化成真实层级最顶Machine (15GB) 整机。Package L#0CPU 插槽→ 挂一个NUMANode L#0 (15GB)和一层L3 (32MB)。L3 在 Package 下、所有 Core 之上印证 L3 是核共享。往下 4 个Core L#0~L#3每个 Core 下各有 L2(1MB)L1d(32K)L1i(32K)并挂 2 个 PUProcessing Unit 超线程的两个逻辑 CPU。例如Core L#0下是PU L#0 (P#0)和PU L#1 (P#1)——即逻辑 CPU 0 和 1 是同一个物理核的两个超线程与 2.2 的结论吻合。底部HostBridge展开 PCI 设备eth0就是第 2 章ip看到的业务网卡、vda系统盘virtio 块设备对应第 1 章df里的/dev/vda1、VGA/IDE 等虚拟设备。这张图的价值一眼看出绑核该绑哪两个 PU 才是真并行。答案选不同 Core 下的 PU如 P#0 和 P#2而非同一 Core 的 P#0 和 P#1。3.3 超线程兄弟核真实 thread_siblings$forcin0145;doechocpu$csiblings$(cat/sys/devices/system/cpu/cpu$c/topology/thread_siblings_list)core$(cat/sys/devices/system/cpu/cpu$c/topology/core_id);donecpu0 siblings0-1 core0 cpu1 siblings0-1 core0 cpu4 siblings4-5 core2 cpu5 siblings4-5 core2解读cpu0和cpu1的siblings0-1、且core0它们是物理核 0 的两个超线程兄弟。把两个重负载绑到 cpu0cpu1 绑在同一物理核只能分时复用执行单元。cpu4和cpu5的siblings4-5、core2物理核 2 的两个兄弟。推论物理核编号 core_id每个核的两个逻辑 CPU 是core_id与core_id1在本 4 核布局下核 0→cpu0/1核 1→cpu2/3核 2→cpu4/5核 3→cpu6/7。绑核最佳实践要两个真正并行的 CPU选core_id不同的如 cpu0核0 cpu2核1 cpu4核2 cpu6核3若只想要 4 个互不争抢的 CPU就取偶数 cpu0/2/4/6每核一个线程避开 HT 争用某些延迟敏感型负载反而更好。3.4 NUMA 绑定验证numactl 实战$ numactl-C0-3--membind0bash-cecho 当前绑定 CPU mask: $(taskset -p $$); numactl --show | grep -E physcpubind|membind当前绑定 CPU mask: pid 30019s current affinity mask: f physcpubind: 0 1 2 3 membind: 0解读-C 0-3把进程绑定到逻辑 CPU 0~3CPU 亲和性。--membind0把进程的内存强制分配在 NUMA node0。taskset -p $$回显affinity mask: f——十六进制f 二进制1111 只允许跑在 cpu0~3绑定生效。numactl --show确认physcpubind: 0 1 2 3可跑的核、membind: 0内存只从 node0 取。这条命令演示了CPU 亲和性 内存绑定的组合技是数据库如 PostgreSQL 的numactl --interleave、Redis 绑核、DPDK、低延迟交易系统的标准起手式。本机单 NUMA绑定意义主要在避免跨 HT 兄弟核争用和缓存热度稳定不像多 NUMA 那样关乎跨节点延迟但命令本身在多节点机器上价值更大。四、Cache 步长效应用真实基准测试量给你看光说缓存层级抽象不如跑一段程序量出来。下面是在 node2 上现场gcc -O2编译并运行的 C 程序对一个 128MB 的整型数组按不同stride步长每次跳过多少个元素求和统计耗时。#defineN(32*1024*1024)intmain(){int*amalloc(N*sizeof(int));// 128 MBfor(inti0;iN;i)a[i]i;longstrides[]{1,2,4,8,16,32,64,128,256,512,1024};for(...){for(longi0;iN;ist)suma[i];// 只访问 N/st 个元素printf(stride%5ld ints time%8.2f ms\n,st,ms);}}真实输出stride 1 ints time 14.44 ms stride 2 ints time 7.32 ms stride 4 ints time 3.90 ms stride 8 ints time 3.37 ms stride 16 ints time 3.25 ms stride 32 ints time 4.96 ms stride 64 ints time 2.58 ms stride 128 ints time 1.24 ms stride 256 ints time 0.62 ms stride 512 ints time 0.36 ms stride 1024 ints time 0.25 ms CH3_DONE4.1 工作集大小换算与解读关键洞察步长越大实际访存的元素越少工作集working set越小。数组共N32M个 int 128 MB。当步长为st时只访问N/st个元素 128MB / st的数据量stride访问元素数工作集大小主要落点实测耗时132M128 MB远超 L3(32MB)→走内存带宽14.44 ms216M64 MB超 L3→内存7.32 ms48M32 MB≈ L3 边界3.90 ms84M16 MBL3 内3.37 ms162M8 MBL3 内3.25 ms321M4 MBL3 内含 L2/L3 交界噪声4.96 ms64512K2 MBL3 内2.58 ms128256K1 MBL2/L31.24 ms256128K512 KBL2 内0.62 ms51264K256 KBL2 内0.36 ms102432K128 KBL1/L20.25 ms输出解读为什么这样变化stride 1→4工作集 128MB→32MB工作集从远超 L3缩到正好等于 L3 边界。128MB 完全放不进 32MB L3每次访问都要去内存受内存带宽限制所以 stride1 最慢14.44ms步长翻倍→访问量减半→耗时近乎减半7.32ms。这区间瓶颈是带宽不是延迟。stride 8→64工作集 ≤16MB稳在 L3 内数据能塞进 L3延迟远低于内存耗时稳定在 3ms 上下。stride32 出现 4.96ms 的小尖峰是缓存预取器行为/测量噪声导致的正常抖动不代表规律反转。stride 128→1024工作集 ≤1MB落入 L2/L1缓存层级越靠近 CPU延迟越低、带宽越高耗时从 1.24ms 一路降到 0.25ms约快 5 倍。4.2 工程结论工作集小于缓存时程序快得离谱一旦越过缓存边界去内存立刻慢一个数量级——这正是为什么大数据结构要关心大小、为什么热点数据要放缓存友好布局。顺序访问stride1虽触发最多内存流量但硬件预取器flags 里的3dnowprefetch能掩盖部分延迟真正可怕的随机大跨度访问在真实负载里会让缓存完全失效。调优启示把频繁同访问的数据结构控制在缓存容量内如热表、环形缓冲比堆 CPU 更管用超线程、NUMA 的取舍本质都是围绕数据离 CPU 多近在做文章。五、/proc/cpuinfo 关键字段与 lscpu 互证/proc/cpuinfo是 lscpu 的数据源之一。由于本系列只采集了 lscpu 留痕这里结合已确证的字段解读不编造未采集的输出vendor_id : AuthenticAMD、cpu family : 25、model : 17、stepping : 1——与 lscpu 的Vendor ID/CPU family/Model/Stepping完全对应是同一份硬件信息的不同视图。flags :行——lscpu 的Flags即来自此处逐位列出指令集见 2.5。processor : N——N 从 0 到 7共 8 个逻辑处理器条目每个条目是该逻辑 CPU 的视角其中core id/physical id能看出超线程兄弟关系与 3.3 的thread_siblings同源。cpu MHz/cache size——前者是当时频率云上会动态变后者通常是 L2/L3 汇总值具体层级仍以 lscpu//sys/devices/system/cpu/cpu0/cache/为准。想精确看每层缓存可直接读 sysfs本实验已采集见 3.5/sys/devices/system/cpu/cpu0/cache/index{0..3}下的level/type/size/ways_of_associativity/coherency_line_size/shared_cpu_map。5.1 /sys 缓存层级真实数据$foriin0123;dod/sys/devices/system/cpu/cpu0/cache/index$iechoindex$i: level$(cat$d/level)type$(cat$d/type)size$(cat$d/size)ways$(cat$d/ways_of_associativity)line$(cat$d/coherency_line_size)shared$(cat$d/shared_cpu_map)doneindex0: level1 typeData size32K ways8 line64 shared03 index1: level1 typeInstruction size32K ways8 line64 shared03 index2: level2 typeUnified size1024K ways8 line64 shared03 index3: level3 typeUnified size32768K ways16 line64 sharedff解读index0/1L1 数据/指令缓存level1、size32K、ways88 路组相联、line64缓存行 64 字节内存与缓存交换的最小单位、shared03十六进制03二进制0011表示被 cpu0 和 cpu1 共享——即同一物理核的两个超线程再次印证 3.3。index2L2size1024K1MB、shared03同核私有。index3L3size32768K32MB、ways16、sharedff十六进制ff二进制 8 个 1表示被全部 8 个 CPU 共享——所有核共用 L3与 2.3 一致。缓存行 64 字节是重要常数伪共享问题正是两个变量落在同一 64B 缓存行、被不同核修改导致该行反复在核间失效。理解line64才能懂____cacheline_aligned这类对齐技巧。六、避坑 调优建议别被 8 个 CPU 骗了本质是 4 核 超线程。CPU 密集型负载按4 核规划并行度超线程当作约 30% 额外吞吐红利而非翻倍。绑核避开 HT 兄弟延迟敏感/CPU 密集型优先选不同core_id的逻辑 CPU偶数 cpu0/2/4/6避免两个重负载挤同一物理核。NUMA 单节点是福也是盲区本机单 NUMA 无跨节点烦恼但上了双路物理机务必numactl --hardware先看 topology再决定--membind/--cpunodebind否则跨节点访存悄悄拖慢。工作集是性能开关把热点数据规模压进 L2/L3本机 L332MB比加机器立竿见影。Cache 基准已证明工作集 128MB→128KB耗时 14ms→0.25ms快 57 倍。加密/向量指令别浪费确认 flags 有aes/avx2/avx512编译时开-marchnative或对应-mavx2让程序真正用上硬件加速。sshd -t先于一切重启虽是硬件篇仍要提醒——任何改动含内核/微码相关若涉及 sshd 配置先sshd -t校验避免重蹈 node1 加固事故覆辙本章数据因此取自 node2。七、小结lscpu 不是装饰Socket×Core×Thread算出真实并行度L1/L2/L3标注私有/共享NUMA揭示内存就近原则Flags列出全部硬件加速能力Vulnerability暴露安全缓解状态。8 个 CPU 4 物理核 × 2 超线程兄弟线程映射由thread_siblings确证cpu0/1 同核、cpu4/5 同核。单 NUMA 节点让本机内存访问一致、无跨节点惩罚numactl -C 0-3 --membind0演示了 CPU 亲和 内存绑定的标准组合技。Cache 步长基准实证工作集从 128MB 缩到 128KB耗时从 14.44ms 降到 0.25ms快 57 倍量化了缓存边界性能悬崖。一句话结论服务器的性能密码写在lscpu、numactl、/sys缓存层级和一段 Cache 基准里——读懂它你的调优才不是玄学。附本文实验环境 / 一键复现脚本# lscpu 全字段 关键 flags 过滤node2 实测lscpu|head-30lscpu|grep-o-Evmx|svm|aes|avx2|avx512|sse4_2|ssse3|pni|hypervisor|sort-u|tr\n ;echo# NUMA 拓扑与硬件全景 numactl--hardwarelstopo-no-graphics2/dev/null|head-25# /sys 逐层缓存 foriin0123;dod/sys/devices/system/cpu/cpu0/cache/index$iechoindex$i: level$(cat$d/level)type$(cat$d/type)size$(cat$d/size)ways$(cat$d/ways_of_associativity)line$(cat$d/coherency_line_size)shared$(cat$d/shared_cpu_map)done# 超线程兄弟核 forcin0145;doechocpu$csiblings$(cat/sys/devices/system/cpu/cpu$c/topology/thread_siblings_list)core$(cat/sys/devices/system/cpu/cpu$c/topology/core_id)done# NUMA 绑定验证 numactl-C0-3--membind0bash-cecho mask: $(taskset -p $$); numactl --show | grep -E physcpubind|membind# Cache 步长基准现场编译运行cat/tmp/cachebench.cEOF #include stdio.h #include stdlib.h #include time.h #define N (32*1024*1024) int main(){ int *a malloc(N*sizeof(int)); for(int i0;iN;i) a[i]i; long strides[]{1,2,4,8,16,32,64,128,256,512,1024}; for(int s0;s11;s){ long ststrides[s]; struct timespec t0,t1; clock_gettime(CLOCK_MONOTONIC,t0); volatile long sum0; for(long i0;iN;ist) suma[i]; clock_gettime(CLOCK_MONOTONIC,t1); double ms(t1.tv_sec-t0.tv_sec)*1e3(t1.tv_nsec-t0.tv_nsec)/1e6; printf(stride%5ld ints time%8.2f ms\n, st, ms); } free(a); return 0; } EOFgcc-O2/tmp/cachebench.c-o/tmp/cachebench/tmp/cachebench