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

vqlkdk9b  于 2022-11-07  发布在  Linux
关注(0)|答案(4)|浏览(177)

我已经执行了以下查询:

free -m

此命令的输出为:

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

我想得到CPU缓存的大小。有没有可能得到该高速缓存的大小,以及缓存在这里有什么用?

nfs0ujit

nfs0ujit1#

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

$ lscpu | grep cache
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              15360K

如果要获取每个缓存的详细信息,请检查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

某些缓存示例会多次出现(针对每个硬件线程),但您可以在shared_cpu_list字段中检查。

fkaflof6

fkaflof62#

一月一日

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

这个接口的最酷之处在于它只是POSIX sysconf C函数的一个 Package 器(缓存参数是非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示例,lazy now,请求位置:How to receive L1, L2 & L3 cache size using CPUID instruction in x86
ARM还有一种架构定义的机制,可通过该高速缓存大小ID寄存器(CCSIDR)等寄存器查找缓存大小,有关概述,请参阅ARMv8 Programmers' Manual 11.6“缓存发现”。

50pmv0ei

50pmv0ei3#

在我的虚拟机(Linux dhcppc 4 2.6.32-71.el6.i686 #1 SMP星期三9月1日01:26:34 EDT 2010 i686 i686 i386 GNU/Linux)中,我找不到 /sys/devices/system/node,但lscpu确实提供了详细信息。
我在/sys/devices/system/cpu/cpu0/cache/*中看到了更多信息:

cat /sys/devices/system/cpu/cpu0/cache/index0/size

输出

32K

相关问题