Что такое кэш буфер

WAL в PostgreSQL: 1. Буферный кеш

Предыдущий цикл был посвящен изоляции и многоверсионности PostgreSQL, а сегодня мы начинаем новый — о механизме журналирования (write-ahead logging). Напомню, что материал основан на учебных курсах по администрированию, которые делаем мы с Павлом pluzanov, но не повторяет их дословно и предназначен для вдумчивого чтения и самостоятельного экспериментирования.

Этот цикл будет состоять из четырех частей:

Зачем нужно журналирование?

В процессе работы часть данных, с которыми имеет дело СУБД, хранится в оперативной памяти и записывается на диск (или на другой энергонезависимый носитель) отложенным образом. Чем реже это происходит, тем меньше ввод-вывод и тем быстрее работает система.

Но что произойдет в случае сбоя, например, при выключении электропитания или при ошибке в коде СУБД или операционной системы? Все содержимое оперативной памяти будет потеряно, а останутся лишь данные, записанные на диск (при некоторых видах сбоев может пострадать и диск, но в этом случае поможет лишь резервная копия). В принципе можно организовать ввод-вывод таким образом, чтобы данные на диске всегда поддерживались в согласованном состоянии, но это сложно и не слишком эффективно (насколько я знаю, только Firebird пошел таким путем).

Обычно же — в том числе и в PostgreSQL — данные, записанные на диск, оказываются несогласованными и при восстановлении после сбоя требуются специальные действия, чтобы согласованность восстановить. Журналирование — тот самый механизм, который делает это возможным.

Буферный кеш

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

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

Заметим, что у операционной системы тоже есть дисковый кеш, который решает ту же самую задачу. Поэтому обычно СУБД стараются избегать двойного кеширования, обращаясь к диску напрямую, минуя кеш ОС. Но в случае PostgreSQL это не так: все данные читаются и записываются с помощью обычных файловых операций.

Кроме того, свой кеш бывает также у контроллеров дисковых массивов, и даже у самих дисков. Этот факт нам еще пригодится, когда мы доберемся до вопроса надежности.

Но вернемся к буферному кешу СУБД.

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

Что такое кэш буфер. Смотреть фото Что такое кэш буфер. Смотреть картинку Что такое кэш буфер. Картинка про Что такое кэш буфер. Фото Что такое кэш буфер

Изначально кеш содержит пустые буферы, и все они связаны в список свободных буферов. Смысл указателя на «следующую жертву» станет ясен чуть позже. Чтобы быстро находить нужную страницу в кеше, используется хеш-таблица.

Поиск страницы в кеше

Когда процессу требуется прочитать страницу, он сначала пытается найти ее в буферном кеше с помощью хеш-таблицы. Ключом хеширования служит номер файла и номер страницы внутри файла. В соответствующей корзине хеш-таблицы процесс находит номер буфера и проверяет, действительно ли он содержат нужную страницу. Как и с любой хеш-таблицей, здесь возможны коллизии; в таком случае процессу придется проверять несколько страниц.

Использование хеш-таблицы давно вызывает нарекания. Такая структура позволяет быстро найти буфер по странице, но совершенно бесполезна, если, например, надо найти все буферы, занятые определенной таблицей. Но хорошую замену пока никто не предложил.

Если нужная страница найдена в кеше, процесс должен «закрепить» буфер, увеличив счетчик pin count (несколько процессов могут сделать это одновременно). Пока буфер закреплен (значение счетчика больше нуля), считается, что буфер используется и его содержимое не должно «радикально» измениться. Например, в странице может появиться новая версия строки — это никому не мешает благодаря многоверсионности и правилам видимости. Но в закрепленный буфер не может быть прочитана другая страница.

Вытеснение

Может получиться так, что необходимая страница не будет найдена в кеше. В этом случае ее необходимо считать с диска в какой-либо буфер.

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

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

Алгоритм clock-sweep перебирает по кругу все буферы (используя указатель на «следующую жертву»), уменьшая на единицу их счетчики обращений. Для вытеснения выбирается первый же буфер, который:

