如何在Linux中获取CPU Cache的大小

Nav*_*hra 2 linux centos linux-kernel

我已执行以下查询.

 root@vps-1161966-22220 [~]# free -m
Run Code Online (Sandbox Code Playgroud)

并且此命令的输出是:

           total       used       free     shared    buffers     cached
Mem:        2048       2018         29          5          0       595
Run Code Online (Sandbox Code Playgroud)

我想获得CPU Cache的大小.是否有可能获得缓存的大小以及缓存的用途?

mya*_*aut 7

如果你想在Linux中获得CPU缓存的大小,最简单的方法是lscpu:

$ lscpu | grep cache
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              15360K
Run Code Online (Sandbox Code Playgroud)

如果要获取有关每个缓存的详细信息,请检查sysfs:

$ SYSNODE=/sys/devices/system/node
$ grep '.*' $SYSNODE/node*/cpu*/cache/index*/* 2>/dev/null | 
    awk '-F[:/]' '{ printf "%6s %6s %24s %s\n" $6, $7, $9, $10, $11 ; }'
node0  cpu0 index0                    level 1
node0  cpu0 index0           number_of_sets 64
node0  cpu0 index0  physical_line_partition 1
node0  cpu0 index0          shared_cpu_list 0,12
node0  cpu0 index0           shared_cpu_map 0000,00001001
node0  cpu0 index0                     size 32K
node0  cpu0 index0                     type Data
node0  cpu0 index0    ways_of_associativity 8
node0  cpu0 index1      coherency_line_size 64
Run Code Online (Sandbox Code Playgroud)

一些缓存实例将被多次看到(每个硬件线程),但您可以在shared_cpu_list字段中检查它


Cir*_*四事件 7

getconf

getconf -a | grep CACHE
Run Code Online (Sandbox Code Playgroud)

给出:

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
Run Code Online (Sandbox Code Playgroud)

或对于单个级别:

getconf LEVEL2_CACHE_SIZE
Run Code Online (Sandbox Code Playgroud)

这个接口的优点是,它只是POSIX sysconfC函数的包装(缓存参数是非POSIX扩展名),因此也可以从C代码中使用它。

在Ubuntu 16.04中测试。

x86 CPUID指令

CPUID x86指令还提供了缓存信息,并且可以由用户级直接访问:https : //en.wikipedia.org/wiki/CPUID

glibc似乎在x86上使用了该方法。我还没有通过逐步调试/指令跟踪来确认,但是2.28的源代码sysdeps/x86/cacheinfo.c做到了:

__cpuid (2, eax, ebx, ecx, edx);
Run Code Online (Sandbox Code Playgroud)

TODO创建一个最小的C示例,现在懒惰,在以下位置询问:如何使用x86中的CPUID指令接收L1,L2和L3缓存大小

ARM还具有一种体系结构定义的机制,可通过诸如缓存大小ID寄存器(CCSIDR)之类的寄存器查找缓存大小,有关概述,请参见《ARMv8程序员手册》 11.6“缓存发现”。