Как устранить предупреждения checkpoints are occurring too frequently и настроить контрольные точки в PostgreSQL для 1С?

Системный администратор 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При анализе системных журналов PostgreSQL, обслуживающего базы данных 1С:Предприятие, системные администраторы часто сталкиваются с регулярными предупреждениями вида LOG: checkpoints are occurring too frequently. Разберем детально, почему возникает данная ситуация, как работают контрольные точки в СУБД и как правильно рассчитать параметры журнала транзакций для снижения нагрузки на дисковую подсистему.

Причина возникновения предупреждений в журнале СУБД

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

Срабатывание контрольной точки инициируется по одному из двух условий:

  1. По истечении интервала времени: параметр checkpoint_timeout определяет максимальный временной промежуток между автоматическими чекпоинтами.
  2. По заполнению объема журнала транзакций: если объем сгенерированных изменений превышает заданный лимит сегментов WAL до истечения таймаута.

Когда база 1С выполняет интенсивную запись (например, при проведении документов, групповом перепроведении, реструктуризации таблиц или обновлении конфигурации), объем WAL-записей заполняется быстрее, чем наступает checkpoint_timeout. Если контрольная точка происходит чаще, чем задано порогом checkpoint_warning (по умолчанию 30 секунд), PostgreSQL выводит предупреждение о слишком частых чекпоинтах.

Влияние частых контрольных точек на производительность (Full Page Writes)

Проанализируем скрытую опасность частых контрольных точек. В PostgreSQL действует механизм защиты от повреждения данных при сбоях — full_page_writes. Сразу после завершения каждого чекпоинта первое изменение любой страницы таблицы или индекса приводит к записи всей 8-килобайтной страницы целиком в журнал предзаписи WAL, а не только дельты изменений.

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

Настройка параметров для PostgreSQL версий до 9.5

В устаревших версиях СУБД (например, 9.4 и более ранних) объем журнала между чекпоинтами регулировался параметром checkpoint_segments. По умолчанию значение составляло всего 3 сегмента (по 16 МБ каждый), чего категорически недостаточно для транзакционной нагрузки 1С.

Рассмотрим порядок настройки параметров в конфигурационном файле postgresql.conf:

  1. Увеличим количество сегментов: параметр checkpoint_segments задается в диапазоне от 32 до 256 в зависимости от интенсивности записи и доступного дискового пространства.
  2. Рассчитаем требуемое место на накопителе по формуле: (checkpoint_segments * (2 + checkpoint_completion_target) + 1) * 16 МБ. Например, при значении 32 под журнал WAL потребуется гарантированно выделить более 1 ГБ дискового пространства.
  3. Увеличим таймаут чекпоинта: для 1С значение checkpoint_timeout рекомендуется повышать с типовых 5min до 15min или 30min.
  4. Настроим плавность сброса буферов: параметр checkpoint_completion_target выставляем в значение 0.9, что позволяет растянуть дисковую запись на 90% интервала между точками и избежать резких пиков ввода-вывода (I/O spikes).

Настройка параметров для PostgreSQL версий 9.5 и новее

Начиная с версии PostgreSQL 9.5 механизм управления журналами был модернизирован: параметр checkpoint_segments упразднен, а вместо него введены динамические параметры min_wal_size и max_wal_size.

Разберем базовые оптимальные настройки для конфигурации postgresql.conf:

  1. max_wal_size: максимальный размер, до которого может вырасти каталог WAL при автоматических контрольных точках. Для баз 1С средних и крупных объемов рекомендуются значения от 4GB до 16GB (или более при высоких нагрузках).
  2. min_wal_size: минимальный объем удерживаемого дискового пространства (рекомендуется от 1GB до 2GB). Система не удаляет файлы журналов ниже этого порога, а переименовывает и переиспользует их, экономя операции создания файлов на диске.
  3. checkpoint_timeout: выставляем значение от 15min до 30min. Следует помнить, что увеличение интервала немного увеличивает время автоматического восстановления базы после внезапного аварийного выключения питания, но существенно разгружает диски в штатном режиме.
  4. checkpoint_completion_target = 0.9: распределяет операцию ввода-вывода равномерно по времени.
  5. wal_buffers: буфер в оперативной памяти для записи данных WAL. Рекомендуется установить значение не менее 16MB (или -1 для автоматического выделения 1/32 от размера shared_buffers).

Взаимосвязь с ошибкой «Out of memory for query result»

Иногда при выполнении обновлений или пакетных операций на фоне предупреждений чекпоинтов возникает ошибка Out of memory for query result. Выясним причину ее появления:

  1. Данное сообщение формируется не на стороне СУБД, а клиентской библиотекой драйвера в рабочем процессе сервера 1С rphost.
  2. Ошибка характерна для 32-разрядного сервера 1С:Предприятие, где виртуальное адресное пространство одного процесса ограничено 2–3 ГБ. Если тяжелый запрос возвращает огромный массив данных, процесс 1С не может непрерывно выделить нужный объем ОЗУ для приема ответа от PostgreSQL.
  3. Для устранения этой проблемы рекомендуется использовать 64-разрядный сервер 1С, настраивать ограничения памяти рабочих процессов в консоли кластера 1С, а также разбивать масштабные выборки данных на порции с периодической фиксацией транзакций.

Диагностическое сообщение «Can't find mchar/mvarvarchar types»

В логах модифицированных сборок PostgreSQL для 1С при системных запросах может фиксироваться запись Can't find mchar/mvarvarchar types: mchar=0 mvarchar=0. Данное сообщение имеет уровень LOG и возникает при подключении системных утилит или фоновых служб к базам данных, где не активированы специализированные расширения типов данных 1С. Если основные информационные базы работают штатно, это сообщение носит исключительно информационный характер и не требует вмешательства.

← На главную