В чем разница между буфером и кеш-памятью в Linux?

179

Для меня не ясно, в чем разница между двумя концепциями памяти 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
James.Xu
источник
Вы должны дать нам больше контекста, оба термина используются в разных значениях. Вы ссылаетесь на freeвывод команды?
leonbloy
3
вы правы, я смотрю на две команды: free, vmstat. смотрите мои обновления.
James.Xu
1
Вы также можете посетить unix.stackexchange.com
leonbloy

Ответы:

69

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

цитата из:

Сет Робертсон
источник
3
Я проверил это с помощью простой программы на Python, которая записывает большое количество блоков. То, что происходит, - то, что cacheзаполняется как сообщается free -w -h, а не buffersстолбец. Я думаю, что cacheстолбец учитывает как записи на диск, так и чтения на диск и buffersиспользуется для чего-то еще.
CMCDragonkai
@CMCDragonkai спасибо за экспериментальные доказательства. Интересный вопрос заключается в том, пишете ли вы быстрее, чем диск может вымываться. (например, синхронизация займет много времени), что скажет нам, считаются ли грязные блоки иначе, чем чистые. Linux, безусловно, будет кэшировать оба типа (lru, как упомянуто в вопросе), но один гораздо серьезнее с точки зрения нехватки памяти.
Сет Робертсон
179

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

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

хоу
источник
1
Коротко и хорошо объяснил. Спасибо.
любопытный парень
84

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

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

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

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

socketpair
источник
7
«Буферы в значительной степени не имеют значения». Нет. Во многих случаях кэширование содержимого файлов не имеет значения, но хранение метаданных в кэше ускоряет процесс. Например, сервер потокового видео.
Гюнтер Пьез
Любая система, выполняющая много операций ввода-вывода, будет использовать много памяти для буферов. Я загружаю базу данных MySQL / InnoDB объемом 100 ГБ, и буферы постоянно превышают 2 ГБ.
Марсело Пачеко
21

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

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

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

n00ber
источник
5
IOW, Буфер = Метаданные; Кэш = Данные;
Freedom_Ben
13

Объяснено RedHat :

Страницы кэша:

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

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

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

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

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

Буферы:

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

Иджаз Ахмад Хан
источник
12

буфер и кеш.

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

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

ChaiZhi
источник
2
Совет нового пользователя: сделайте свой ответ как можно более четко относящимся к вопросу. Если бы я был тобой, я бы добавил к твоему ответу раздел, начинающийся с «Итак, с твоим примером ...», и немного пояснил бы это.
Петр Вадас
25
Я не думаю, что этот ответ верен в том же контексте, что и вопрос (а именно, что ядро ​​Linux подразумевает под «буфером» и «кэшем»)
Freedom_Ben
8

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

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

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

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

Эрик
источник
Это объясняет, что такое буферный кеш, но не в чем разница между буфером и кешем в выходных данных команд vmstat и free.
Роэль Шровен
4

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

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

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

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

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

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

Чао Инь
источник
2

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

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

Картик
источник
1

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

кэш

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

буфер

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

yantaq
источник
0

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

камеристка
источник