Qual é a diferença entre buffer e memória cache no Linux?

179

Para mim, não está claro qual é a diferença entre os dois conceitos de memória do Linux: buffere cache. Eu li este post e me parece que a diferença entre eles é a política de expiração:

  1. a política do buffer é a primeira a entrar, a primeira a sair
  2. a política do cache é Menos Utilizada Recentemente.

Estou certo?

Em particular, estou olhando para os dois comandos: freeevmstat

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
fonte
Você deve nos dar mais contexto, ambos os termos são usados ​​com significados diferentes. Você está se referindo à freesaída do comando?
leonbloy
3
você está certo, eu estou olhando para os dois comandos: free, vmstat. veja minhas atualizações.
James.Xu
1
Você também pode visitar unix.stackexchange.com
leonbloy 14/06

Respostas:

69

"Buffers" representam quanta porção de RAM é dedicada ao cache de blocos de disco. "Em cache" é semelhante a "Buffers", só que desta vez ele armazena em cache as páginas da leitura do arquivo.

Citação do:

Seth Robertson
fonte
3
Eu testei isso usando um programa python simples que grava grandes quantidades de blocos. O que acontece é que os cachepreenchimentos são preenchidos conforme relatado por free -w -h, não a bufferscoluna. Eu acho que a cachecoluna conta as gravações e leituras do disco e buffersé usada para outra coisa.
CMCDragonkai # 25/18
@CMCDragonkai, obrigado pela evidência experimental. A questão interessante é se você estava escrevendo mais rápido do que o disco poderia liberar. (por exemplo, a sincronização levaria muito tempo), informando se os blocos sujos são contados de forma diferente dos limpos. O Linux certamente armazenará em cache os dois tipos (lru como mencionado na pergunta), mas um é muito mais sério em termos de pressão de memória.
Seth Robertson
179

Os buffers são associados a um dispositivo de bloco específico, e cobrem o cache dos metadados do sistema de arquivos, bem como o rastreamento de páginas em andamento. O cache contém apenas dados do arquivo estacionado. Ou seja, os buffers lembram o que há nos diretórios, quais são as permissões de arquivo e acompanham de que memória está sendo gravada ou lida para um dispositivo de bloco específico. O cache contém apenas o conteúdo dos arquivos em si.

link de citação

xoy
fonte
1
Curto e bem explicado. Obrigado.
precisa saber é o seguinte
84

Resposta citada (para referência):

Resposta curta: Em cache é o tamanho do cache da página. Buffers é o tamanho dos buffers de E / S do bloco de memória. Assuntos em cache; Buffers é em grande parte irrelevante.

Resposta longa: em cache é o tamanho do cache da página Linux, menos a memória no cache de troca, que é representada por SwapCached (portanto, o tamanho total do cache da página é em cache + SwapCached). O Linux executa todas as E / S de arquivo através do cache da página. As gravações são implementadas simplesmente marcando como sujas as páginas correspondentes no cache da página; os encadeamentos do lavador gravam periodicamente no disco todas as páginas sujas. As leituras são implementadas retornando os dados do cache da página; se os dados ainda não estiverem no cache, serão preenchidos primeiro. Em um sistema Linux moderno, o Cached pode facilmente ter vários gigabytes. Reduzirá apenas em resposta à pressão da memória. O sistema limpará o cache da página juntamente com a troca de dados para o disco para disponibilizar mais memória conforme necessário.

Buffers são buffers de E / S de bloco de memória. Eles são relativamente de curta duração. Antes do kernel Linux versão 2.4, o Linux tinha caches de página e buffer separados. Desde a 2.4, o cache da página e do buffer são unificados e Buffers são blocos de disco bruto não representados no cache da página - ou seja, não são dados de arquivo. A métrica de buffers é, portanto, de importância mínima. Na maioria dos sistemas, os buffers costumam ter apenas dezenas de megabytes.