После того, как буфер найден, с ним происходит следующее.

Буфер закрепляется, чтобы показать остальным процессам, что он используется. Помимо закрепления используются и другие средства блокировки, но подробнее об этом мы поговорим отдельно.

Если буфер оказался грязным, то есть содержит измененные данные, страницу нельзя просто выбросить — сначала ее требуется сохранить на диск. Это не очень хорошая ситуация, поскольку процессу, который собирается прочитать страницу, приходится ждать записи «чужих» данных, но этот эффект сглаживается процессами контрольной точки и фоновой записи, которые будут рассмотрены позже.

Далее в выбранный буфер читается с диска новая страница. Счетчик числа обращений устанавливается в единицу. Кроме того, ссылку на загруженную страницу необходимо прописать в хеш-таблицу, чтобы в дальнейшем ее можно было найти.

Теперь ссылка на «следующую жертву» указывает на следующий буфер, а у только что загруженного есть время нарастить счетчик обращений, пока указатель не обойдет по кругу весь буферный кеш и не вернется вновь.

Своими глазами

Как это принято в PostgreSQL, существует расширение, которое позволяет заглянуть внутрь буферного кеша.

Создадим таблицу и вставим в нее одну строку.

Что окажется в буферном кеше? Как минимум, в нем должна появиться страница, на которую добавлена единственная строка. Проверим это следующим запросом, в котором мы выбираем только буферы, относящиеся к нашей таблице (по номеру файла relfilenode), и расшифровываем номер слоя (relforknumber):

Так и есть — в буфере одна страница. Она грязная (isdirty), счетчик обращений равен единице (usagecount), и она не закреплена ни одним процессом (pinning_backends).

Новых буферов не прибавилось — вторая строка поместилась на ту же страницу. Обратите внимание, что счетчик использований увеличился.

И после обращения к странице на чтение счетчик тоже увеличивается.

А если выполнить очистку?

Очистка создала карту видимости (одна страница) и карту свободного пространства (три страницы — минимальный размер этой карты).

Настройка размера

Размер кеша устанавливается параметром shared_buffers. Значение по умолчанию — смехотворные 128 Мб. Это один из параметров, которые имеет смысл увеличить сразу же после установки PostgreSQL.

Имейте в виду, что изменение параметра требует перезапуска сервера, поскольку вся необходимая под кеш память выделяется при старте сервера.

Из каких соображений выбирать подходящее значение?

Даже самая большая база имеет ограниченный набор «горячих» данных, с которыми ведется активная работа в каждый момент времени. В идеале именно этот набор и должен помещаться в буферный кеш (плюс некоторое место для «одноразовых» данных). Если размер кеша будет меньше, то активно используемые страницы будут постоянно вытеснять друг друга, создавая избыточный ввод-вывод. Но и бездумно увеличивать кеш тоже неправильно. При большом размере будут расти накладные расходы на его поддержание, и кроме того оперативная память требуется и для других нужд.

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

Стандартная рекомендация — взять в качестве первого приближения 1/4 оперативной памяти (для Windows до версии PostgreSQL 10 рекомендовалось выбирать размер меньше).

А дальше надо смотреть по ситуации. Лучше всего провести эксперимент: увеличить или уменьшить размер кеша и сравнить характеристики системы. Конечно, для этого надо иметь тестовый стенд и уметь воспроизводить типовую нагрузку — на производственной среде такие опыты выглядят сомнительным удовольствием.

Но некоторую информацию о происходящем можно почерпнуть прямо на живой системе с помощью того же расширения pg_buffercache — главное, смотреть под нужным углом.

Например, можно изучить распределение буферов по степени их использования:

В данном случае много пустых значений счетчика — это свободные буферы. Неудивительно для системы, в которой ничего не происходит.

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

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

Можно придумать и другие разрезы, которые дадут полезную информацию для размышлений. Надо только учитывать, что такие запросы:

Массовое вытеснение

При операциях, выполняющих массовое чтение или запись данных, есть опасность быстрого вытеснения полезных страниц из буферного кеша «одноразовыми» данными.

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

