Прошлый 2022 год заставил много компаний пересмотреть свои предпочтения в выборе программного обеспечения. Все чаще встречаются кейсы, когда для работы 1С используется СУБД PostgreSQL, а вместо Windows Server используется Linux ОС.
Целью данной статьи является изучение в 2023 году производительности системы 1С в среде Hyper-V (ОС Windows Server 2019) во взаимодействии с сервером СУБД PostgreSQL Standart 13.9 (ОС Debian 11.5) от команды PostgresPro. В материале мы описываем исследование зависимости параметров конфигурационного файла, результаты замеров производительности при изменении данных параметров.
Состав тестового стенда
Аппаратная часть
Supermicro X11DPL‑i*
2 x Intel Xeon X 5690 3,4 GHz, each 6 Core **
ОЗУ 128 ГБ DDR3
Хранилище RAID 1, Intel DC S3710 SSDSC2BA400G401 400 ГБ
*Исследование проводим на проверенной временем аппаратной платформе Supermicro от 2011 года.
**При использовании платформы Intel Gold в связке с скоростными дисками, большинство исследуемых параметров осталось в рамках погрешности. Не удалось сгенерировать нагрузку, чтобы заметить тенденцию к существенному изменению показателей.
Программная часть
Платформа 1С:Предприятие 8.3.22.1750.
Конфигурации: 1С:ERP Управление предприятием 2. Демо база. Тест "Полный" на 33 пользователя. Редакция 2.5.8.179. Объем базы 4.2 ГБ.
Сервер приложений 1С: ОС Windows Server 2019 Standard.
Сервер базы данных: ОС Debian 11.5, Postgres pro Standart 13.9.
Примечание: В рамках тестирования мы используем стандартный шаблон от фирмы 1С – полный, 33 пользователя. Безусловно, используемое железо сможет вытянуть и больше испытуемых. Наша цель отследить тенденцию, а не нагрузить железо.
Общая методика тестирования
В рамках данной статьи мы применяем методику анализа используя абсолютные значения погрешности:
-
Описание методики определения абсолютной погрешности:
Определяем идеальные условия испытаний. В нашем случае это два виртуальных сервера с ролью Application сервера 1С на Windows, и сервера баз данных с подготовленной конфигурацией.
Выполняем по 3 теста APDEX с числом пользователей 33 на PostgreSQL.
Производим расчет абсолютной погрешности по формуле:
-
Основной этап тестирования:
Проводим замер целевых значений. Проводится 3 замера теста “Полный” в конфигурации ERP.
Проводим серию основных испытаний (повторяем со всеми исследуемыми значениями). Проводится уменьшение первого исследуемого значения на 100%.
Проводим увеличение первого исследуемого значения на 100%.Значения в положении on\off активируем или деактивируем соответственно (например, компоненты параллелизма).
Тест 1С:КИП (Апдекс)
В основе методики АПДЕКС лежит набор инструментов 1С:КИП. В данном случае, использовался весь функционал методологии. Использовалась стандартная демонстрационная база 1С:ERP с сайта 1С.
Стандартная методология АПДЕКС использует прогрессивную шкалу от 0 до 1, где 1 – это замечательный результат, а 0 – неудовлетворительный. Требуется указать целевое значение параметра производительности той или иной операции, создать сценарии и запустить тест.
Подготовка тестового стенда
Проводим установку и базовую настройку носителя виртуальных машин и операционных систем.
Носитель виртуальных машин
Перед работой с носителем были произведены твики биоса. В данном случае необходимо было вручную выставить режим “Maximum Perfomance” в расширенных настройках CPU. Данные настройки применены для всех участников тестирования
Power Technology. Ставим Custom.
Power Performance Tuning. Здесь нужно выбрать: или управлять питанием будет BIOS или ОС. Наш опыт с Hyper-v говорит о выборе в сторону OS control.
Energy_perf_bias_cfg mode. Ставим Maximum Performance.
Настройки электропитания ОС. Ставим производительность.
Результатом наших манипуляций является фиксированная в режиме turbo-boost частота процессора (в нашем случае это 3,46 ГГц ).
Операционные системы и приложения
Application сервер 1С:
Установлена ОС Windows Server 2019 Standard.
Установлен 1С сервер.
Режим электропитания - максимальная производительность.
Носитель виртуальных машин:
Установлена ОС Windows Server 2019 Standard.
Режим электропитания - максимальная производительность.
SQL Server:
Установлена ОС Debian 11.5.
Установлен Postgres Pro 13.9.
Выделяем ресурсы под виртуальные машины:
Application сервер 1С – 12 ядер ЦП и 40 ГБ ОЗУ.
SQL сервер – 10 ядер ЦП и 30 ГБ ОЗУ (параметры конфигурации рассчитываем исходя из 20 ГБ ОЗУ для того, чтобы был запас по росту).
Производим проверку дисковой подсистемы Crystal Disk Mark. Настройки стандартные. Тест файлом 32ГБ:
Настройка Postgres
Подготовка исходного конфига
После оформления заявки на сайте https://1c.postgres.ru/ на нашу почту приходит письмо с командами:
wget https://repo.postgrespro.ru/1c-13/keys/pgpro-repo-add.sh
sh pgpro-repo-add.sh
Если продукт единственный Postgres на вашей машине и вы хотите сразу получить готовую к употреблению базу:
apt-get install postgrespro-1c-13
Выполняем их, не забывая:
Перед этим сменить локаль на ru_RU.utf8
Задать пароль учетке Postgres.
Проводим анализ файла postgresql.conf, находящегося по адресу: /var/lib/pgpro/1c-13/data
Большинство строк в нем закомментированы. Часть настроек изменяется при установке и зависит от числа ядер и ОЗУ выделенных на ВМ, это одно из преимуществ продукта.
shared_buffers = 5000MB # 25% of RAM
temp_buffers = 128MB
work_mem = 256MB
maintenance_work_mem = 256MB
max_files_per_process = 10000
max_parallel_workers_per_gather = 0
max_parallel_maintenance_workers = 3 # Количество CPU/4, минимум 2, максимум 6
commit_delay = 1000
max_wal_size = 4GB
min_wal_size = 2GB
checkpoint_timeout = 15min
effective_cache_size = 15000MB # 75% of RAM
from_collapse_limit = 8
join_collapse_limit = 8
autovacuum_max_workers = 6 # Количество CPU/2, минимум 2
vacuum_cost_limit = 600 # 100* autovacuum_max_workers
autovacuum_naptime = 20s
autovacuum_vacuum_scale_factor = 0.01
autovacuum_analyze_scale_factor = 0.005
max_locks_per_transaction = 256
escape_string_warning = off
standard_conforming_strings = off
shared_preload_libraries = 'online_analyze, plantuner'
online_analyze.threshold = 50
online_analyze.scale_factor = 0.1
online_analyze.enable = on
online_analyze.verbose = off
online_analyze.min_interval = 10000
online_analyze.table_type = 'temporary'
plantuner.fix_empty_table = on
random_page_cost = 1.0
effective_io_concurrency = 1
Это и будет наш основной эталонный конфиг для старта тестов.
Исследуемые элементы и этапы тестирования:
Тест 1,2,3 – определение погрешности стоковых значений
Тест 4 – random_page_cost = 4.0
Тест 5 – effective_io_concurrency = 400
Тест 6 – shared_buffers = 2500MB
Тест 7 – shared_buffers = 10000MB
-
Тест 8 (комплексные значения):
max_parallel_workers_per_gather = 4
max_parallel_maintenance_workers = 3 # Количество CPU/4, минимум 2, максимум 6
max_worker_processes = 10
max_parallel_workers = 10
Пройдемся кратко по основным значениям:
-
shared_buffers = 5GB # 25% of RAM
Задаёт объём памяти, который будет использовать сервер баз данных для буферов в разделяемой памяти. Согласно рекомендации команды Postgres pro, рекомендуемое значение: 25% от ОЗУ сервера SQL.
-
temp_buffers = 128MB
Задает максимальный объем памяти, выделяемой для временных буферов в каждом сеансе. Эти, существующие только в рамках сеанса буферы, используются исключительно для работы с временными таблицами.
-
work_mem = 256MB
Задает базовый максимальный объём памяти, который будет использоваться во внутренних операциях при обработке запросов (например, для сортировки или хеш-таблиц), прежде чем будут задействованы временные файлы на диске.
-
maintenance_work_mem = 256MB
Задает максимальный объем памяти для операций обслуживания БД, в частности VACUUM, CREATE INDEX и ALTER TABLE ADD FOREIGN KEY.
-
max_parallel_workers_per_gather = 0
Количество воркеров, которые запускаются на узел. Это основополагающая настройка, если вы ее выставите в ноль, параллелизм не будет отрабатывать, будет работать один процесс, один оператор. Когда оптимизатор запросов принимает решение, что для запроса нужно применять параллелизм, он смотрит на этот параметр и определяет, сколько ему нужно воркеров, чтобы выполнить этот оператор запроса.
-
max_parallel_maintenance_workers = 3 # Количество CPU/4, минимум 2, максимум 6
Задаёт максимальное число рабочих процессов, которые могут запускаться одной служебной командой.
-
max_wal_size = 16GB и min_wal_size = 4GB
Минимальный и максимальный размер файлов журнала предзаписи.
-
effective_cache_size = 15000MB # 75% of RAM
Этот параметр влияет на планировщик запросов, а не ограничивает дисковый кэш. Чем выше, тем больше вероятность, что будет применяться сканирование по индексу. Чем ниже, тем более вероятно, что будет выбрано последовательное сканирование.
-
random_page_cost = 1.0
Задает приблизительную стоимость чтения одной произвольной страницы с диска. Значение по умолчанию равно 4.0. С хранилищем, у которого стоимость произвольного чтения ненамного выше последовательного, как, например, у твердотельных накопителей, лучше выбрать меньшее значение random_page_cost. Параметр наиболее эффективен, при условии что база полностью помещается в ОЗУ. Сервер SQL не знает какая у нас дисковая подсистема и какое время Seek Time, потому данный параметр необходимо задать вручную в среде Linux. В Windows параметр проставляется автоматически:
4.0 – для HDD;
1.5-2.0 – для RAID из HDD;
1.1 – 1.5 – для SSD;
0.1 – 1.0 – для NVMe.
-
effective_io_concurrency = 200
Задаёт допустимое число параллельных операций ввода/вывода, которое говорит PostgreSQL о том, сколько операций ввода/вывода могут быть выполнены одновременно. Чем больше это число, тем больше операций ввода/вывода будет пытаться выполнить параллельно PostgreSQL в отдельном сеансе. Диски SSD и другие виды хранилища в памяти часто могут обрабатывать множество параллельных запросов, так что оптимальным числом может быть несколько сотен.
Результаты тестирования
Таблица определения погрешностей:
Название параметров |
Значение Апдекс |
Среднее значение Апдекс |
Относительная погрешность Апдекс |
Абсолютная погрешность Апдекс |
Тест определения погрешности 1 |
0,816 |
0,81 |
0,01 |
0,65% |
Тест определения погрешности 2 |
0,805 |
|||
Тест определения погрешности 3 |
0,808 |
Таблица результатов тестирования:
Название параметров |
Стандартное значение параметров |
Измененное значение параметров |
Апдекс |
Абсолютная разница со средним значением |
random_page_cost |
1.0 |
4.0 |
0,791 |
3,35% |
effective_io_concurrency |
1 |
400 |
0,783 |
3,20% |
shared_buffers |
5000MB |
2500 |
0,797 |
1,50% |
10000 |
0,807 |
в пределах погрешности |
||
max_parallel_workers_per_gather |
0 |
4 |
0,808 |
в пределах погрешности |
work_mem |
256MB |
128MB |
0,806 |
в пределах погрешности |
512MB |
0,798 |
1,50% |
Оценка результатов
-
random_page_cost = 4.0
Ожидаемо ухудшение показателей. Значение 4 – для HDD дисков.
-
effective_io_concurrency = 400
Согласно общей рекомендации 1С, а также документации с сайта разработчика, увеличение данного параметра должно было позитивно отразиться на производительности дисковой системы, на деле это не так. Изменение данного параметра проводить с осторожностью.
-
shared_buffers = 2500 shared_buffers = 10000
Не стоит выставлять слишком высокие, а так же слишком низкие значения данного показателя. Согласно общей рекомендации 1С, значения 25% от общего объема ОЗУ – достаточно для работы.
-
max_parallel_workers_per_gather = 4
При использовании типовых конфигурации, активация данной настройки пользы не несет. Используется другой механизм, данное замечание разберем в наших следующих материалах. Рекомендуемое значение – 0.
-
work_mem = 128MB work_mem = 512MB
Изменение данных показателей практической ценности не несет.
При изменении показателей общая тенденция на ухудшение. Это означает, что изначально были выбраны корректные настройки конфигурации для конкретной базы. Также это говорит о том, что все изменения файла конфигурации необходимо применять исключительно со знанием физики процесса. В случае, если опыта не хватает, мы рекомендуем изменять только один параметр random page cost, а все остальные оставлять по умолчанию.
Выводы
2023 год продолжит тенденцию к импортозамещению. Уже сейчас можно сказать, что Postgres Pro можно использовать в продакшн среде. Данный продукт есть в реестре продуктов импортозамещения.
К основным плюсам продукта можно отнести:
единственное на текущий момент коммерческое решение с полноценной поддержкой.
практически полностью автоматическая настройка конфигурации под ваше железо/ВМ.
Минусы:
высокий порог входа в Linux, и, как следствие, увеличение требований к персоналу и затратам.
В ближайшей перспективе мы ожидаем роста конкурентоспособности отечественных решений на рынке и постепенный отказ от продуктов Microsoft.
Комментарии (9)
nikweter
05.04.2023 20:28+1Где-то с тринадцатой версии платформы 1С каждый раз при ставке во временной таблице делает аналайз автоматом. Поэтому в online_analyze и online_analyze.table_type = 'temporary' нет никакого смысла.
EFSOLOBLAKO Автор
05.04.2023 20:28Да, мы видели данное уточнение в на сайте одного из интеграторов. Ради интереса провели серию замеров. В нашем сценарии ничего не поменялось при отключении данного параметра.
Думаем стоит ждать изменений от команды Postgres Pro
mylitsyn
05.04.2023 20:28+1уже не единственное, есть СУБД Тантор и там как раз порог входа ниже
Asmody
05.04.2023 20:28Есть примеры как 1С работает с Тантором?
mylitsyn
05.04.2023 20:28публичных сравнений не видел, но вот их сегодняшняя новость - там и про 1С написано: https://astralinux.ru/news/category-news/2023/tantor-labs-predstavila-obnovlennuyu-platformu-monitoringa-i-administrirovaniya/
MarksMan09
05.04.2023 20:28Понеслось импортозамещение
пов массы - не все PostgresPro одной сливки снимать, надо больше клоУнов ... "СУБД Tantor - это собственная разработка компании ООО «Лаборатории Тантор» на основе открытой СУБД PostgreSQL. В дополнение к богатому функционалу PostgreSQL включены ряд доработок, улучшающих характеристики СУБД, а также набор инструментов, необходимых в повседневной эксплуатации."
q2digger
Спасибо, очень интересно и очень вовремя! Вопрос, я не настоящий сварщик, поэтому не очень хорошо разбираюсь во внутренней кухне Posgresql. Мне от коллеги достался 1с + Pgpro 14 и я сейчас посмотрел на конфиг и обнаружил, что параметры
- max_parallel_workers_per_gather
- max_parallel_maintenance_workers
у меня вообще отсутствуют. Точнее первый закомментирован, а второй даже не указан в конфиге. Стоит добавить в конфиг? Сервер - виртуалка, но памяти много и на быстрой дисковой системе.
onegreyonewhite
Лучше разберитесь что эти параметры делают и когда они нужны. Есть хороший бесплатный курс, который можно посмотреть, скачать и попробовать от разработчиков Postgres, про оптимизацию вообще всего в PG. Хотя я советую вообще все курсы оттуда пройти, если планируете активно использовать pg в продакшене.
Тогда все рекомендации начнут обретать определённый смысл и начнёте разбираться как тонко настроить субд, чтобы выжать максимум из железа. Плюс научитесь менять эти параметры в зависимости от изменений в самой БД. Тогда вас будет жёстко триггерить от того, что люди не понимают значение
effective_io_concurrency
и как работает SATA и NVMe протоколы (да и вообще дисковая и файловая системы).EFSOLOBLAKO Автор
Сложно давать рекомендации, не видя картины в целом. Обратите внимание на файл postgresql.auto.conf. Необходимо вывести через командную строку список всех параметров и там вы увидите то, что ищите. Скорее всего там эти параметры не затронуты.
На у в целом сломать конфиг довольно сложная задача, мы пытались :)
В дополнение к postgresql.conf в каталоге данных PostgreSQL содержится файл postgresql.auto.conf, который имеет тот же формат, что и postgresql.conf, но предназначен для автоматического изменения, а не для редактирования вручную. Этот файл содержит параметры, задаваемые командой ALTER SYSTEM. Он считывается одновременно с postgresql.conf и заданные в нём параметры действуют таким же образом. Параметры в postgresql.auto.conf переопределяют те, что указаны в postgresql.conf.