socketpair
fonte
7
"Buffers é em grande parte irrelevante" - Não. Existem muitos casos em que o cache do conteúdo do arquivo é irrelevante, mas manter os metadados no cache acelera as coisas. Um servidor NAS de streaming de vídeo, por exemplo.
Gunther Piez
Qualquer sistema que execute muitas E / S utilizará muita memória para buffers. Estou carregando em massa um banco de dados MySQL / InnoDB de 100 GB e os buffers ficam acima de 2 GB o tempo todo.
Marcelo Pacheco
21

Não é tão simples assim, mas pode ajudar a entender:

O buffer é para armazenar metadados de arquivo (permissões, localização, etc.). Cada página de memória é mantida por aqui.

O cache é para armazenar o conteúdo real do arquivo.

n00ber
fonte
5
IOW, Buffer = Metadados; Cache = Dados;
Freedom_Ben
13

Explicado pelo RedHat :

Páginas de cache:

Um cache é a parte da memória que armazena dados de forma transparente, para que solicitações futuras desses dados possam ser atendidas mais rapidamente. Essa memória é utilizada pelo kernel para armazenar em cache os dados do disco e melhorar o desempenho de E / S.

O kernel do Linux é construído de tal maneira que utilizará o máximo de RAM possível para armazenar informações em cache dos sistemas e discos de arquivos locais e remotos. À medida que o tempo passa por várias leituras e gravações, são executadas no sistema, o kernel tenta manter os dados armazenados na memória para os vários processos em execução no sistema ou os dados dos processos relevantes que seriam usados ​​em um futuro próximo. O cache não é recuperado no momento em que o processo é interrompido / sai; no entanto, quando os outros processos exigem mais memória do que a memória disponível livre, o kernel executará heurísticas para recuperar a memória, armazenando os dados do cache e alocando essa memória para o novo processo.

Quando qualquer tipo de arquivo / dado é solicitado, o kernel procurará uma cópia da parte do arquivo em que o usuário está atuando e, se essa cópia não existir, alocará uma nova página de memória cache e a preencherá com o conteúdo apropriado é lido do disco.

Os dados armazenados em um cache podem ser valores calculados anteriormente ou duplicados de valores originais armazenados em outro local do disco. Quando alguns dados são solicitados, o cache é primeiro verificado para ver se contém esses dados. Os dados podem ser recuperados mais rapidamente do cache do que de sua origem de origem.

Os segmentos de memória compartilhada do SysV também são contabilizados como um cache, embora não representem dados nos discos. Pode-se verificar o tamanho dos segmentos de memória compartilhada usando o comando ipcs -m e verificando a coluna de bytes.

Buffers:

Buffers são a representação do bloco de disco dos dados armazenados nos caches da página. Buffers contém os metadados dos arquivos / dados que residem no cache da página. Exemplo: Quando há uma solicitação de qualquer dado presente no cache da página, primeiro o kernel verifica os dados nos buffers que contêm os metadados que apontam para os arquivos / dados reais contidos nos caches da página. Uma vez que os metadados são conhecidos, o endereço de bloco real do arquivo é captado pelo kernel para processamento.

Ijaz Ahmad Khan
fonte
12

buffer e cache.

Um buffer é algo que ainda precisa ser "gravado" no disco.

Um cache é algo que foi "lido" do disco e armazenado para uso posterior.

