«id =» main «> Поделиться Итак, как избавиться от» грязных страниц «
При настройке баз данных Postgres нельзя забывать об одновременной настройке операционной системы и файловой системы, на которую она была установлена. Для некоторых параметров конфигурации, например огромных страниц или настроек bgwriter, такое действие абсолютно необходимо. В этой статье я попытаюсь объяснить два параметра — vm.dirty_background_ratio и vm.dirty_ratio — которые являются основой настройки операционной системы. Особенно в ситуациях, когда мы уже испытывали проблемы с нестабильной работой базы данных: четкие всплески и падения TPS или значительные задержки в операции записи.
vm.dirty_background_ratio & nbsp; — определяет допустимый размер буфер записи в процентах от общей системной памяти, которая может быть заполнена грязными страницами, то есть страницами, которые были каким-либо образом изменены и должны быть записаны на диск, прежде чем демон pdflush сможет записать их на диск. Значение по умолчанию для этого параметра — 10 (%).
vm.dirty_ratio & nbsp; — по умолчанию 20. Максимальный размер буфера записи. Когда это достигается, записи переходят в синхронный режим, блокируя все другие операции записи, что с большим буфером записи и/или маленьким буфером контроллера может привести к катастрофе. Обратите внимание, что принудительная запись необходима для защиты данных, которые нельзя считать должным образом защищенными, пока они не находятся на надежном носителе.
Оптимизация буфер записи, или как избавиться от грязных страниц
В случае сервера с общим объемом памяти 6 ТБ, только после превышения 600 ГБ система начинает сбрасывать их на диск. Если у нас нет эффективного массива, а база данных все еще получает запросы на запись, мы рискуем достичь 1,2 ТБ, порогового значения по умолчанию dirty_ratio. Это будет означать, что запись сервера полностью прекратится, а pdflush будет сильно записывать грязные страницы до тех пор, пока размер буфера записи не станет меньше значения, указанного параметром dirty_ratio.
Если по какой-то причине вы не хотите использовать пропорции общей памяти, вы можете также объявить размер буфера записи в байтах с параметрами vm.dirty_background_bytes и vm.dirty_bytes.
Описанные значения следует корректировать на каждом сервере базы данных, независимо от его производителя. Как это обычно бывает, универсальных ценностей не бывает. Их настройка зависит как от параметров сервера, так и от специфики системы. Конечно, есть рекомендации — например, Red Hat рекомендует следующие настройки базы данных:
vm.dirty_ratio = 15, vm.dirty_background_ratio = 3.
Грег Смит в своей книге «High Performance PostgreSQL 9.0/9.6» «, предлагает даже снизить эти значения до 2 и 1 соответственно для систем с большим объемом памяти.
Конечно, лучшими значениями для конкретного сервера будут те, которые были проверены и протестирован непосредственно на этом сервере. Поэтому рекомендуется постепенно снижать значения по умолчанию на выбранное значение (например, 1%) и отслеживать поведение системы после изменения. Обратите особое внимание на изменения задержки запроса, которые можно найти, например, внизу главной страницы отчета pgBadger.
Также стоит отслеживать/etc/meminfo, проверив:
grep -A1 Dirty/proc/meminfo Dirty: 128 kB Обратная запись: 0 kB
Первое значение сообщает нам, сколько грязных страниц в данный момент находится в буфере, а второе — сколько грязных страниц система пытается записать. Высокая ценность обратной записи должна заинтересовать нас.