У Linux, яка різниця між "буферами" та "кешем", про які повідомляє вільна команда?


73

Це старе питання, яке я час від часу бачив. Моє розуміння цього питання досить обмежене (прочитавши про відмінності давно, але фактичний (-и) участь (-и) ніколи насправді не затримувався).

Як я розумію,

  • Буфери

    Використовуються програмами з активними операціями вводу / виводу, тобто даними, які чекають запису на диск

  • Кеш

    Це результат завершених операцій вводу / виводу, тобто буферів, які були промиті або дані, зчитувані з диска для задоволення запиту.

Чи можу я отримати чітке пояснення щодо нащадків?



Це більше схоже на метадані, які ви знаходите в буферах, вони не пов'язані з буферами io. Деякі буфери ядра обліковуються в аллокаторі платівки, але взагалі не зараховуються до буферів або кеш-пам'яті.
eckes

Відповіді:


42

"Кешований" підсумок також буде включати деякі інші розподіли пам'яті, наприклад, будь-які файливі файли tmpfs. Щоб побачити це по суті, спробуйте:

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

і ви побачите падіння значення кешу на 100 Мб, яке ви скопіювали в файлову систему на базі оперативної пам’яті (якщо припустити, що достатньо вільної оперативної пам’яті, можливо, ви знайдете частину цього в свопі, якщо машина вже перевантажена в термінах використання пам'яті). "Синхронізувати; ехо 3> / proc / sys / vm / drop_caches" перед кожним викликом до безкоштовного повинен написати що-небудь, що очікує, у всі буфери запису (синхронізація) та очистити всі кешовані / буферизовані дискові блоки з пам'яті, тому вільне буде читати лише виділення у значенні "кешування".

Оперативна пам’ять, яка використовується віртуальними машинами (такими, які працюють під VMWare), також може бути зарахована у значення "кешування" безкоштовно, як і оперативна пам'ять, що використовується у відкритих на даний момент файлах, відображених у пам'яті (це залежить від гіпервізора / версії, яку ви використовуєте та можливо і між версіями ядра).

Таким чином, це не так просто, як "буфери рахують очікувані файли / мережеві записи та кешовані підрахунки нещодавно прочитаних / записаних блоків, що знаходяться в оперативній пам'яті, щоб зберегти майбутні фізичні читання", хоча для більшості цілей це більш просте опис буде робити.


1
+1 за цікаві нюанси. Це така інформація, яку я шукаю. Насправді я підозрюю, що цифри настільки складені, настільки залучені до такої кількості різних видів діяльності, що вони в кращому випадку загальні показники.
Avery Payne

Я не думаю, що оперативна пам'ять, яка використовується віртуальними машинами, вважається "кешованою", принаймні, для qemu-kvm. Я помічаю, що на моєму хості KVM значення кешу є не тільки занадто малим, щоб бути правильним (на 1,9 Gig), але воно не змінюється, якщо я знищую / запускаю одну з моїх віртуальних машин. Він також не змінюється, якщо я виконую трюк монтажу tmpfs на одному з віртуальних машин. Я створив там розділ 800Meg tmpfs і "кешував" показав належні значення на VM, але він не змінився на хості VM. Але значення "використано" зменшилось / зросло, коли я знищив / запустив свій VM.
Майк S

... Я провів тести на хості Centos 7.2.1511 VM, що працює з ядром 3.10.0-327.
Майк S

@MikeS: те, як різні рішення для віртуалізації обробляють пам'ять, може змінюватися, адже ядро ​​вимірює різні способи використання пам’яті між основними версіями.
Девід Спіллетт

@MikeS: Що стосується "виконання трюку монтування tmpfs на одній з віртуальних машин" - я не вплине на показання хоста, якщо вони не показують іншу пам’ять, яку використовує VM. Я бачу ефект у самому КВМ VM: до dd free = 2020, після dd free = 1899, після drop fs free = 2001 (різниця 19Mb буде пов'язана з іншими процесами в VM, коли я не працював тест). Хост може не побачити зміни: пам'ять, ймовірно, все ще виділяється на VM, навіть якщо вона вільна для використання процесами в VM.
Девід Спіллетт

8

Хитрі питання. Підраховуючи вільний простір, вам потрібно скласти буфер і кешувати обидва. Це те, що я міг знайти

Буфер - це те, що ще потрібно "записати" на диск. Кеш - це те, що було «прочитано» з диска і збережено для подальшого використання.

http://visualbasic.ittoolbox.com/documents/difference-bet between-buffer-and-cache-12135


5

Я шукав більш чіткий опис буфера, і я знайшов у "Professional Linux® Kernel Architecture 2008"

Глава 16: Кеш сторінки та буфера

Взаємодія

Налаштування зв’язку між сторінками та буферами служить малою метою, якщо немає переваг для інших частин ядра. Як уже зазначалося, деякі операції з передачі на блокові пристрої та з них можуть знадобитися виконувати в одиницях, розмір яких залежить від розміру блоку базових пристроїв, тоді як багато частин ядра вважають за краще виконувати операції вводу / виводу з деталізацією сторінки. значно полегшує ситуацію - особливо з точки зору управління пам'яттю. У цьому сценарії буфери виступають посередниками між двома світами.


3

Пояснив RedHat :

Кеш-сторінки:

Кеш - це частина пам'яті, яка прозоро зберігає дані, щоб майбутні запити на ці дані могли швидше подаватись. Ця пам'ять використовується ядром для кешування даних диска та підвищення продуктивності вводу-виводу.

Ядро Linux побудовано таким чином, що воно буде використовувати стільки оперативної пам’яті, скільки можливо, для кешування інформації з ваших локальних та віддалених файлових систем та дисків. По мірі того, як у системі відбувається час читання і запису, ядро ​​намагається зберегти дані, що зберігаються в пам'яті, для різних процесів, що працюють у системі, або даних відповідних процесів, які будуть використані найближчим часом. Кеш не відновлюється в той момент, коли процес отримує зупинку / вихід, проте, коли для інших процесів потрібно більше пам'яті, ніж вільна наявна пам'ять, ядро ​​виконуватиме евристику для відновлення пам'яті, зберігаючи дані кешу та виділяючи цю пам'ять новим процесом.

Коли запитується будь-який тип файлу / даних, ядро ​​шукатиме копію тієї частини файлу, на яку користувач діє, і, якщо такої копії немає, вона виділить одну нову сторінку пам'яті кешу і заповнить її відповідний вміст, прочитаний з диска.

Дані, що зберігаються в кеші, можуть бути значеннями, які були обчислені раніше, або копії вихідних значень, які зберігаються в іншому місці диска. Коли потрібні деякі дані, кеш спочатку перевіряється, чи містить він ці дані. Дані можна отримати швидше з кеша, ніж з їх початкового джерела.

Сегменти спільної пам'яті SysV також обліковуються як кеш, хоча вони не представляють жодних даних на дисках. Можна перевірити розмір сегментів спільної пам'яті за допомогою команди ipcs -m та перевірити байт-стовпчик.

Буфери:

Буфери - це зображення дискового блоку даних, що зберігаються під кешами сторінок. Буфери містять метадані файлів / даних, які знаходяться під кешем сторінки. Приклад: Коли є запит будь-яких даних, які є в кеші сторінки, спочатку ядро ​​перевіряє дані в буферах, які містять метадані, які вказують на фактичні файли / дані, що містяться в кешах сторінок. Після того, як з метаданих буде відома фактична адреса блоку файлу, воно вибирається ядром для обробки.


2

Звільнення буфера / кеша

Попередження Це пояснення сильного методу, який не рекомендується використовувати на виробничому сервері! Тож вас попередили, не звинувачуйте мене, якщо щось піде не так.

Для розуміння цього, ви можете змусити вашу систему делегувати якомога більше пам’яті, cacheніж скинути кешований файл:

Преамбула

Перш ніж робити тест, ви можете відкрити ще одне вікно:

$ 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
...

для наступної еволюції свопів у режимі реального часу.

Зауваження: Ви повинні утилізувати стільки ж безкоштовного диска в поточному каталозі, у вас є 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

Нота, господар, на якому я це робив, сильно використовується. Це буде більш значущим на справді тихій машині.


1
-1 якби я міг. Це і (A) не має значення для поставленого запитання, і (B) жахливо тупим способом запускання очищення кешу. Існують прямі способи зробити останнє, тому не можна захищати систему у дотриманні, спамуючи її з даними, доки вона не заграє як побічний ефект
underscore_d

О Боже! Будь ласка, ніколи не робіть цього на реальних серверах!
tamerlaha

@Tamerlaha Я не погоджуюся, але, будь ласка, перечитайте 1-й абзац: вас попередили, не звинувачуйте мене ! Мета цього - показати значення буфера / кешу.
Ф. Хаурі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.