Вопрос: В Linux, в чем разница между «буферами» и «кешем», сообщаемыми свободной командой?


Это старый вопрос, который я видел время от времени. Мое понимание этого довольно ограничено (прочитав о различиях давным-давно, но фактоид (-и) не зациклился никогда).

Как я понимаю,

  • Буферы

    Используются программами с активными операциями ввода-вывода, то есть данными, ожидающими записи на диск

  • кэш

    Является результатом выполненных операций ввода-вывода, то есть буферов, которые были сброшены или данные считываются с диска для удовлетворения запроса.

Могу ли я получить четкое объяснение для потомков?


67
2018-06-10 15:46


Источник


stackoverflow.com/questions/6345020/... - Ciro Santilli 新疆改造中心 六四事件 法轮功
Это больше похоже на метаданные, которые вы находите в буферах, это не связано с буферами io. Некоторые из буферов ядра учитываются в распределителе slab, но не учитываются для буферов или кэш-памяти. - eckes


Ответы:


«Кэшированная» сумма также будет включать в себя некоторые другие распределения памяти, такие как любые файлы tmpfs filesytems. Чтобы увидеть это, попробуйте:

mkdir t
mount -t tmpfs none t
dd if=/dev/zero of=t/zero.file bs=10240 count=10240
sync; echo 3 > /proc/sys/vm/drop_caches; free -m
umount t
sync; echo 3 > /proc/sys/vm/drop_caches; free -m

и вы увидите, что значение «кеш-памяти» уменьшилось на 100 Мб, которое вы скопировали в файловую систему на основе ram (при условии, что было достаточно свободной ОЗУ, вы можете обнаружить, что некоторые из них оказались в swap, если машина уже перегружена в терминах использования памяти). «Sync; echo 3> / proc / sys / vm / drop_caches» перед каждым свободным вызовом должен записывать что-либо в ожидании во всех буферах записи (синхронизация) и очищать все кэшированные / буферизованные блоки диска из памяти, поэтому свободный будет читать только другие распределения в «кэшированном» значении.

ОЗУ, используемое виртуальными машинами (например, работающими под VMWare), также может учитываться в «кэшированном» значении free, равно как и оперативная память, используемая в настоящее время открытыми файлами с отображением памяти (это будет зависеть от используемого вами гипервизора / версии и возможно, и между версиями ядра).

Таким образом, это не так просто, как «буферы подсчитывают ожидающие записи в файлах / сетях и кэшированные подсчеты недавно прочитанных / записанных блоков, хранящихся в ОЗУ, чтобы сохранить будущие физические чтения», хотя для большинства целей это более простое описание будет сделано.


41
2018-06-10 16:26



+1 для интересных нюансов. Это та информация, которую я ищу. На самом деле, я подозреваю, что цифры настолько запутаны, что задействованы во множестве различных видов деятельности, что они в лучшем случае являются общими показателями. - Avery Payne
Я не думаю, что оперативная память, используемая виртуальными машинами, считается «кэшированной», по крайней мере, для qemu-kvm. Я замечаю, что на моем хосте KVM значение кеша не только слишком мало, чтобы быть правильным (на 1.9 Gig), но оно не изменяется, если я уничтожу / запустил одну из моих виртуальных машин. Он также не изменяется, если я выполняю трюк tmpfs на одной из виртуальных машин. Я создал там раздел 800meg tmpfs, и «кэшированный» показал правильные значения на виртуальной машине, но на хосте VM он не изменился. Но «используемое» значение уменьшилось / увеличилось, когда я уничтожил / начал свою виртуальную машину. - Mike S
... Я запускал тесты на хосте CN Centos 7.2.1511 с запуском ядра 3.10.0-327. - Mike S
@MikeS: как разные решения для виртуализации обрабатывают память, могут меняться, ведь как ядро ​​измеряет различные виды использования памяти, может измениться между основными версиями. - David Spillett
@MikeS: Что касается «выполнить трюк tmpfs mount на одной из виртуальных машин» - I, который не повлияет на показания хоста, если они не отображают другую память, используемую виртуальной машиной. Я вижу эффект в самой виртуальной машине KVM: до dd free = 2020, после dd free = 1899, после drop fs free = 2001 (разница 19Mb будет вызвана другими процессами на VM, она не была бездействующей, когда я бежал тест). Хост может не увидеть изменения: память, вероятно, все еще выделена для виртуальной машины, хотя она бесплатна для использования процессами в виртуальной машине. - David Spillett


Каверзный вопрос. Когда вы вычисляете свободное пространство, вам действительно нужно добавить буфер и кеш. Это то, что я мог найти

Буфер - это то, что еще не «записано» на диск. Кэш - это то, что было «прочитано» с диска и сохранено для последующего использования.

http://visualbasic.ittoolbox.com/documents/difference-between-buffer-and-cache-12135


8
2018-06-11 12:01





Я искал более четкое описание буфера и нашел в "Professional Linux Kernel Architecture 2008"

Глава 16: Кэш страницы и буфера

