В чем разница между буфером и кеш-памятью в Linux? - PullRequest
159 голосов
/ 14 июня 2011

Мне не ясно, в чем разница между двумя концепциями памяти Linux: buffer и cache.Я прочитал этот пост , и мне кажется, что разница между ними заключается в политике истечения срока действия:

  1. Политика буфера "первым пришел, первым вышел"
  2. является наименее недавно использованной.

Я прав?

В частности, я смотрю на две команды: free и vmstat

james@utopia:~$ vmstat -S M
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
5  0      0    173     67    912    0    0    19    59   75 1087 24  4 71  1
james@utopia:~$ free -m
             total       used       free     shared    buffers     cached
Mem:          2007       1834        172          0         67        914
-/+ buffers/cache:        853       1153
Swap:         2859          0       2859

Ответы [ 11 ]

165 голосов
/ 22 сентября 2012

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

ссылка цитата

77 голосов
/ 03 февраля 2013

Цитируемый ответ (для справки):

Краткий ответ: Cached - размер кэша страницы. Buffers - это размер буферов ввода / вывода в памяти. Кэшированные вопросы; Буферы в значительной степени не имеют значения.

Длинный ответ: Cached - это размер кэша страниц Linux, за вычетом объема памяти в кэше подкачки, который представлен SwapCached (таким образом, общий размер кэша страниц равен Cached + SwapCached). Linux выполняет все операции ввода-вывода через кеш страниц. Записки реализованы как просто помечающие как грязные соответствующие страницы в кеше страниц; Затем потоки сброса периодически записывают на диск любые грязные страницы. Чтения осуществляются путем возврата данных из кэша страниц; если данные еще не находятся в кэше, они сначала заполняются. В современной системе Linux размер кэшируемого файла может составлять несколько гигабайт. Он будет сокращаться только в ответ на давление памяти. Система будет очищать кэш страниц и выгружать данные на диск, чтобы освободить память по мере необходимости.

Буферы - это блоки ввода-вывода в памяти. Они относительно недолговечны. До версии 2.4 ядра Linux в Linux были отдельные кэши страниц и буферов. Начиная с версии 2.4, кэш страницы и буфера унифицирован, и Buffers - это необработанные дисковые блоки, не представленные в кеше страницы, т. Е. Не данные файла. Таким образом, метрика буферов имеет минимальное значение. В большинстве систем размер буфера составляет всего десятки мегабайт.

63 голосов
/ 14 июня 2011

«Буферы» представляют, сколько части оперативной памяти выделено для блоков кеша.«Cached» похож на «Buffers», только на этот раз он кэширует страницы из файла.

цитата из:

20 голосов
/ 19 апреля 2013

Это не совсем так просто, но может помочь понять:

Буфер для хранения метаданных файла (разрешения, местоположение и т. Д.).Здесь хранится каждая страница памяти.

Кэш предназначен для хранения фактического содержимого файла.

11 голосов
/ 17 сентября 2012

буфер и кеш.

Буфер - это то, что еще не «записано» на диск.

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

9 голосов
/ 14 октября 2017

Объясняется RedHat :

Кэширование страниц:

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

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

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

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

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

Буферы:

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

8 голосов
/ 14 января 2014

Я думаю, что эта страница поможет глубоко понять разницу между буфером и кешем. http://www.tldp.org/LDP/sag/html/buffer-cache.html

Чтение с диска очень медленное по сравнению с доступом к (реальной) памяти. Кроме того, обычно считывают одну и ту же часть диска несколько раз в течение относительно коротких периодов времени. Например, можно сначала прочитать сообщение электронной почты, затем прочитать письмо в редакторе при ответе на него, а затем заставить почтовую программу снова прочитать его при копировании в папку. Или подумайте, как часто команда ls может выполняться в системе с большим количеством пользователей. Считывая информацию с диска только один раз, а затем сохраняя ее в памяти до тех пор, пока она больше не понадобится, можно ускорить все, кроме первого чтения. Это называется дисковой буферизацией, а используемая для этой цели память называется буферным кешем.

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

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

3 голосов
/ 20 января 2016

В ссылке 2 Сета Робертсона сказано: «Для полного понимания этих терминов обратитесь к книге ядра Linux, такой как« Разработка ядра Linux »Роберта М. Лава».

Я нашел некоторые сведения о «буфере» во 2-м издании книги.

Хотя само физическое устройство адресуемо на уровне секторов, ядро ​​выполняет все операции с дисками в виде блоков.

Когда блок сохраняется в памяти (скажем, после чтения или ожидания записи), он сохраняется в «буфере». Каждый «буфер» связан ровно с одним блоком. «Буфер» служит объектом, представляющим блок памяти в памяти.

«Буфер» - это представление отдельного блока физического диска в памяти.

Операции блочного ввода-вывода манипулируют одним дисковым блоком за раз. Распространенной операцией ввода-вывода является чтение и запись inode. Ядро предоставляет функцию bread () для низкоуровневого чтения отдельного блока с диска. Посредством «буферов» дисковые блоки отображаются на связанные страницы в памяти. «

2 голосов
/ 05 апреля 2015

Буфер содержит метаданные, которые помогают улучшить производительность записи

Кэш содержит содержимое самого файла (иногда еще для записи на диск), что улучшает производительность чтения

0 голосов
/ 17 декабря 2018

Цитата из книги: Введение в поиск информации

Cache

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

Buffer

Операционные системы обычно читают и записывают целые блоки. Таким образом, чтение одного байта с диска может занять столько же времени, сколько и чтение всего блока. Размеры блоков 8, 16, 32 и 64 килобайта (КБ) являются общими. Мы называем часть основной памяти, в которой читаемый или записываемый блок хранится, буфером.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...