
Fiz dois experimentos.
O primeiro experimento (Ubuntu 20.04, sistema de arquivos ext4):
- Comando de execução
free -h -w
:
$ free -h -w
total used free shared buffers cache available
Mem: 30Gi 2,6Gi 25Gi 106Mi 126Mi 2,1Gi 27Gi
- Comando de execução
sudo find / | grep something
- Execute o comando
free -h -w
novamente e observe um aumento significativo (cerca de 1G) na coluna "buffers" e também na coluna "cache" (cerca de 500M):
$ free -h -w
total used free shared buffers cache available
Mem: 30Gi 2,6Gi 24Gi 106Mi 1,2Gi 2,6Gi 27Gi
O segundo experimento (mesmo PC):
- Comando de execução
free -h -w
:
$ free -h -w
total used free shared buffers cache available
Mem: 30Gi 2,6Gi 24Gi 106Mi 1,2Gi 2,6Gi 27Gi
- Execute o comando
dd if=/dev/nvme0n1p2 of=/dev/null bs=1M count=500
- seu disco seria outro aqui - Execute o comando
free -h -w
novamente e observe o aumento de 500M de buffers:
$ free -h -w
total used free shared buffers cache available
Mem: 30Gi 2,6Gi 24Gi 115Mi 1,7Gi 2,6Gi 27Gi
Então a questão é: por que buffers
a coluna foi aumentada no primeiro e por que no segundo caso? eu li issoQual é a coluna de buffers na saída de free?mas as respostas aqui não são apropriadas para mim.
Eles dizem que "a coluna buffers contém metadados sobre arquivos" - mas está errado, porque é a coluna "cache" que conta blocos para inode, dentry e buffer_head (que na verdade são metadados de arquivos). man free
também nos diz que a cache
coluna contém SReclaimable
.
Eles também dizem que "a coluna de buffers contém cache de blocos de dispositivos de bloco" - e parece mais verdade, explica por que buffers
aumentou quando executei dd
, mas não explica por que buffers
a coluna aumentou quando executei find
o comando. E mesmo no caso de dd
- por que precisamos disso se já temos cache de arquivos? Ninguém lê/grava diretamente de/para dispositivos de bloqueio, exceto discos DVD.
Responder1
Encontrei a resposta aqui:Como identificar a causa do grande uso de memória buffer?
Parece que o Linux armazena inodes de arquivos duas vezes: a primeira vez como ext4_inode_cache
/ inode_cache
em placas (observei o aumento do tamanho dessas placas com slabtop
comando) e a segunda vez em buffers (porque os inodes são lidos diretamente de dispositivos de bloco, e todos os blocos que foram lidos diretamente de dispositivos de bloco são armazenados em buffers). Então, quando eu executo find
o comando, o Linux lê os blocos dos inodes do dispositivo de bloco, salva-os em buffers e então cria o cache dos inodes em placas. Como resultado, ambas as colunas cache
e buffers
na free
saída são aumentadas.