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

时间:2015-05-13 06:31:53

标签: linux linux-kernel centos

我已执行以下查询。

 root@vps-1161966-22220 [~]# free -m

并输出该命令:

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

我想获得CPU Cache的大小。是否有可能获得缓存的大小以及缓存在这里的用途是什么?

4 个答案:

答案 0 :(得分:5)

如果你想在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字段中检查

答案 1 :(得分:3)

<强> 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

关于这个接口的一个很酷的事情是它只是POSIX sysconf C函数的包装器(缓存参数是非POSIX扩展),因此它也可以从C代码中使用。

在Ubuntu 16.04中测试过。

x86 CPUID指令

CPUID x86指令还提供缓存信息,可以由userland直接访问:https://en.wikipedia.org/wiki/CPUID

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&#34;高速缓存发现&#34;概述。

答案 2 :(得分:1)

对于运行Linux的ARM CPU(在具有Raspbian(32位)的Raspberry Pi 3B +上测试):

“Arm®Cortex®-A53MPCore处理器技术参考手册” 中的一章是“缓存大小选择寄存器” “缓存大小ID”注册” ,包括汇编程序指令。

这些汇编器指令已经可以在Linux内核头文件asm / cachetype.h中使用:set_csselr(...)和read_ccsidr(),但是无法在用户模式下调用这些函数,因此我们需要构建一个内核模块以获取/打印值:

Makefile:

obj-m += cachesize.o

all:

    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

clean:

    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

文件 cachesize.c

#include <asm/cachetype.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Abc defg");
MODULE_DESCRIPTION("Find out ARM cache sizes");
MODULE_VERSION("0.01");

static int __init lkm_example_init(void) {
// Must run in kernel mode
// Assumptions: L1 (instructions + data), L2 (check your CPU manual)
 set_csselr(0);
 printk(KERN_INFO "ccsidr L1 data cache = %08x\n", read_ccsidr());
 set_csselr(1);
 printk(KERN_INFO "ccsidr L1 instruction cache = %08x\n", read_ccsidr());
 set_csselr(2);
 printk(KERN_INFO "ccsidr L2 unified = %08x\n", read_ccsidr());
 return 0;
}

static void __exit lkm_example_exit(void) {
 printk(KERN_INFO "Goodbye, World!\n");
}

module_init(lkm_example_init);
module_exit(lkm_example_exit);

然后:

make
insmode cachesize.ko
rmmod cachesize
dmesg | tail
# Compare numbers to the table "CCSIDR encodings" in the "ARM ... Technical Reference Manual"

答案 3 :(得分:-1)

在我的虚拟机中(Linux dhcppc4 2.6.32-71.el6.i686#1 SMP Wed Sep 1 01:26:34 EDT 2010 i686 i686 i386 GNU / Linux),我无法找到/ sys /设备/系统/节点,但lscpu肯定会提供详细信息。

我在这里看到更多信息 / SYS /装置/系统/ CPU / CPU0 /高速缓存/ *

[root @dhcppc4~] #cat / sys / devices / system / cpu / cpu0 / cache / index0 / size 32K