Для последовательного чтения (sequential scan) больших таблиц (размер которых превышает четверть буферного кеша) выделяется 32 страницы. Если в процессе чтения таблицы другому процессу тоже потребуются эти данные, он не начинает читать таблицу сначала, а подключается к уже имеющемуся буферному кольцу. После окончания сканирования он дочитывает «пропущенное» начало таблицы.

Давайте проверим. Для этого создадим таблицу так, чтобы одна строка занимала целую страницу — так удобнее считать. Размер буферного кеша по умолчанию составляет 128 Мб = 16384 страницы по 8 Кб. Значит, в таблицу надо вставить больше 4096 страниц-строк.

Теперь нам придется перезапустить сервер, чтобы очистить кеш от данных таблицы, которые прочитал анализ.

После перезагрузки прочитаем всю таблицу:

И убедимся, что табличными страницами в буферном кеше занято только 32 буфера:

Если же запретить последовательное сканирование, то таблица будет прочитана по индексу:

В этом случае буферное кольцо не используется и в буферном кеше окажется вся таблица полностью (и почти весь индекс тоже):

Похожим образом буферные кольца используются для процесса очистки (тоже 32 страницы) и для массовых операций записи COPY IN и CREATE TABLE AS SELECT (обычно 2048 страниц, но не больше 1/8 всего буферного кеша).

Временные таблицы

Исключение из общего правила представляют временные таблицы. Поскольку временные данные видны только одному процессу, им нечего делать в общем буферном кеше. Более того, временные данные существуют только в рамках одного сеанса, так что их не нужно защищать от сбоя.

Для временных данных используется кеш в локальной памяти того процесса, который владеет таблицей. Поскольку такие данные доступны только одному процессу, их не требуется защищать блокировками. В локальном кеше используется обычный алгоритм вытеснения.

В отличие от общего буферного кеша, память под локальный кеш выделяется по мере необходимости, ведь временные таблицы используются далеко не во всех сеансах. Максимальный объем памяти для временных таблиц одного сеанса ограничен параметром temp_buffers.

Прогрев кеша

После перезапуска сервера должно пройти некоторое время, чтобы кеш «прогрелся» — набрал актуальные активно использующиеся данные. Иногда может оказаться полезным сразу прочитать в кеш данные определенных таблиц, и для этого предназначено специальное расширение:

Раньше расширение могло только читать определенные таблицы в буферный кеш (или только в кеш ОС). Но в версии PostgreSQL 11 оно получило возможность сохранять актуальное состояние кеша на диск и восстанавливать его же после перезагрузки сервера. Чтобы этим воспользоваться, надо добавить библиотеку в shared_preload_libraries и перезагрузить сервер.

Поле рестарта, если не менялось значение параметра pg_prewarm.autoprewarm, будет автоматически запущен фоновый процесс autoprewarm master, который раз в pg_prewarm.autoprewarm_interval будет сбрасывать на диск список страниц, находящихся в кеше (не забудьте учесть новый процесс при установке max_parallel_processes).

Сейчас в кеше нет таблицы big:

Если мы предполагаем, что все ее содержимое очень важно, мы можем прочитать ее в буферный кеш с помощью вызова следующей функции:

Список страниц сбрасывается в файл autoprewarm.blocks. Чтобы его увидеть, можно просто подождать, пока процесс autoprewarm master отработает в первый раз, но мы инициируем это вручную:

Число сброшенных страниц больше 4097 — сюда входят и уже прочитанные сервером страницы объектов системного каталога. А вот и файл:

Теперь снова перезапустим сервер.

И сразу после запуска наша таблица снова оказывается в кеше.

Это обеспечивает тот же самый процесс autoprewarm master: он читает файл, разделяет страницы по базам данных, сортирует их (чтобы чтение с диска было по возможности последовательным) и передает отдельному рабочему процессу autoprewarm worker для обработки.

Источник

Русские Блоги

Разница между кешем и буфером

Объединение статей: Разница и подключение ОЗУ, ПЗУ, кэш-памяти

