我已经执行了以下查询:
free -m
此命令的输出为:
total used free shared buffers cached Mem: 2048 2018 29 5 0 595
我想得到CPU缓存的大小。有没有可能得到该高速缓存的大小,以及缓存在这里有什么用?
nfs0ujit1#
如果你想得到Linux中CPU缓存的大小,最简单的方法是lscpu:
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字段中检查。
shared_cpu_list
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代码中使用它:
sysconf
long l2 = sysconf(_SC_LEVEL2_CACHE_SIZE);
在Ubuntu 16.04(Xenial Xerus)上进行了测试。
x86 CPUID指令
CPUID x86指令还提供缓存信息,可以直接由用户域访问。glibc似乎在x86中使用了该方法。我还没有通过分步调试/指令跟踪进行确认,但2.28 sysdeps/x86/cacheinfo.c的源代码做到了这一点:
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 x86ARM还有一种架构定义的机制,可通过该高速缓存大小ID寄存器(CCSIDR)等寄存器查找缓存大小,有关概述,请参阅ARMv8 Programmers' Manual 11.6“缓存发现”。
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/*中看到了更多信息:
/sys/devices/system/cpu/cpu0/cache/*
cat /sys/devices/system/cpu/cpu0/cache/index0/size
32K
4条答案
按热度按时间nfs0ujit1#
如果你想得到Linux中CPU缓存的大小,最简单的方法是
lscpu
:如果要获取每个缓存的详细信息,请检查sysfs文件系统:
某些缓存示例会多次出现(针对每个硬件线程),但您可以在
shared_cpu_list
字段中检查。fkaflof62#
一月一日
给出:
或者对于单个级别:
这个接口的最酷之处在于它只是POSIX
sysconf
C函数的一个 Package 器(缓存参数是非POSIX扩展),因此也可以从C代码中使用它:在Ubuntu 16.04(Xenial Xerus)上进行了测试。
x86 CPUID指令
CPUID x86指令还提供缓存信息,可以直接由用户域访问。
glibc似乎在x86中使用了该方法。我还没有通过分步调试/指令跟踪进行确认,但2.28
sysdeps/x86/cacheinfo.c
的源代码做到了这一点: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“缓存发现”。
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/*
中看到了更多信息:输出
32K