взаимодействие

Настройка ссылки между страницами и буферами нецелесообразна, если   нет никаких преимуществ для других частей ядра. Как уже отмечалось,   некоторые операции переноса на и с блочных устройств могут потребоваться   выполняется в единицах, размер которых зависит от размера блока   в то время как многие части ядра предпочитают переносить   операции ввода-вывода со степенью детализации страницы, поскольку это делает многое   проще - особенно с точки зрения управления памятью. В этом   сценарии, буферы действуют как посредники между двумя мирами.


5
2018-01-23 08:07





Свободный буфер / кеш

Предупреждение Это объясняет сильный метод, не рекомендованный на производственном сервере! Поэтому вас предупреждают, не обвиняйте меня, если что-то пойдет не так.

Для понимания, вещь, вы могли бы сила вашей системы, чтобы делегировать как можно больше памяти для cache чем отбросить кешированный файл:

преамбула

Прежде чем выполнить тест, вы можете открыть другое окно:

$ vmstat -n 1
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 0  1  39132  59740  39892 1038820    0    0     1     0    3    3  5 13 81  1
 1  0  39132  59140  40076 1038812    0    0   184     0 10566 2157 27 15 48 11
...

для последующей эволюции свопа в реальном времени.

Nota: Вы должны избавиться от количества свободного диска в текущем каталоге, у вас есть mem + swap

Демонстрация
$ free
         total       used       free     shared    buffers     cached
Mem:       2064396    2004320      60076          0      90740     945964
-/+ buffers/cache:     967616    1096780
Swap:      3145720      38812    3106908

$ tot=0
$ while read -a line;do
      [[ "${line%:}" =~ ^(Swap|Mem)Total$ ]] && ((tot+=2*${line[1]}))
    done </proc/meminfo
$ echo $tot
10420232

$ dd if=/dev/zero of=veryBigFile count=$tot
10420232+0 records in
10420232+0 records out
5335158784 bytes (5.3 GB) copied, 109.526 s, 48.7 MB/s

$ cat >/dev/null veryBigFile

$ free
             total       used       free     shared    buffers     cached
Mem:       2064396    2010160      54236          0      41568    1039636
-/+ buffers/cache:     928956    1135440
Swap:      3145720      39132    3106588

$ rm veryBigFile 

$ free
         total       used       free     shared    buffers     cached
Mem:       2064396    1005104    1059292          0      41840      48124
-/+ buffers/cache:     915140    1149256
Swap:      3145720      39132    3106588

Нота, хозяин, на котором я это сделал, сильно используется. Это будет более значительным на действительно тихой машине.


2
2018-02-25 13:41



-1 если бы мог. Это как (A), не относящееся к заданному вопросу, так и (B) ужасно тупой способ запуска кеширования. Существуют прямые способы сделать последнее, поэтому не стоит подстраивать под действие системы, рассылая ее данными до тех пор, пока она не станет как побочный эффект - underscore_d


Объясняется Красная Шапка:

Кэш-страницы:

Кэш - это часть памяти, которая прозрачно хранит данные, так что будущие запросы на эти данные могут обслуживаться быстрее. Эта память используется ядром для кэширования данных диска и улучшения производительности ввода-вывода.

Ядро Linux построено таким образом, что будет использовать как можно больше ОЗУ, чтобы кэшировать информацию из локальных и удаленных файловых систем и дисков. По мере того как время проходит через различные чтения и записи, выполняемые в системе, ядро ​​пытается сохранить данные, хранящиеся в памяти, для различных процессов, которые выполняются в системе, или данных соответствующих процессов, которые будут использоваться в ближайшем будущем. Кэш не восстанавливается в то время, когда процесс получает stop / exit, однако, когда другим процессам требуется больше памяти, тогда свободная доступная память, ядро ​​запускает эвристику для восстановления памяти путем хранения данных кэша и выделения этой памяти для нового процесса.

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

Данные, хранящиеся в кеше, могут быть значениями, которые были вычислены ранее или дублированы исходными значениями, которые хранятся в другом месте на диске. Когда запрашиваются некоторые данные, сначала проверяется кеш, чтобы узнать, содержит ли он эти данные. Данные можно получить быстрее из кеша, чем из исходного источника.

Сегменты разделяемой памяти SysV также учитываются как кеш, хотя они не представляют никаких данных на дисках. Можно проверить размер разделяемых сегментов памяти с помощью команды ipcs -m и проверить столбец байтов.

Буферы:

Буферы представляют собой представление на диске данных, которые хранятся в кэшах страниц. Буферы содержат метаданные файлов / данных, которые находятся в кеше страницы. Пример. Когда есть запрос любых данных, которые присутствуют в кеше страницы, сначала ядро ​​проверяет данные в буферах, которые содержат метаданные, которые указывают на фактические файлы / данные, содержащиеся в кэшах страниц. Как только из метаданных известен фактический адрес блока файла, он обрабатывается ядром для обработки.


2
2017-10-14 20:36