Назад | Перейти на главную страницу

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

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

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

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

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

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 МБ, которые вы скопировали в файловую систему на основе оперативной памяти (при условии, что было достаточно свободной оперативной памяти, вы можете обнаружить, что некоторые из них оказались в свопе, если машина уже чрезмерно зафиксирована с точки зрения использования памяти). Команда "sync; echo 3> / proc / sys / vm / drop_caches" перед каждым вызовом для освобождения должна записывать что-либо, ожидающее выполнения, во все буферы записи (синхронизация) и очищать все кэшированные / буферизованные блоки диска из памяти, так что free будет только читать другие выделения в "кешированном" значении.

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

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

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

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

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

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

Глава 16: Страница и буферный кеш

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

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

Объяснил Красная Шапка:

Страницы кеширования:

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

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

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

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

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

Буферы:

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

Освобождение буфера / кеша

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

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

Preamble

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

$ 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
...

для отслеживания эволюции свопа в реальном времени.

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

The demo
$ 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

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