10

Есть ли способ узнать размер кеша L1, L2, L3 и оперативной памяти в Ubuntu?

Любая команда терминала или файлы, которые я мог бы изучить?

4 ответа4

9

Информация о процессоре

Используйте команду lscpu :

$ lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                2
On-line CPU(s) list:   0,1
Thread(s) per core:    1
Core(s) per socket:    2
Socket(s):             1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            15
Model:                 6
Stepping:              5
CPU MHz:               2400.000
BogoMIPS:              6000.33
L1d cache:             16K
L2 cache:              2048K
NUMA node0 CPU(s):     0,1

Перечисленная информация относится к ядру процессора.

Информация о памяти

Есть свободная команда (-h дает результаты в удобочитаемой форме, т.е. GiB, а не байты):

$ free -h
             total       used       free     shared    buffers     cached
Mem:          2.0G       390M       1.6G        10M        15M       160M
-/+ buffers/cache:       215M       1.7G
Swap:         2.0G         0B       2.0G
3

Это даст вам информацию о вашем кеше. Обозначение сокета скажет вам, на какой кеш ссылается данный раздел.

sudo dmidecode -t cache

Для оперативной памяти есть пара вещей, на которые нужно обратить внимание, но meminfo должен это сделать Я использовал grep здесь, чтобы показать только total/free, но вы можете использовать less или cat, чтобы увидеть все это. Он показывает гораздо больше информации об объеме памяти и использовании, чем просто размер.

grep Mem /proc/meminfo
1

Основываясь на ответе jkabrams с помощью следующей команды и отфильтровывая из нее "кеш", каждый элемент кеша вам будет показан.

lscpu | grep cache

и оперативная память:

free -h

Для получения дополнительной информации об оперативной памяти, процессах и т.д. Вы можете использовать htop в своем дистрибутиве. Установите это так на Ubuntu.

sudo apt-get install htop
0

sysfs

for d in /sys/devices/system/cpu/cpu0/cache/index*;
  do tail -c+1 $d/{level,type,size}
  echo
done

дает:

==> /sys/devices/system/cpu/cpu0/cache/index0/level <==
1

==> /sys/devices/system/cpu/cpu0/cache/index0/type <==
Data

==> /sys/devices/system/cpu/cpu0/cache/index0/size <==
32K

==> /sys/devices/system/cpu/cpu0/cache/index1/level <==
1

==> /sys/devices/system/cpu/cpu0/cache/index1/type <==
Instruction

==> /sys/devices/system/cpu/cpu0/cache/index1/size <==
32K

==> /sys/devices/system/cpu/cpu0/cache/index2/level <==
2

==> /sys/devices/system/cpu/cpu0/cache/index2/type <==
Unified

==> /sys/devices/system/cpu/cpu0/cache/index2/size <==
256K

==> /sys/devices/system/cpu/cpu0/cache/index3/level <==
3

==> /sys/devices/system/cpu/cpu0/cache/index3/type <==
Unified

==> /sys/devices/system/cpu/cpu0/cache/index3/size <==
8192K

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

Крутая вещь в этом интерфейсе состоит в том, что он является просто оболочкой для функции C POSIX sysconf (аргументы кэша не являются расширениями POSIX), и поэтому его можно использовать и из кода C.

Проверено в Ubuntu 16.04.

инструкция CPUID x86

Инструкция CPUID x86 также предлагает информацию о кеше, и доступ к ней может быть получен непосредственно пользователем: https://en.wikipedia.org/wiki/CPUID

Glibc, похоже, использует этот метод для x86. Я не подтвердил пошаговую отладку / трассировку инструкций, но источник для 2.28 sysdeps/x86/cacheinfo.c делает это:

__cpuid (2, eax, ebx, ecx, edx);

TODO создать минимальный пример C, ленивый сейчас, по адресу: https://stackoverflow.com/questions/14283171/how-to-receive-l1-l2-l3-cache-size-using-cpuid-instruction-in-x86

В ARM также есть механизм, определяемый архитектурой для определения размеров кэша через регистры, такие как регистр идентификатора размера кэша (CCSIDR), см. Руководство для программистов ARMv8 11.6 "Обнаружение кэша".

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .