Понимание "Буферы" и "Кэширование" из свободной команды
Об этом было задано ранее, но вы не хотите обновлять тот же поток снова, поскольку это был старый поток.
Хотите пояснить себя в столбцах "буферы" и "кеш" из вывода команды 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
Это мое понимание: буферы говорят вам, сколько памяти зарезервировано для поддержки блочных устройств, но в кеше указано, сколько памяти используется для содержимого файла.