![Причина увеличения буферов в выводе команды "free -h"](https://rvso.com/image/192257/%D0%9F%D1%80%D0%B8%D1%87%D0%B8%D0%BD%D0%B0%20%D1%83%D0%B2%D0%B5%D0%BB%D0%B8%D1%87%D0%B5%D0%BD%D0%B8%D1%8F%20%D0%B1%D1%83%D1%84%D0%B5%D1%80%D0%BE%D0%B2%20%D0%B2%20%D0%B2%D1%8B%D0%B2%D0%BE%D0%B4%D0%B5%20%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D1%8B%20%22free%20-h%22.png)
Я провел два эксперимента.
Первый эксперимент (Ubuntu 20.04, файловая система ext4):
- Команда Run
free -h -w
:
$ free -h -w
total used free shared buffers cache available
Mem: 30Gi 2,6Gi 25Gi 106Mi 126Mi 2,1Gi 27Gi
- Команда Run
sudo find / | grep something
- Запустите команду
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
Второй эксперимент (тот же ПК):
- Команда 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
- Выполнить команду
dd if=/dev/nvme0n1p2 of=/dev/null bs=1M count=500
- ваш диск будет здесь другим - Запустите команду
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
и в выводе увеличиваются.buffers
free