ChaiZhi
fonte
2
nova dica de usuário: faça sua resposta o mais claramente possível relacionada à pergunta. Se eu fosse você, acrescentaria à sua resposta uma seção começando com "Então, com o seu exemplo ..." e elaboraria um pouco sobre isso.
Piotr Wadas
25
Eu não acho que esta resposta é verdadeiro no mesmo contexto da questão (ou seja, o que significa o Linux kernel "tampão" e "cache"
Freedom_Ben
8

Acho que esta página ajudará a entender profundamente a diferença entre buffer e cache. http://www.tldp.org/LDP/sag/html/buffer-cache.html

A leitura de um disco é muito lenta em comparação com o acesso à memória (real). Além disso, é comum ler a mesma parte de um disco várias vezes durante períodos relativamente curtos. Por exemplo, pode-se primeiro ler uma mensagem de email, depois ler a carta em um editor ao responder a ela e fazer com que o programa de email a leia novamente ao copiá-la para uma pasta. Ou considere com que frequência o comando lspode ser executado em um sistema com muitos usuários. Lendo as informações do disco apenas uma vez e mantendo-as na memória até que não sejam mais necessárias, é possível acelerar tudo, exceto a primeira leitura. Isso é chamado de buffer de disco e a memória usada para esse fim é chamada de cache do buffer.

Como a memória é, infelizmente, um recurso finito, ou escasso, o cache do buffer geralmente não pode ser grande o suficiente (não pode conter todos os dados que se deseja usar). Quando o cache fica cheio, os dados que não foram utilizados por mais tempo são descartados e a memória liberada é usada para os novos dados.

O buffer de disco também funciona para gravações. Por um lado, os dados gravados geralmente são lidos em breve novamente (por exemplo, um arquivo de código-fonte é salvo em um arquivo e depois lido pelo compilador); portanto, colocar os dados gravados no cache é uma boa idéia. Por outro lado, colocando apenas os dados no cache e não os gravando no disco de uma só vez, o programa que grava é executado mais rapidamente. As gravações podem ser feitas em segundo plano, sem diminuir a velocidade dos outros programas.

Eric
fonte
Isso explica o que é o cache do buffer, mas não qual a diferença entre o buffer e o cache nas saídas dos comandos vmstat e free.
Roel Schroeven 29/03/19
4

O Link 2 de Seth Robertson disse "Para uma compreensão completa desses termos, consulte o livro do kernel do Linux, como o Linux Kernel Development, por Robert M. Love".

Encontrei alguns conteúdos sobre 'buffer' na 2ª edição do livro.

Embora o próprio dispositivo físico seja endereçável no nível do setor, o kernel executa todas as operações do disco em termos de blocos.

Quando um bloco é armazenado na memória (digamos, após uma leitura ou gravação pendente), ele é armazenado em um 'buffer'. Cada 'buffer' está associado a exatamente um bloco. O 'buffer' serve como o objeto que representa um bloco de disco na memória.

Um 'buffer' é a representação na memória de um único bloco de disco físico.

As operações de E / S de bloco manipulam um único bloco de disco por vez. Uma operação de E / S de bloco comum é a leitura e gravação de inodes. O kernel fornece a função bread () para executar uma leitura de baixo nível de um único bloco do disco. Por meio de 'buffers', os blocos de disco são mapeados para as páginas associadas na memória. "

Chao Yin
fonte
2

O buffer contém metadados que ajudam a melhorar o desempenho da gravação

O cache contém o próprio conteúdo do arquivo (às vezes ainda não foi gravado no disco), o que melhora o desempenho da leitura

Karthik
fonte
1

Citação do livro: Introdução à recuperação de informações

Cache

Queremos manter o máximo de dados possível na memória, especialmente aqueles que precisamos acessar com freqüência. Chamamos a técnica de manter dados de disco usados ​​com freqüência no cache da memória principal.

Amortecedor

Os sistemas operacionais geralmente leem e gravam blocos inteiros. Portanto, a leitura de um único byte do disco pode levar tanto tempo quanto a leitura de todo o bloco. Os tamanhos de bloco de 8, 16, 32 e 64 kilobytes (KB) são comuns. Chamamos a parte da memória principal em que um bloco que está sendo lido ou gravado é armazenado em buffer.

yantaq
fonte
0

Um buffer é uma região da memória usada para reter dados temporariamente enquanto estão sendo movidos de um local para outro dentro de um computador. Enquanto um cache é uma área de armazenamento temporário onde dados acessados ​​com frequência podem ser armazenados para acesso rápido. Depois que os dados são armazenados no cache, o uso futuro pode ser feito acessando a cópia em cache, em vez de buscar novamente os dados originais, para que o tempo médio de acesso seja menor.

Abigail
fonte