Понимание «Буферов» и «Кэшированных» из свободной команды - PullRequest
19 голосов
/ 15 марта 2012

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

Хочу уточнить себя в столбцах "buffers" и "cache" из выводаfree команда.

Это то, что я понимаю ...

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

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

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

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

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

[zama@localhost ~]$ sync

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

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

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

[zama@localhost ~]$ dd if=/dev/zero of=test bs=1024k 

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

@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, так что значение кэша удалено

[root@localhost ~]# cat /proc/sys/vm/drop_caches 
0

[root@localhost ~]# echo "1" > /proc/sys/vm/drop_caches 

[root@localhost ~]# cat /proc/sys/vm/drop_caches 
1

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

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

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

Пожалуйста, укажите, правильно ли я нахожусь.

Ответы [ 5 ]

23 голосов
/ 08 мая 2014

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

всего: Да, это всего таран.

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

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

shared: Память, специально выделенная для использования несколькими процессами

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

кеш: Память, которая доступна и «заимствована» операционной системой, чтобы ускорить многие операции ОС Linux. Эта память выделяется системой, если она требуется приложению.

Строка, начинающаяся с - / + buffers / cache , обычно более полезна, чем первая строка Mem . Пересечение free и - / + buffers / cache по сути то, что вы имеете для «доступной» памяти.

3 голосов
/ 10 июля 2014

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

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

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

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

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

2 голосов
/ 07 ноября 2014

Цитирование из RHEL :

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

2 голосов
/ 15 марта 2012

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

1 голос
/ 10 февраля 2014

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

...