Память играет ключевую роль в компьютерах. Память обычно использует полупроводниковые запоминающие устройства, включая оперативную память (RAM), постоянную память (ROM) и кэш (CACHE). Это просто потому, что ОЗУ является наиболее важной памятью, поэтому память обычно упоминается как ОЗУ в компьютерных системах.

Оперативная память требует постоянного источника питания, в противном случае данные будут потеряны. Если данные в ОЗУ не теряются после выключения питания, это может гарантировать, что компьютер находится в состоянии последнего выключения при каждом включении, без необходимости каждый раз перезагружать компьютер и повторно открывать приложение. Тем не менее, ОЗУ требует постоянного источника питания. Есть ли способ решить эту проблему? С развитием технологий люди придумали способ подачи небольшого количества энергии в ОЗУ, чтобы предотвратить потерю данных ОЗУ. Эта функция хорошо применяется, особенно в Win2000. Блок питания подключен во время сна, но потребляет небольшое количество энергии.

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

1. Кэш: область кэш-памяти представляет собой высокоскоростной кэш, который представляет собой небольшую, но быструю память между процессором и основной памятью, поскольку скорость процессора намного выше, чем скорость основной памяти, процессор считывает данные из памяти Ожидание занимает много времени, и в кэше хранятся данные, которые только что использовался ЦП, или часть данных, которые используются повторно. В это время чтение данных из кэша будет выполняться быстрее, что сократит время ожидания ЦП и повысит производительность системы.

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

2. Буфер: буфер, используемый для хранения данных между устройствами с асинхронной скоростью или устройствами с различными приоритетами, буферы могут сократить время ожидания для межпроцессного взаимодействия. Когда скорость хранения высокая, а скорость хранения низкая При обмене данными сначала сохраняйте медленные данные, сохраняйте данные в буфере, достигайте определенного уровня для сохранения быстрого устройства, а затем считывайте данные буфера. В течение этого периода ЦП быстрого устройства может выполнять другие действия.

Буфер: Обычно используется для записи на диск, например: процесс требует считывания нескольких полей. Когда все обязательные поля считываются, поля, которые были прочитаны ранее, будут помещены в буфер.

Разница между буфером и кешем
A buffer is something that has yet to be «written» to disk. A cache is something that has been «read» from the disk and stored for later use.

Цитируемая статья 1:

Разница между буфером и кешем

1. Компьютерное оборудование

Компоненты компьютерного оборудования: процессор, память, устройства ввода-вывода (I / O), прочие (основная плата, блок питания и т. Д.)
CPU: арифметическое устройство, контроллер
Память: внутренняя память (ROM / RAM), внешняя память (диск и т. д.)
I / O: устройство ввода (мышь / клавиатура), устройство вывода (монитор / принтер)

Во-вторых, буфер и кеш

3. Характеристики буфера и кеша
Общие функции:
принадлежит памяти, и данные являются временными. После выключения питания данные будут потеряны.

3. О тесте буфера и кеша

Обратите внимание, что лучше синхронизировать перед выпуском, чтобы предотвратить потерю данных.
Из-за механизма ядра LINUX при нормальных обстоятельствах нет необходимости намеренно освобождать использованный кеш. Этот кэшированный контент может увеличить скорость чтения и записи файлов.

Что такое кэш буфер. Смотреть фото Что такое кэш буфер. Смотреть картинку Что такое кэш буфер. Картинка про Что такое кэш буфер. Фото Что такое кэш буфер
Что такое кэш буфер. Смотреть фото Что такое кэш буфер. Смотреть картинку Что такое кэш буфер. Картинка про Что такое кэш буфер. Фото Что такое кэш буфер
Как показано на рисунке выше, когда записывается новый test.txt, строка буфера / кэша увеличивается на 83М до 186,
После выполнения sync и echo 3> / proc / sys / vm / drop_caches он уменьшается до 71M, в основном из-за роли, которую играют echo 3> / proc / sys / vm / drop_caches. В кеш выпущено более 100 м.

4. Как проверить память системы Linux

