Linux: Буферный кэш (buffer cache)

Linux Logo System

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

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

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

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

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

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

В Linux bdflush запускается обновлением. Обычно нет причин беспокоиться об этом, но если bdflush по какой-то причине заглохнет, ядро предупредит об этом, и вам следует запустить его вручную (/sbin/update).

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

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

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

В Linux вам не нужно ничего делать для использования кэша, это происходит полностью автоматически.

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