linux - 如何在 Linux 中获取 CPU 缓存的大小

标签 linux linux-kernel centos cpu cpu-cache

我执行了以下查询:

free -m

这个命令的输出是:

           total       used       free     shared    buffers     cached
Mem:        2048       2018         29          5          0       595

我想获取 CPU 缓存的大小。是否可以获取缓存的大小以及这里的缓存有什么用?

最佳答案

getconf

getconf -a | grep CACHE

给出:

LEVEL1_ICACHE_SIZE                 32768
LEVEL1_ICACHE_ASSOC                8
LEVEL1_ICACHE_LINESIZE             64
LEVEL1_DCACHE_SIZE                 32768
LEVEL1_DCACHE_ASSOC                8
LEVEL1_DCACHE_LINESIZE             64
LEVEL2_CACHE_SIZE                  262144
LEVEL2_CACHE_ASSOC                 8
LEVEL2_CACHE_LINESIZE              64
LEVEL3_CACHE_SIZE                  20971520
LEVEL3_CACHE_ASSOC                 20
LEVEL3_CACHE_LINESIZE              64
LEVEL4_CACHE_SIZE                  0
LEVEL4_CACHE_ASSOC                 0
LEVEL4_CACHE_LINESIZE              0

或者对于单个级别:

getconf LEVEL2_CACHE_SIZE

这个接口(interface)很酷的地方在于它只是 POSIX sysconf C 函数的包装器(缓存参数是非 POSIX 扩展),因此它也可以在 C 代码中使用:

long l2 = sysconf(_SC_LEVEL2_CACHE_SIZE);

测试于 Ubuntu 16.04 (Xenial Xerus)。

x86 CPUID 指令

CPUID x86指令还提供了缓存信息,用户空间可以直接访问。

glibc 似乎对 x86 使用该方法。我还没有通过步调试/指令跟踪来确认,但是 2.28 sysdeps/x86/cacheinfo.c 的来源这样做:

__cpuid (2, eax, ebx, ecx, edx);

TODO:创建一个最小的 C 示例,现在懒惰,询问:How to receive L1, L2 & L3 cache size using CPUID instruction in x86

ARM 也有一个架构定义的机制来通过缓存大小 ID 寄存器 (CCSIDR) 等寄存器查找缓存大小,请参阅 ARMv8 Programmers' Manual 11.6 “缓存发现”概述。

关于linux - 如何在 Linux 中获取 CPU 缓存的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30207256/

相关文章:

linux - linux内核2.4.27中 'Niceness'和 'Goodness'的区别

installation - 在 CentOS 5.6 上安装 cairo 1.8.6

centos - 尝试使用 puppet 更新 root 的 authorized_keys 时权限被拒绝

linux - linux fork不安全吗

linux - winapi 中的 ClipCursor()。我可以在 x11 或 linux 的不同库中使用类似的东西吗?

php - 如何在我的 Linux 服务器中禁用自动文件压缩

c - 内核清零内存?

c - 如何正确实现 kthreads 的完成?

unix - Ansible不使用cp命令复制目录

linux - 理解 linux 参数和管道