Причина увеличения буферов в выводе команды "free -h"

Причина увеличения буферов в выводе команды "free -h"

Я провел два эксперимента.

Первый эксперимент (Ubuntu 20.04, файловая система ext4):

  1. Команда Run free -h -w:
$ free -h -w
              total        used        free      shared     buffers       cache   available
Mem:           30Gi       2,6Gi        25Gi       106Mi       126Mi       2,1Gi        27Gi
  1. Команда Runsudo find / | grep something
  2. Запустите команду free -h -wеще раз и наблюдайте значительное (примерно на 1 Гб) увеличение столбца «buffers», а также увеличение столбца «cache» (примерно на 500 Мб):
$ free -h -w
              total        used        free      shared     buffers       cache   available
Mem:           30Gi       2,6Gi        24Gi       106Mi       1,2Gi       2,6Gi        27Gi

Второй эксперимент (тот же ПК):

  1. Команда Run 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. Выполнить команду dd if=/dev/nvme0n1p2 of=/dev/null bs=1M count=500- ваш диск будет здесь другим
  2. Запустите команду free -h -wеще раз и наблюдайте увеличение буферов на 500 МБ:
$ free -h -w
              total        used        free      shared     buffers       cache   available
Mem:           30Gi       2,6Gi        24Gi       115Mi       1,7Gi       2,6Gi        27Gi

Так вот вопрос: почему buffersстолбец увеличился в первом случае и почему во втором? Я читал этоЧто представляет собой столбец буферов в выводе free?но ответы здесь мне не подходят.

Они говорят нам, что «столбец буферов содержит метаданные о файлах», но это неверно, потому что именно столбец «кэш» подсчитывает slabs для inode, dentry и buffer_head (которые на самом деле являются метаданными файлов). man freeТакже сообщает нам, что cacheстолбец содержит SReclaimable.

Они также говорят "столбец буферов содержит кэш блоков с блочных устройств" - и это больше похоже на правду, это объясняет, почему buffersувеличилось, когда я запустил dd, но это не объясняет, почему buffersстолбец увеличился, когда я запустил findкоманду. И даже в случае dd- зачем он нам нужен, если у нас уже есть файловый кэш? Никто не читает/не пишет напрямую с/на блочные устройства, кроме DVD-дисков.

решение1

Ответ нашел здесь:Как определить причину большого использования буферной памяти? Похоже, что Linux хранит inodes файлов дважды: первый раз как ext4_inode_cache/ inode_cacheв slabs (я наблюдал увеличение размеров этих slabs с помощью slabtopкоманды) и второй раз в буферах (потому что inodes напрямую считываются с блочных устройств, и все блоки, которые были напрямую считаны с блочных устройств, хранятся в буферах). Поэтому, когда я запускаю findкоманду, Linux считывает блоки inodes с блочного устройства, сохраняет их в буферах, а затем создает кэш inodes в slabs. В результате оба столбца cacheи в выводе увеличиваются.buffersfree

Связанный контент