Понимание "Буферы" и "Кэширование" из свободной команды

Об этом было задано ранее, но вы не хотите обновлять тот же поток снова, поскольку это был старый поток.

Хотите пояснить себя в столбцах "буферы" и "кеш" из вывода команды free.

Вот что я понимаю...

Буфер - это то, где данные хранятся в памяти, но все же должны быть сброшены на диск. Данные будут периодически удаляться на диск с помощью bdflush daemon, или мы можем сделать это вручную, выполнив команду sync.

С другой стороны, кэш-память - это программа/данные, которые загружаются в память, но сохраняются в памяти, так что если это необходимо снова, она будет быстро доступна.

Чтобы понять концепцию буферов, я попробовал следующий эксперимент...

Это чтение команды free на моем рабочем столе

[[email protected] ~]$ free -m
             total       used       free     shared    buffers     cached
Mem:          2897        465       2431          0         30        230
-/+ buffers/cache:        204       2692
Swap:         4000          0       4000

[[email protected] ~]$ sync

[[email protected] ~]$ free -m
             total       used       free     shared    buffers     cached
Mem:          2897        466       2431          0         30        230
-/+ buffers/cache:        205       2691
Swap:         4000          0       4000

Здесь я не вижу уменьшения буфера после выполнения команды sync.

Далее я попробовал следующее... Пытался написать огромный файл на диск.

[[email protected] ~]$ dd if=/dev/zero of=test bs=1024k 

Как и ожидалось, кешированное значение должно увеличиваться, и освобождение подтверждает это.

@localhost ~]# free -m
             total       used       free     shared    buffers     cached
Mem:          2897       1466       1430          0         32       1127
-/+ buffers/cache:        306       2590
Swap:         4000          0       4000

Я снова выполнил команду sync, а затем проверил с помощью free. Я вижу, что значение буфера становится уменьшающимся с выхода команды free. В кэше не было уменьшения. Это означает, что грязные страницы в ОЗУ после моего выполнения dd coomand были сброшены на диск.

@localhost ~]# free -m
             total       used       free     shared    buffers     cached
Mem:          2897       1466       1430          0         10       1127
-/+ buffers/cache:        306       2590
Swap:         4000          0       4000

Затем я обновил параметр ядра drop_cache, чтобы сбросить значение кэша

[[email protected] ~]# cat /proc/sys/vm/drop_caches 
0

[[email protected] ~]# echo "1" > /proc/sys/vm/drop_caches 

[[email protected] ~]# cat /proc/sys/vm/drop_caches 
1

free теперь подтверждает, что значение как буфера, так и кеша.

[[email protected] ~]# free -m
             total       used       free     shared    buffers     cached
Mem:          2897        299       2597          0          1         74
-/+ buffers/cache:        224       2672
Swap:         4000          0       4000

Итак, моя первоначальная инструкция о том, что "Буфер" - это данные ОЗУ, которые еще предстоит сбросить на диск, выглядит правильно.

Прошу вас проинформировать меня, правильно ли я.

Ответы

Ответ 1

Заголовки столбцов в свободной команде несколько неверно маркированы, по крайней мере, с точки зрения пользователя linux (в отличие от разработчика). Ниже поясняется, что означают заголовки:

всего: Да, это полный баран.

используется. Это, вероятно, самый запутанный столбец. Это сочетание используемой памяти приложения и другой "временно" (буфер + кеш) используемой памяти, которая действительно доступна, если это необходимо. Таким образом, технически память действительно используется, но большая часть этой памяти доступна, если приложение нуждается в ней. "Временная" используемая память заимствуется, если она доступна системой linux, чтобы ускорить работу системы, иначе система читала бы с диска чаще. Большая часть этого типа памяти показана в столбце "кэшированный". Эта память отказывается от системы linux, если приложение нуждается в памяти.

бесплатно: Да, эта чистая свободная и нетронутая память.

общий: Память, специально предназначенная для использования несколькими процессами

буферы: Временная память, предназначенная для некоторых процессов

cache: Память, которая доступна и "заимствована" операционной системой, чтобы ускорить многие операции операционной системы Linux. Эта память отказывается от системы, если приложение нуждается в ней.

Линия, начинающаяся с -/+ buffers/cache, обычно более полезна, чем первая строка Mem. Пересечение свободных и -/+ буферов/кеш - это то, что у вас есть для "доступной" памяти.

Ответ 2

Как я всегда понимал, что буферная область памяти предназначена для временного хранения данных, которые считываются или записываются на устройства (включая диски), в то время как область кэша памяти предназначена для ускорения будущих чтений с устройство.

Ответ 3

Подсистема Linux vm рассматривает любую свободную или неиспользуемую или не выделенную память как буфера/кеш

Таким образом, запуск echo 1 > /proc/sys/vm/drop_caches указывает ядру на удаление или очистку кэшей страниц (page-cache), dentries (slab-cache) и inodes (в slab-кеше), что приводит к тому, что память становится исправленной и доступной,

Чистые страницы кэша данных не освобождаются по дизайну. Они могут быть легко восстановлены ядром, если или когда выделена дополнительная память (malloc/calloc/brk/sbrk и друзья), в то время как они содержат полезные данные с дисков, которые при необходимости снова сохраняют выполнение ввода/вывода на диске.

sync команда только фиксирует любые грязные страницы в памяти на диске, она не освобождает буферы/кеш. Единственный способ сбросить буферы/кеш - это использовать echo "1" > /proc/sys/vm/drop_caches или ядро ​​восстанавливает страницы данных для новых распределенных запросов, запрошенных приложениями

pdflush был заменен использованием потоков промывки для информации о поддерживающем устройстве (BDI).

Ответ 4

Цитата из RHEL:

Linux всегда пытается использовать ОЗУ для ускорения операций с дисками, используя доступную память для буферов (метаданные файловой системы) и кеш (страницы с фактическим содержимым файлов или блочных устройств).

Ответ 5

Это мое понимание: буферы говорят вам, сколько памяти зарезервировано для поддержки блочных устройств, но в кеше указано, сколько памяти используется для содержимого файла.