В операционной системе Linux больше нет отдельного буферного кэша. В ядрах серии 2.2 существовало два отдельных кэша: страничный и буферный. В первом кэшировались: страницы памяти, а в другом — буферы. Эти два кэша не были объединены между собой. Дисковый блок мог находиться в обоих кэшах одновременно. Это требовало больших усилий по синхронизации двух кэшированных копий, не говоря уже о напрасной трате памяти.
Так было в ядрах серии 2.2 и более ранних, но начиная с ядер Linux серии 2.4 оба кэша объединили вместе. Сегодня существует только один дисковый кэш — страничный кэш.
Ядру все еще необходимо использовать буферы для того, чтобы представлять дисковые блоки в памяти. К счастью, буферы описывают отображение блоков на страницы памяти, которые в свою очередь находятся в страничном кэше.
Демон pdflush
Измененные (dirty, "грязные") страницы памяти когда-нибудь должны быть записаны на диск. Обратная запись страниц памяти выполняется в следующих двух случаях.
• Когда объем свободной памяти становится меньше определенного порога, ядро должно записать измененные данные обратно на диск, чтобы освободить память.
• Когда несохраненные данные хранятся в памяти достаточно долго, то ядро должно их записать на диск, чтобы гарантировать, что эти данные не будут находиться в несохраненном состоянии неопределенное время.
Эти два типа записи имеют разные цели. В более старых ядрах они выполнялись двумя разными потоками пространства ядра (см. следующий раздел). Однако в ядре 2.6 эту работу выполняет группа (gang[87]) потоков ядра pdflush
, которые называются демонами фоновой обратной записи (или просто потоками pdflush
). Ходят слухи, что название pdflush
— это сокращение от "dirty page flush" ("очистка грязных страниц"). Не обращайте внимание на это сомнительное название, давайте лучше более детально рассмотрим, для чего нужны эти процессы.
Во-первых, потоки pdflush
служат для записи измененных страниц на диск, когда объем свободной памяти в системе уменьшается до определенного уровня. Цель такой фоновой записи — освобождение памяти, которую занимают незаписанные страницы, в случае недостатка физических страниц памяти. Уровень, когда начинается обратная запись, может быть сконфигурирован с помощью параметра dirty_background_ratio
утилиты sysctl
. Когда объем свободной памяти становится меньше этого порога, ядро вызывает функцию wakeup_bdflush()
[88] для перевода в состояние выполнения потока pdflush
, который выполняет функцию обратной записи измененных страниц памяти background_writeout()
. Эта функция получает один параметр, равный количеству страниц, которые функция должна попытаться записать на диск.
Функция продолжает запись до тех пор, пока не выполнятся два следующих условия.
• Указанное минимальное количество страниц записано на диск.
• Объем свободной памяти превышает соответствующее значение параметра dirty_background_ratio
.
Выполнение этих условий гарантирует, что демон pdflush
выполнил свою работу по предотвращению нехватки памяти. Если эти условия не выполняются, то обратная запись может остановиться только тогда, когда демон pdflush
запишет на диск все несохраненные страницы и для него больше не будет работы.
Во-вторых, назначение демона pdflush
— периодически переходить в состояние выполнения (независимо от состояния нехватки памяти) и записывать на диск очень давно измененные страницы памяти. Это гарантирует, что измененные страницы не будут находиться в памяти неопределенное время. При сбоях системы будут потеряны те страницы памяти, которые не были сохранены на диске, так как содержимое памяти после перегрузки не сохраняется. Следовательно, периодическая синхронизация страничного кэша с данными на диске является важным делом. При загрузке системы инициализируется таймер, периодически возвращающий к выполнению поток pdflush
, который выполняет функцию wb_kupdate()
. Эта функция выполняет обратную запись данных, которые были изменены более чем dirty_expire_centisecs
сотых секунды тому назад. После этого таймер снова инициализируется, чтобы сработать через dirty_expire_centisecs
сотых секунды. Таким образом потоки pdflush
периодически возвращаются к выполнению и записывают на диск все измененные страницы, данные в которых старше, чем указанный лимит.
Системный администратор может установить эти значения с помощью каталога /proc/sys/vm
и утилиты sysctl
. В табл. 15.1 приведен список всех соответствующих переменных.
Таблица 15.1. Параметры для настройки демона pdflush