最可靠方式是读取/sys/devices/system/cpu/cpu0/cache/index0/coherency_line_size,x86-64通常为64字节,ARM64为64或128字节;该值代表L1数据缓存行大小,所有CPU一致,路径不存在则可能因嵌入式系统或老内核导致。

直接读 /sys/devices/system/cpu/cpu0/cache/index0/coherency_line_size
这是最可靠、无需 root 权限、不依赖外部工具的方式。x86-64 通常返回 64,ARM64 可能是 64 或 128,单位始终是字节。
-
index0对应 L1 数据缓存(L1d),其coherency_line_size就是硬件实际使用的缓存行大小 - 所有逻辑 CPU 的该值一致,查
cpu0就够了 - 如果路径不存在(如某些嵌入式系统或老内核
lscpu | grep "Cache line" 只能辅助验证
lscpu 输出的 Cache line sizes 行给出的是 min/max 范围,但对齐必须按最小值来——因为一致性协议以最小粒度操作。
- 典型输出:
Cache line sizes: min: 64 bytes, max: 64 bytes→ 确认是64 - ARM 平台可能出现
min: 64, max: 128→ 仍须按64对齐,否则可能触发 false sharing -
lscpu读取的是内核启动时缓存的拓扑快照,不如/sys/...实时准确;容器中若没装util-linux,它甚至不可用
别信 /proc/cpuinfo 里的 cache_alignment 或 clflushsize
这两个字段名容易误导:它们多数情况下等于缓存行大小,但不是规范定义的来源,且在部分平台(尤其 ARM 或旧微码)可能缺失或错位。
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
-
cache_alignment和clflushsize都只是提示值,不保证与硬件真实 coherency line size 一致 -
/proc/cpuinfo本身不区分缓存层级,无法告诉你这个值对应 L1/L2/L3 中哪一级 - 当
/sys/.../coherency_line_size可用时,应无视这两个字段
代码里做对齐时,alignas(64) 比猜更安全
即使实测是 128,填 64 也完全兼容;但填小了(比如 32)就一定出 false sharing。
- 结构体整体对齐才有效:
struct alignas(64) foo { ... };,单字段对齐(如uint64_t x __attribute__((aligned(64)));)没用 -
alignas值必须是 2 的幂,且 ≥ 真实缓存行大小;64是 x86-64 和主流 ARM64 的安全下界 - 跨架构部署时,别硬编码数值——可运行时读
/sys/.../coherency_line_size后动态对齐(需注意路径权限和存在性)
真实缓存行大小不是“配置项”,而是 CPU 微架构固有属性;所谓“查看设置”,本质是读取硬件暴露的只读参数。最容易被忽略的一点:不同缓存层级(L1/L2/L3)的行大小通常相同,但并非绝对——极少数定制芯片可能分层异构,此时必须确认 index0(L1d)而非随便挑个 index*。










