A razão pela qual os buffers na saída do comando "free -h" são aumentados

A razão pela qual os buffers na saída do comando "free -h" são aumentados

Fiz dois experimentos.

O primeiro experimento (Ubuntu 20.04, sistema de arquivos ext4):

  1. 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
  1. Comando de execuçãosudo find / | grep something
  2. Execute o comando free -h -wnovamente 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):

  1. 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
  1. Execute o comando dd if=/dev/nvme0n1p2 of=/dev/null bs=1M count=500- seu disco seria outro aqui
  2. Execute o comando free -h -wnovamente 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 buffersa 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 freetambém nos diz que a cachecoluna 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 buffersaumentou quando executei dd, mas não explica por que buffersa coluna aumentou quando executei findo 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_cacheem placas (observei o aumento do tamanho dessas placas com slabtopcomando) 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 findo 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 cachee buffersna freesaída são aumentadas.

informação relacionada