в linux, в чем разница между «буферами» и «кешем», сообщаемым командой free?

<p>это старый вопрос, который я видел время от времени. мое понимание этого довольно ограничено (прочитав о различиях давным-давно, но фактоид (ы), вовлеченные никогда не застрял).</p><p>как я понимаю,</p><ul> <li> <p>буферы</p> <p>используются программами с активными операциями ввода-вывода, т.е. данными, ожидающими записи на диск</p> </li> <li> <p>кэш</p> <p>является ли результат выполненных операций ввода-вывода, т. е. буферов, которые были сброшены, или данных, считанных с диска для удовлетворения запроса.</p> </li> </ul><p>могу ли я получить четкое объяснение для потомков?</p>

<p>"кэшированный" итог также будет включать в себя некоторые другие выделения памяти, такие как любые файловые системы tmpfs. чтобы увидеть это, попробуйте:</p><pre><code>mkdir t mount -t tmpfs none t dd if=/dev/zero of=t/zero.file bs=10240 count=10240 sync; echo 3 > /proc/sys/vm/drop\_caches; free -m umount t sync; echo 3 > /proc/sys/vm/drop\_caches; free -m </code></pre><p>и вы увидите падение значения "кеша" на 100 мбайт, которые вы скопировали в файловую систему на базе оперативной памяти (при условии, что было достаточно свободной оперативной памяти, вы можете обнаружить, что некоторые из них оказались в состоянии подкачки, если машина уже перегружена в терминах использования памяти). "синхронизация; echo 3>/proc/sys/vm/drop\_caches" перед каждым вызовом free должна записывать что-либо ожидающее во всех буферах записи (синхронизация) и очищать все блоки кэшированных/буферизованных дисков из памяти, так что free будет считывать только другие выделения в "кэшированном" значении.</p><p>ram, используемая виртуальными машинами (например, работающими под vmware), также может учитываться в свободном "кэшированном" значении, как будет ram используется текущим открытым сопоставленные с памятью файлы (это будет зависеть от используемого вами гипервизора/версии и, возможно, также от версии ядра).</p><p>так что это не так просто, как "подсчет буферов в ожидании файловых/сетевых записей и кэшированного подсчета недавно прочитанных/записанных блоков, хранящихся в ram для сохранения будущих физических чтений", хотя для большинства целей это более простое описание сделаю.</p>

<p>каверзный вопрос. когда вы вычисляете свободное пространство, вам действительно нужно добавить буфер и кешировать оба. это то, что я мог найти</p><p>буфер - это то, что еще не "записано" на диск. кеш - это то, что было "прочитано" с диска и сохранено для последующего использования.</p><p> <a href="http://visualbasic.ittoolbox.com/documents/difference-between-buffer-and-cache-12135">http://visualbasic.ittoolbox.com/documents/difference-between-buffer-and-cache-12135</a> </p>

<p>я искал более четкое описание о буфере, и я нашел в <code>"professional linux kernel architecture 2008"</code></p><blockquote> <p>глава 16. кэш страницы и буфера</p> <p>взаимодействие</p> <p>установка связи между страницами и буферами бесполезна, если для других частей ядра нет преимуществ. как уже отмечалось, некоторые операции передачи на блочные устройства и с них могут потребоваться в блоках, размер которых зависит от размера блока базовых устройств, тогда как многие части ядра предпочитают выполнять операции ввода-вывода с гранулярностью страниц, так как это делает вещи намного проще - особенно с точки зрения управления памятью. в этом сценарии буферы действуют как посредники между двумя мирами.</p> </blockquote>