Есть много способов просмотра памяти, у редьки и овощей есть своя любовь, поэтому я представлю несколько, которые можно выбрать в соответствии с личными предпочтениями.
Кратко представлена ​​последовательность от графического до командного.

1.gnome-system-monitor
Отображение истории процессора, памяти и памяти, а также истории сети. Вы можете просматривать использование памяти в режиме реального времени, но вы не можете видеть использование буфера и кэша.
Что такое кэш буфер. Смотреть фото Что такое кэш буфер. Смотреть картинку Что такое кэш буфер. Картинка про Что такое кэш буфер. Фото Что такое кэш буфер

Цитируемая статья 2:

Кэш против буфера кеш и буфер

Область кэшаcacheИ буферbufferВсе они являются местами временного хранения, но отличаются во многих отношениях. Буферная зонаbufferВ основном существует в оперативной памяти как область, где процессор временно хранит данные, например,Когда компьютеры и другие устройства имеют разные скорости, bufferБуферизованные данные сохраняются, чтобы компьютер мог выполнять другие задачи. С другой стороны, кешcacheЭто высокоскоростная область хранения, которая может быть частью других независимых областей хранения, таких как основная память или жесткий диск. Эти два метода кэширования называются кэш-памятью и дисковым кешем соответственно.

Кеш находится между процессором и памятью, его скорость выше, чем у памяти, но стоимость высока
Для обеспечения высокой скорости кешированияcacheЭто статическая память вместо динамической памяти. Эта область используется для хранения информации, к которой почти все программы обращаются во время работы, что ускоряет ее вместо поиска информации с диска при каждом запуске программы, поскольку она будет работать намного медленнее.Буферный буфер запускается на компьютере с обычной оперативной памятьюИ отслеживание изменений в запущенной программе, временно сохраненных в изменениях, в конечном итоге сохраняется на диске, например, задача текстового процессора записывается сначала для чтения данных из сохраненного буфера, а затем обновления текстового процессора Содержимое буфера.

Буферная зонаbufferВ основном используется для процессов ввода / вывода (I / O), например, при печати. Когда файл отправляется на принтер для печати, информация сохраняется в буфере, и затем принтер может получить доступ к информации в своем собственном темпе, так что процессор может быть освобожден для выполнения других задач. При хранении некоторой информации (информации о записи) на диске также используется буфер, где данные сначала сохраняются в буфере, а затем передаются на диск во время процесса. кэшbufferВ основном используется в процессе чтения и записи на основной диск, что ускоряет процесс за счет упрощения доступа к аналогичным данным, используемым различными программами.

кэшCacheЭто может быть часть оперативной памяти или часть диска. Когда основной диск используется в качестве кеша, этот процесс называется дисковым кешем, который также используется в качестве кеша памяти, где в кеше диска хранятся последние использованные данные. Если запущенная программа хочет получить доступ к данным с диска, она сначала проверяет кэш диска, а если необходимые данные в кеше диска недоступны, она только проверяет диск. Это делает процесс доступа к данным намного быстрее, потому что доступ с диска намного медленнее. Буферная зонаBufferЭто может быть только часть оперативной памяти.

Краткое описание:

1、CacheЭто высокоскоростное хранилище, иBufferЭто обычное хранилище для временного хранения в оперативной памяти.

2、CacheОн состоит из статической оперативной памяти, которая лучше, чемBufferМедленная динамическая оперативная память быстрее.

3、BufferВ основном используется для процессов ввода / вывода, в то время какCacheИспользуется для чтения и записи процессов с диска.

4、CacheТакже может быть частью диска, иBufferЭто просто часть оперативной памяти.

5. ВCacheМожет использоваться на клавиатуре, если она не может быть использованаBufferДля редактирования опечаток.

Источник

Кэш и буфер 2021

Что такое кэш буфер. Смотреть фото Что такое кэш буфер. Смотреть картинку Что такое кэш буфер. Картинка про Что такое кэш буфер. Фото Что такое кэш буфер

Кэш против буфера

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

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

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

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *