Чим відрізняється буфер від кеш-пам'яті в Linux?


179

Мені не зрозуміло, у чому різниця між двома концепціями пам'яті Linux: bufferта cache. Я прочитав цю публікацію, і мені здається, що різниця між ними полягає в політиці закінчення терміну дії:

  1. Політика буфера є першою, першою
  2. Політика кеша - найменш нещодавно використана.

Маю рацію?

Зокрема, я дивлюся на дві команди: freeіvmstat

james@utopia:~$ vmstat -S M
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
5  0      0    173     67    912    0    0    19    59   75 1087 24  4 71  1
james@utopia:~$ free -m
             total       used       free     shared    buffers     cached
Mem:          2007       1834        172          0         67        914
-/+ buffers/cache:        853       1153
Swap:         2859          0       2859

Ви повинні дати нам більше контексту, обидва терміни використовуються з різним значенням. Ви переходите до freeвиводу команди?
leonbloy

3
ви праві, я дивлюся на дві команди: вільний, vmstat. переглянути мої оновлення.
Джеймс.Xu

1
Ви також можете відвідати unix.stackexchange.com
leonbloy

Відповіді:


69

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

цитата:


3
Я перевірив це за допомогою простої програми python, яка записує велику кількість блоків. Що відбувається, це те, що cacheзаповнюється, як повідомляється free -w -h, а не buffersстовпець. Я думаю, що cacheстовпець рахує як запис на диску, так і зчитування диска, і buffersвикористовується для чогось іншого.
CMCDragonkai

@CMCDragonkai дякую за експериментальні докази. Цікаве питання - чи писали ви швидше, ніж диск міг вимитись. (наприклад, синхронізація зайняла б тривалий час), що могло б сказати, чи брудні блоки рахуються інакше, ніж чисті. Linux, безумовно, кешуватиме обидва типи (lru, як згадувалося у запитанні), але один набагато серйозніший щодо тиску пам'яті.
Сет Робертсон

179

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

посилання цитати


1
Короткий і добре пояснений. Дякую.
curiousguy

84

Цитована відповідь (для довідки):

Коротка відповідь: Кешування - це розмір кеша сторінки. Буфери - це розмір буферів вводу / виводу блоку пам'яті. Кешовані питання; Буфери в основному не мають значення.

Довга відповідь: Кешування - це розмір кешу сторінок Linux, за вирахуванням пам’яті в кеш-пам'яті, який представлений SwapCched (таким чином, загальний розмір кешу сторінки - Cached + SwapCched). Linux виконує всі введення / виведення файлів через кеш сторінки. Записи реалізуються як просто маркування відповідних сторінок у кеш-сторінках; поточні потоки періодично записують на диск будь-які брудні сторінки. Читання реалізується шляхом повернення даних із кеша сторінки; якщо даних ще немає в кеші, вони спочатку заповнюються. У сучасній системі Linux кешування легко може бути декілька гігабайт. Він зменшиться лише у відповідь на тиск пам'яті. Система очистить кеш сторінки разом із заміною даних на диск, щоб забезпечити доступність більше пам'яті.

Буфери - це буфери вводу / виводу блоку пам'яті. Вони відносно недовговічні. До ядра Linux версії 2.4 Linux мав окремі кеші сторінок та буферів. Починаючи з 2.4, кеш сторінки та буфера є уніфікованими, а буфери - це необроблені дискові блоки, не представлені в кеші сторінки, тобто не файлові дані. Таким чином, показник буферів має мінімальне значення. У більшості систем буфери часто мають лише десятки мегабайт.


7
"Буфери в значній мірі не мають значення" - Ні. Є багато випадків, коли кешування вмісту файлів не має значення, але збереження метаданих у кеші прискорює роботу. Наприклад, потоковий відеосервер NAS сервера.
Гюнтер П'єз

Будь-яка система, яка робить багато вводу-виводу, буде використовувати багато пам'яті для буферів. Я завантажую базу даних 100 Гб MySQL / InnoDB, і буфери постійно перевищують 2 ГБ.
Марсело Пачеко

21

Це не так просто, як це, але це може допомогти зрозуміти:

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

Кеш призначений для зберігання фактичного вмісту файлу.


5
IOW, буфер = метадані; Кеш = Дані;
Свобода_Бен

13

Пояснив RedHat :

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

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

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

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

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

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

Буфери:

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


12

буфер і кеш.

Буфер - це те, що ще потрібно "записати" на диск.

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


2
нова порада користувача: зробіть свою відповідь максимально чітким відношенням до питання. Якби я був ти, я доповнив би твоєю відповіддю розділ, що починається з "Отже, з твого прикладу ..." і трохи детальніше розповім про це.
Пьотр Вадас

25
Я не думаю, що ця відповідь вірна в тому ж контексті, що і питання (а саме, що означає ядро ​​Linux під "буфером" і "кешем"
Freedom_Ben

8

Я думаю, що ця сторінка допоможе глибше зрозуміти різницю між буфером та кешем. http://www.tldp.org/LDP/sag/html/buffer-cache.html

Читання з диска дуже повільне порівняно з доступом до (реальної) пам'яті. Крім того, прийнято читати одну і ту ж частину диска кілька разів протягом відносно коротких періодів часу. Наприклад, можна спочатку прочитати повідомлення електронної пошти, потім прочитати лист у редакторі, відповідаючи на нього, а потім змусити програму пошти прочитати її ще раз, скопіювавши її в папку. Або подумайте, як часто команда lsможе виконуватися в системі з багатьма користувачами. Прочитавши інформацію з диска лише один раз, а потім зберігаючи її в пам’яті до тих пір, коли вона більше не потрібна, можна прискорити все, крім першого читання. Це називається буферизацією диска, а пам'ять, яка використовується для цієї мети, називається буферним кешем.

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

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


Це пояснює, що таке кеш-буфер, але не різниця між буфером і кешем у виведеннях vmstat та вільних команд.
Roel Schroeven

4

Сет Робертсон в Посиланні 2 сказав: "Для глибокого розуміння цих термінів зверніться до книги ядер Linux, як-от Linux Kernel Development від Роберт М. Лав".

Я знайшов деякий вміст про «буфер» у другому виданні книги.

Хоча сам фізичний пристрій адресований на рівні сектору, ядро ​​виконує всі дискові операції з точки зору блоків.

Коли блок зберігається в пам'яті (скажімо, після читання чи очікування запису), він зберігається у "буфері". Кожен 'буфер' асоціюється з точно одним блоком. "Буфер" служить об'єктом, який представляє блок диска в пам'яті.

"Буфер" - це представлення в пам'яті одного фізичного блоку диска.

Операції блоку вводу / виводу одночасно управляють одним блоком диска. Поширена блокова операція вводу-виводу - читання та записування вводів. Ядро забезпечує функцію bread () для виконання низького рівня зчитування одного блоку з диска. Через "буфери" дискові блоки відображаються на пов'язаних сторінках пам'яті. "


2

Буфер містить метадані, які допомагають покращити ефективність запису

Кеш містить сам вміст файлу (інколи ще не потрібно записати на диск), що покращує продуктивність читання


1

Цитата з книги: Вступ до пошуку інформації

Кеш

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

Буфер

Операційні системи, як правило, читають і записують цілі блоки. Таким чином, читання одного байта з диска може зайняти стільки ж часу, скільки і прочитати весь блок. Розміри блоків 8, 16, 32 та 64 кілобайт (КБ) є загальними. Ми називаємо частину основної пам'яті, де блок, який читається або записується, зберігається в буфері.


0

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.