<p>объясняется <strong>redhat</strong>:</p><p>страницы кэша:</p><p>кеш - это часть памяти, которая прозрачно хранит данные, чтобы в будущем запросы на эти данные могли обслуживаться быстрее. эта память используется ядром для кэширования данных на диске и повышения производительности ввода-вывода.</p><p>ядро linux построено таким образом, что оно будет использовать как можно больше ram) для кэширования информации из ваших локальных и удаленных файловых систем и дисков. со временем различные операции чтения и записи при выполнении в системе ядро пытается сохранить данные, хранящиеся в памяти, для различных процессов, запущенных в системе, или данные соответствующих процессов, которые будут использоваться в ближайшем будущем. кэш не восстанавливается в тот момент, когда процесс получить остановку/выход, однако, когда другим процессам требуется больше памяти, чем свободной доступной памяти, ядро запустит эвристику для восстановления памяти путем хранения данных кэша и выделения этой памяти новому процессу.</p><p>когда запрашивается любой тип файла/данных, тогда ядро будет искать копию той части файла, с которой работает пользователь, и, если такой копии не существует, выделяет одну новую страницу кэш-памяти и заполняет ее соответствующее содержимое считывается с диска.</p><p>данные, которые хранятся в кэше, могут быть значениями, которые были вычислены ранее, или дубликатами исходных значений, которые хранятся в другом месте на диске. когда запрашиваются некоторые данные, кэш сначала проверяется, чтобы увидеть, содержит ли он эти данные. данные могут быть извлечены из кеша быстрее, чем из источника.</p><p>сегменты разделяемой памяти sysv также учитываются как кеш, хотя они не представляют никаких данных на дисках. проверить размер сегментов разделяемой памяти можно с помощью команды ipcs -m и проверки столбца байтов.</p><p>буферы:</p><p>буферы представляют собой блочные представления данных, которые хранятся в кешах страниц. буферы содержат метаданные файлов/данных, которые находятся в кэше страницы. пример: когда есть запрос любых данных, которые присутствуют в кэше страницы, сначала ядро проверяет данные в буферах, которые содержат метаданные, которые указывают на фактические файлы/данные, содержащиеся в кэше страницы. как только из метаданных известен фактический адрес блока файла, он берется ядром для обработки.</p>

<h3>освобождение буфера/кеша</h3><p><strong><em> предупреждение </em></strong> это объясняет сильный метод, не рекомендуемый на рабочем сервере! так что вы предупреждены, не вините меня, если что-то пойдет не так.</p><p>для понимания, вы могли бы <strong>заставить</strong> вашей системе делегировать как можно больше памяти, чтобы <code>cache</code> отбросить кэшированный файл:</p><p>перед выполнением теста вы можете открыть еще одно окно:</p><pre><code>$ vmstat -n 1 procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu---- r b swpd free buff cache si so bi bo in cs us sy id wa 0 1 39132 59740 39892 1038820 0 0 1 0 3 3 5 13 81 1 1 0 39132 59140 40076 1038812 0 0 184 0 10566 2157 27 15 48 11 ... для последующей эволюции свопа в реальном времени.<strong>nota:</strong> вы должны удалить столько свободного диска в текущем каталоге, у вас есть mem + swap$ free total used free shared buffers cached mem: 2064396 2004320 60076 0 90740 945964 -/+ buffers/cache: 967616 1096780 swap: 3145720 38812 3106908 $ tot=0 $ while read -a line;do [[ "${line%:}" =~ ^(swap|mem)total$ ]] && ((tot+=2*${line[1]})) done </proc/meminfo $ echo $tot 10420232 $ dd if=/dev/zero of=verybigfile count=$tot 10420232+0 records in 10420232+0 records out 5335158784 bytes (5.3 gb) copied, 109.526 s, 48.7 mb/s $ cat >/dev/null verybigfile $ free total used free shared buffers cached mem: 2064396 2010160 54236 0 41568 1039636 -/+ buffers/cache: 928956 1135440 swap: 3145720 39132 3106588 $ rm verybigfile $ free total used free shared buffers cached mem: 2064396 1005104 1059292 0 41840 48124 -/+ buffers/cache: 915140 1149256 swap: 3145720 39132 3106588 </code></pre><p>nota, хост, на котором я это сделал, сильно используется. это будет более значительным на действительно тихой машине.</p>