При работе в конфигурации «1С:Бухгалтерия предприятия 3.0» на клиент-серверной архитектуре под управлением PostgreSQL пользователи нередко сталкиваются с микрофризами: пролистывание списка банковских выписок или документов реализации происходит с рывками, а после нажатия кнопки «Провести и закрыть» пиктограмма состояния документа в списке обновляется с задержкой в 1–2 секунды даже при минимальном количестве работающих пользователей. Выясним причину такого поведения и разберем по шагам комплекс мер для ускорения работы базы данных.
Проанализируем ситуацию: задержка обновления списка и проведение документа часто связаны не с нехваткой аппаратных мощностей сервера или проблемами локальной сети (ping 10–12 мс без потерь пакетов является допустимым), а с накоплением устаревших версий строк («мертвых кортежей» или dead tuples) и неактуальной статистикой распределения данных в таблицах PostgreSQL.
Рассмотрим подробнее механизм работы PostgreSQL. При каждом проведении или изменении документа СУБД физически не перезаписывает старую запись, а помечает её как неактуальную и добавляет новую. Если очистка не выполняется вовремя, таблицы и индексы раздуваются (возникает bloat), а оптимизатор запросов строит неоптимальные планы выполнения, выполняя полное сканирование таблицы (Seq Scan) вместо поиска по индексу (Index Scan).
Разовый запуск утилиты vacuumdb позволяет быстро очистить мусор и вернуть производительность, однако для долгосрочной стабильной работы необходимо скорректировать параметры встроенного демона autovacuum в конфигурационном файле postgresql.conf:
autovacuum_vacuum_scale_factor = 0.02
autovacuum_analyze_scale_factor = 0.02
autovacuum_naptime = 15s
autovacuum_vacuum_cost_limit = 1000
Посмотрим на настройки планировщика запросов. По умолчанию параметр random_page_cost в PostgreSQL равен 4.0, что рассчитано на медленные механические жесткие диски (HDD) с большим временем позиционирования головки. При использовании SSD-накопителей стоимость случайного чтения практически равна последовательному.
postgresql.conf и изменим параметр:
random_page_cost = 1.1
Разберем влияние фоновых процессов платформы. Полнотекстовый поиск данных выполняет постоянную индексацию измененных объектов. Если регламентное задание «Обновление индекса ППД» выполняется каждые 30–60 секунд, оно непрерывно захватывает блокировки, генерирует дисковый трафик и создает конкуренцию за ресурсы с интерактивными транзакциями пользователей.
Посмотрим, как устроен список документов в управляемом приложении. Динамический список формы списка документов (банковские выписки, платежные поручения) использует сложный запрос с левыми соединениями к регистрам сведений для вывода картинок состояния (проведен, подписан, оплачен, отправлен в банк).
Если после обслуживания СУБД задержки сохраняются, настроим сбор данных технологического журнала 1С для поиска «узких мест». Создадим файл logcfg.xml в каталоге conf платформы 1С:
<config xmlns="http://v8.1c.ru/v8/tech-log">
<log location="C:\Logs\1C_SlowQueries" history="24">
<event>
<eq property="name" value="DBPOSTGRS"/>
<gt property="duration" value="1000000"/>
</event>
<event>
<eq property="name" value="TLOCK"/>
</event>
<event>
<eq property="name" value="TTIMEOUT"/>
</event>
<property name="all"/>
</log>
</config>
Этот лог зафиксирует все запросы к PostgreSQL длительностью более 1 секунды (duration > 1000000 мкс), а также покажет возможные конфликты управляемых блокировок (TLOCK, TTIMEOUT) между фоновыми заданиями и интерактивной работой бухгалтера.
В качестве дополнительной меры локализации исключим проблемы на стороне рабочего места пользователя. Закроем «1С:Предприятие» и очистим временные файлы тонкого клиента, удалив папки с буквенно-цифровыми именами по путям:
%LOCALAPPDATA%\1C\1cv8\%APPDATA%\1C\1cv8\Своевременная автоочистка и актуализация статистики в PostgreSQL в сочетании с оптимизацией фоновых заданий полностью устраняют задержки при проведении документов и обеспечивают плавный скроллинг списков в 1С:Бухгалтерии 3.0.