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的大小.是否有可能获得缓存的大小以及缓存的用途?
如果你想在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字段中检查它
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“缓存发现”。