Как стать автором
Поиск
Написать публикацию
Обновить

Как мы успешно прошли тест на 30 000 одновременных пользователей в 1C:ERP (и что мы подкрутили в PostgreSQL)

Уровень сложностиСредний
Время на прочтение19 мин
Количество просмотров12K
Всего голосов 39: ↑39 и ↓0+44
Комментарии78

Комментарии 78

тест 1С:ERP на 30 000 одновременных конкурирующих пользователей

Для эмуляции пользовательской нагрузки мы использовали 32 сервера-нагрузчика, на каждом стояло по шесть виртуальных машин, для теста запускалось по 160 пользовательских сеансов на сервер

32 * 160 = 5'120

Откуда 30'000? Или все-таки 160 пользовательских сеансов на виртуальную машину (а не на сервер)? Тогда получается 32 * 6 * 160 = 30'720

Вы правы, у нас опечатка.
Поправили.
Спасибо!

В чём разница? Сервер 1С:Предприятия крутится на физическом или виртуальном сервере.

Не сервер,, клиенты на виртуальных серверах

Вы изменили реализацию (заменили спинлок на барьер), но не обновили комментарий, там остался спинлок.

Так и задумано - чтобы читателю было видно, что раньше был спинлок.

кластер из шести серверов
Спецификация серверов кластера:
Intel(R) Xeon(R) Gold 6426Y 2500 MHz L1/L2/L3 1280/32768/38400 KB 16 cores/32 threads, ОЗУ 256 Гб, 1 SAS SSD 1920 ГБ Samsung PM1643a

Впечатляет )) А для внедрений на 1000 пользователей, скажем, рекомендуемые параметры кластера можно где-то поглядеть в открытом доступе?

Я к тому что SAP S/4HANA вполне себе бодренько крутится на кластере из двух серверов приложений c RAM по 64 гига каждый. И тысячу или около того пользователей успешно выдерживает.

в HANA на сколько RAM для 1000пользователей?

Для кластера серверов приложений (они же ABAP Application Server) - как и указано выше:

на кластере из двух серверов приложений c RAM по 64 гига каждый

Требования к RAM для сервера БД зависят от ожидаемого количества данных во всех развертываемых модулях, поскольку вся БД in-memory. На практике для стандартного набора модулей (бухучет, управленческий учет, казначейство, закупки и склад, сбыт, производство, техобслуживание и ремонты) от 256 до 512 гигов, для особо тяжелых случаев 1 TB. Еще балансировщик нагрузки, но там копейки.

т.е как и тут для 1С на PostgreSQL, так и для SAP S/4 на HANA будет достаточно сервера БД:
ЦПУ: Ampere Altra Max M96-28, 2800 MHz 96 cores
Память: 1 Тб Samsung DDR4 64 Гб 3200 MT/s
Накопитель: SSD 7.7 Tb NVMe Samsung PM1733a

Хороший кстати вопрос - а зачем Postgres в этой конфигурации терабайт памяти? С HANA понятно, там вся БД в RAM должна помещаться. А Postgres почему столько требует?

Может нам автор статьи пояснить сможет?

Память расходуется на shared_buffers, work_mem и файловый кэш ОС.
Для запуска хватило бы и условных 16 ГБ, но при нагрузке диск захлебнётся. Такой сервак обычно ставят как раз для больших нагрузок - это десятки тысяч пользователей 1С, что после пулинга превращается в сотни активных сессий в PostgreSQL.

Так и для postgres хорошо, когда вся БД в памяти, ну за вычетом всякого редко читаемого.

Требования к RAM для сервера БД зависят от ожидаемого количества данных во всех развертываемых модулях, поскольку вся БД in-memory

Начиная с S/4HANA 2020 можно использовать NSE (будет как классическая CУБД работать через буффер-кэш), если с памятью совсем напряг, но, естественно с некоторым оверхедом

 На практике для стандартного набора модулей (бухучет, управленческий учет, казначейство, закупки и склад, сбыт, производство, техобслуживание и ремонты) от 256 до 512 гигов, для особо тяжелых случаев 1 TB.

Для S/4HANA на 1000 конкурентных юзеров 1TB RAM БД это скорее для особо легких случаев без тяжелого Z-кода (CDS, AMDP), что практически фантастика :)

для особо легких случаев без тяжелого Z-кода (CDS, AMDP), что практически фантастика :)

Ну если разработки пилить на уровне SELECT * FROM ACDOCA то никаких терабайт не хватит ))

А по факту оно примерно так не только лишь всегда через пару/тройку лет от go live :) Это в ECC 6.0 все было в абапе, а в S/4HANA теперь БД-монстры, выжирающие селектом по 500+GB оперативы. И в "стандарте" в том числе.

по 500+GB оперативы. И в "стандарте" в том числе

До 2109 ни с чем таким не сталкивался. В части стандартной поставки, по крайней мере. Может, повезло

В части разработок на проектах всегда был технический архитектор (часто не один) который такие фокусы отслеживал и отстреливал на взлете. Опять же может повезло, и не везде так

через пару/тройку лет от go live :)

Если заказчик после уходе интегратора нанимает студентов за доширак и сажает их пилить разработки, это не проблема инструмента, а проблема как его использовать. Сдуру все что угодно можно сломать.

Вы не обижайтесь, но в коде сап обычно так всегда. Код 1С-ников при всем своем разнообразии и близко не приближается к трешу, который выдают "интеграторы" и просят потом мульярд на железо, чтобы это говно крутить

в коде сап обычно так всегда

Вы лично сколько строк кода на ABAP написали? Или хотя бы прочитали?

Код 1С-ников при всем своем разнообразии и близко не приближается к трешу, который выдают "интеграторы"

Ошибаются все и всегда, особенно когда эффективные менеджеры над душой стоят и погоняют. Но ошибка, допущенная на проекте в условном нефтяном или металлургическом холдинге с тысячами пользователей, становится заметной и известной. А про ошибки, сделанные при автоматизации ларька или дома отдыха железнодорожников, никто и не узнает никогда. Масштабы разные, и цена ошибки не сопоставимая.

просят потом мульярд на железо, чтобы это говно крутить

Вы спецификацию на железо, использованное в тестах, про которые обсуждаемая статья рассказывает, видели? Можете ради интереса сравнить с требованиями к железу для SAP, на таком же объеме данных и количеству пользователей. Я свои оценки выше привел. Потом можем обсудить, где мульярд, а где нет.

Не могли бы Вы подробнее раскрыть, как с одной, пускай и "жирной" виртуалки эмулируется параллельная работа 160 пользователей?
И есть ли разница в нагрузке с такого эмулятора с работой реальных 30K клиентов на разных IP адресах и с реальными скоростями CPU, а не с делёнными между собой тиками vCPU?
Было бы интересно. Спасибо.

Запускаются тонкие клиенты, работают одновременно в одной терминальной сессии.

Тесты по такой методике проводятся уже много лет на проектах ЦКТП (https://v8.1c.ru/tekhnologii/tekhnologii-krupnykh-vnedreniy/tsentry-korporativnoy-tekhnologicheskoy-podderzhki-tsktp/) и показывают хорошие результаты, принципиальной разницы с реальными клиентами нет.

То, что ip адрес один и тот же - значения не имеет: с точки зрения сервера - клиенты разные, т.к. клиенты адресуются по паре ip-адрес + порт, а порты разные; с точки зрения клиента - на тестах упираемся не в производительность стека tcp/ip, и даже не в пропускную способность сети, а в первую очередь в память и cpu.

А что мешало просто сделать master-slave логическую репликацию, на мастер отправлять только транзакции записи, на slave все остальные (естественно проверяя что lsn слейва >= lsn последней транзакции данного пользователя)? Так сделано в lsFusion и так масштабируемость можно увеличить на порядок, а не заниматься экономией на спичках.

Ну и не совсем понятно опять-таки зачем делать многие вещи на уровне PostgreSQL, а не на уровне платформы (тот же кэш временных таблиц, как опять-таки это сделано в lsFusion)? Разве что, если потом собираетесь это в основную ветку PostgreSQL залить, но что-то мне подсказывает, что вряд ли такие коммиты туда пройдут.

А что мешало просто сделать master-slave логическую репликацию

Чтобы не усложнять настройку.

зачем делать многие вещи на уровне PostgreSQL

Чем "ниже" по цепочке клиент-сервер приложений-СУБД делаются оптимизации - тем оптимальнее (извините за тавтологию).
Если можно сделать оптимизацию на финальном уровне трехзвенки - СУБД - лучше сделать её там, а не на уровне сервера приложений или тем более на уровне клиента. На мой взгляд, это очевидно.

если потом собираетесь это в основную ветку PostgreSQL залить, но что-то мне подсказывает, что вряд ли такие коммиты туда пройдут.

У нас своя версия PostgreSQL от 1С. Мы не планируем вливать наши правки в основную ветку PostgreSQL .

Чтобы не усложнять настройку.

Настройку кем? Для администратора вся настройка master-slave кластера СУБД может делаться ровно двумя действиями: a) развернуть еще один instance postgres б) одной кнопкой (в Администрировании) или программно (одним http запросом, если нужно сделать кластер динамическим) добавить слейв с адресом базы postgres (скажем localhost:5425). Дальше всю работу может / должна взять на себя платформа: на master'е создается CREATE PUBLICATION FOR ALL TABLES, на slave'е (также как и на мастере) синхронизируется структура БД, создается CREATE SUBSCRIPTION, после чего после завершения реплик всех таблиц, slave добавляется в кластер (с проверкой lsn при переключении соединений как я писал выше). Грубоватое описание, но суть такая (при обновлении БД все немного сложнее, но это все прозрачно для администратора).

Чем "ниже" по цепочке клиент-сервер приложений-СУБД делаются оптимизации - тем оптимальнее (извините за тавтологию).Если можно сделать оптимизацию на финальном уровне трехзвенки - СУБД - лучше сделать её там, а не на уровне сервера приложений или тем более на уровне клиента. На мой взгляд, это очевидно.

Я почему спросил. Если бы была какая-то универсальная оптимизация PostgreSQL, которая существенно увеличивала бы производительность СУБД (а не экономила на спичках), она бы уже давно была бы в самом PostgreSQL. А если оптимизации platform-specific, то как правило требуют информацию от самой платформы и вы на взаимодействии "назад" потеряете больше. Плюс заставлять администратора устанавливать чужие сборки это мягко говоря неудобно (усложнение настройки как вы говорите) с точки зрения облаков, контейнеров, совместимости с другими инструментами / программами и т.п. (скажем помню недавно общался с кем-то, кто запускал lsFusion на вашей сборке и у него что-то, точно не помню, не заработало, в отличии от ванильной сборки PostgreSQL, и получается что вашу сборку нужно отдельно держать).

Развертывание, настройка под хайлоад и администрирование кластера сложнее, тут даже обсуждать нечего. Другое дело, что в реальности 30К пользователей по-любому будут жить на чем-то более отказоустойчивом, чем один инстанс Postgres c одиночными SSD на каждый чих. Но это совсем отдельная история, и с точки зрения чисто демонстрации пиковой производительности не особо нужная. Хотя статью о том, у кого и на чем 30К клиентов 1С ЕРП крутятся в продакшене, я бы тоже почитал. :)

Ну базовую отказоустойчивость можно обеспечить как раз физической репликой на соседний сервак, с переключением на него при падении основного. А вот с масштабируемостью все сложнее и требует определенные вещи именно от платформы (обновление структур баз, переключение на лету соединений с контролем актуальности слейвов для этого соединения и т.п.)

И да, синтетические тесты это прикольно, а вот на продакшне было бы куда интереснее посмотреть как можно организовать 30к одновременных пользователей без мастер-слэйв репликации.

ЗЫ: Одновременными имеется ввиду полноценные бизнес-пользователи, которые за последние минуту имели хоть какую-то существенную активность.

Тут как бы это сказать? Нюансы. Если делать синхронную репликацию - то она весь выигрыш съест, если асинхронную - то в случае, когда на основании результата выборки данных производится запись - возможны нехорошие варианты.

Опять же, в оффлоад readonly-запросов на slave умеют не только лишь все...

Речь естественно об асинхронной.

когда на основании результата выборки данных производится запись - возможны нехорошие варианты.

Эта ситуация ничем не отличается от ситуации когда между результатом выборки данных и нажатием кнопки "сохранить" проходит какое-то время.

Единственная разница это когда ты прочитал данные на мастере или более актуальном слейве, потом ушел на менее актуальный (но все еще допустимый слейв в соответствии с последним lsn для своего "требования актуальности") и там этих данных еще нет (получаются такие "мигающие" данные). Но опять-таки эта ситуация не сильно отличается от ситуации когда ты считал данные, а их параллельно удалили (изменили), а потом добавили назад. И с этим всем борятся при помощи уровней изоляции (то есть repeatable read / serializable, update conflict и вот это все).

Опять же, в оффлоад readonly-запросов на slave умеют не только лишь все...

Ну это да, но как раз платформы бизнес-приложений, где часто работает принцип "семь раз отмерь - один отрежь", должны по любому уметь это из коробки. Я поэтому и удивился, зачем такие танцы с бубнами, если можно просто master-slave настроить и не париться.

Эта ситуация ничем не отличается от ситуации когда между результатом выборки данных и нажатием кнопки "сохранить" проходит какое-то время.

не-не. В норме ты выборку + последующую запись в одну транзакцию упаковал и все у тебя норм - а с оффлоадом их две, стейт не консистентный и что там в итоге вышло - Ктулху Фтагн

Не совсем понял. Так транзакции записи естественно только на мастере делаются. Но это именно что "кнопка Сохранить". До нажатия этой кнопки вы же не будете упаковывать все в одну транзакцию (так как транзакции не кошерно держать открытыми на время любого внешнего взаимодействия, что с кластеризацией, что без, по сотне причин), а значит опять-таки что с кластеризацией, что без это нужно учитывать (и для этого есть уровни изоляции, update conflict'ы и все такое)

Условно - увеличиваем количество позиций товара на 2 шт - делаем запрос на чтение того, что есть - RO запрос, идет на слейв, увеличиваем-записываем, ой - а слейв отстал! Что оказалось в базе?

Вы в одной транзакции это делаете? Если в одной то транзакция идет на мастер и все ок. Если не в одной, то между чтением и записью у вас может кто-то вклиниться и изменить количество и в итоге в базе будет абы что (поэтому в таких случаях все делают в одной транзакции с repeatable read и ловлей update conflict -> перестартом транзакции).

"не-не. В норме ты выборку + последующую запись в одну транзакцию упаковал и все у тебя норм - а с оффлоадом их две, стейт не консистентный и что там в итоге вышло - Ктулху Фтагн"(C)

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

По личному опыту - вынос аналитики на слейв "да", разнесение обычных запросов на ro реплику - неа. Не стоит того.

Почему именно логическую?

Физическая временные таблицы не поддерживает. А без них в бизнес-приложениях со сложной логикой (и не только) очень тяжело.

Тестирование в попугаях это конечно же хорошо, но это сферический конь в вакууме. Важно же проверять разные типы нагрузки. Одно дело, когда создается 100 документов в минуту, а остальные 30К только читают. А другое - когда все 30К активно что-то пишут. А самые чудеса начнутся, когда пользователи будут править одно и то же и попадать в UPDATE CONFLICT. И вот тут самое интересное, как все себя поведет.

30 000 одновременно активных пользователей

Время работы теста: 10 часов

Количество выполненных операций: 885 000

А можете уточнить - это как ? Каждый "пользователь" выполнил всего 30 операций за 10 часов ? Это какие-то ленивые пользователи ? Или что подразумевается под операцией ?
Сколько они документов провели ? Там у Вас 9 млн документов - это было до начала теста, или создалось за весь тест ?

Далее требования были усреднены до средней крупной компании со смещением в сторону более крупных. Получилась база размером около 1 Терабайта.

28 000 000 договоров
22 000 000 движений себестоимости
20 000 000 бух. проводок
2 500 000 контрагентов
1 000 000 основных средств
700 000 сотрудников
25 000 пользователей
1 800 подразделений
56 организаций (с единой головной организацией)

Странные у Вас представления о "средней крупной компании". Для сравнения у нас в lsFusion ERP есть сейчас клиенты (с 2К одновременно работающих реальных, а не "виртуальных" пользователей) вот с таким количеством записей в таблицах (и там только документов приобретение товаров и услуг - где-то 15 млн):

Наверное, в терминологии 1С - это будут "гигантские" компании. А там все работает даже без необходимости кластеризации (ресурсов хватает еще с запасом, а сервера - как в Вашем случае сервер БД). При этом там ванильный PostgreSQL без всех вышеописанных оптимизаций (типа вынеса временных таблицы из системных каталогов и т.д.).
Да, там функционал менее "широкий" чем в 1C:ERP, но непосредственно операции проведения приходов тоже обновляют очень большое количество разных таблиц, специфических для розницы, которых нет в конфигурации той же 1C:ERP.

Тестирование в попугаях это конечно же хорошо

Мы тестируем не в попугаях, а в Apdex, Apdex – стандарт индустрии.

Важно же проверять разные типы нагрузки.

В ходе тестов мы использовали наиболее типичные для предприятий сценарии, реализующие разные типы нагрузки.

30 000 одновременно активных пользователей

Время работы теста: 10 часов

Количество выполненных операций: 885 000

 

А можете уточнить - это как ? Каждый "пользователь" выполнил всего 30 операций за 10 часов ? Это какие-то ленивые пользователи ? Или что подразумевается под операцией ?

Мы исходили из требуемого количества введенных данных за время теста, а не из того, сколько операций должен выполнить каждый пользователь.

В реальной жизни, существенная часть пользователей, выполняет небольшое число операций в день (открыть отчет, посмотреть).

Другие вводят много документов.

Мы взяли текущие данные по количеству объектов (документов\справочников\...) в базе и посчитали, сколько их должно быть введено за 1 день.

Примерно прикинули сколько отчетов\обработок запускают пользователи за день. Получились такие числа.

Тест не жестко фиксированный, в нем можно менять интенсивность работы пользователей. Если хотите сделать более интенсивным - пожалуйста. Ссылка на базу теста доступна тем, кто купил 1С:ERP.

Сколько они документов провели ? Там у Вас 9 млн документов - это было до начала теста, или создалось за весь тест ?

9 млн документов – до начала теста.

Проведено документов за тест 136 000

Для сравнения у нас в lsFusion ERP есть сейчас клиенты (с 2К одновременно работающих реальных, а не "виртуальных" пользователей) вот с таким количеством записей в таблицах (и там только документов приобретение товаров и услуг - где-то 15 млн)

Коллеги, мы очень рады, что у вашего продукта хорошая производительность на больших объемах.
Приходите конкурировать!
Будем улучшать наши продукты в ходе конкуренции.

Я к тому, что утверждение по 30К одновременных пользователей - это манипуляция. Да, я понимаю, что могут быть разные пользователи. Есть такие, кто будет к компьютеру подходить раз за день. В Вашем тесте получается, что пользователь в течение рабочего дня делает какое-то действие раз в 20 минут.

Но в жизни обычно под пользователем подразумевают все-таки человека, у которого постоянная работа в программе так или иначе занимает большинство рабочего дня. И он делает значительно больше, чем 3 "операции" в час.

Честнее было бы считать все-таки только таких пользователей, которые более менее постоянно работают в программе, и апроксимировать исходя из их статистики. И либо сократить количество пользователей, либо увеличить нагрузку. Иначе, это немного введение в заблуждение.

Эммм... если что - то заказчик примерно так это и считает. Количество пользователей == количество активных УЗ в системе, затраты разносятся пропорционально, в результате в KPI СМ'а торчит аудит этих УЗ и "лишнего" там не то, чтобы много.

Так, чтобы кто-то из заказчиков выполнял профилирование пользователей и\или опирался на это профилирование при составлении ТЗ - ну... околонаучная фантастика. Реально у тебя будет выкопировка из того же APDEX в разделе "требования к эрогономике и технической эстетике" ну и вот "количество одновременно работающих пользователей", шт. Причем что это за "пользователь" такой - зооказчег тебе не скажет, "хоть дерись".

Я бы сказал - что проведенный тест вполне релевантен условиям задачи, как я их понимаю.

Оптимизация "размер пула временных таблиц" относится к платформе 1С, а не к PG

А потом возникает процедура закрытия периода и оказывается, что за выполнения этой процедуры для этих миллионов/миллиардов документов требуется x10 ресурсов, но это же другая история. Правда?

  1. Указанные оптимизации PostgreSQL были сделаны только для теста или это серийно поставляемый с 1С:ERP билд?

  2. Цитата: "В качестве опорной точки в Apdex выступает целевое (желаемое) время выполнения ключевых операций (это время назначается экспертным путём)" - можно ли уточнить: что ещё за "экспертный путь" такой и как это соотносится с реальными скоростями выполнения самых распространенных задач (проведение документов, создание отчётов)? Потому что, скажем, я понимаю, что количество запросов на одну пользовательскую задачу может быть достаточно большим, но вот конкретным пользователям "надо чтобы проводилось быстро", а не чтобы "среднее время ответа Postgres на запрос достигало целевых значений". Если этих запросов на проведение одного малюсенького документа - миллиард - то как будто бы все равно на взгляд обычного пользователя работать будет не быстро.

  3. Если спецификой работы 1С является создание большого количества временных таблиц (а именно эта особенность, как я понял, потребовала внесения части правок), то может имеет смысл рассмотреть возможность работы со временными таблицами в оперативной памяти сервера 1С? Без использования сетевого взаимодействия с сервером Postgres для этих временных таблиц.

  4. Планируется ли выкладывать где-то отдельно от 1С:ERP этот доработанный билд PostgreSQL? Как он лицензируется?

1 Все оптимизации включены в серийный дистрибутив PostgreSQL с патчем от 1С.

3 Все временные таблицы участвуют в других SQL запросах, поэтому вынося их на уровень платформы придётся их каждый раз их передавать к СУБД, что лишь ухудшит ситуацию.

4 Билд и исходный можно скачать всем у кого есть доступ к ИТС. Лицензируется по той же лицензии что и оригинальные исходные коды.

2.Цитата: "В качестве опорной точки в Apdex выступает целевое (желаемое) время выполнения ключевых операций (это время назначается экспертным путём)" - можно ли уточнить: что ещё за "экспертный путь" такой и как это соотносится с реальными скоростями выполнения самых распространенных задач (проведение документов, создание отчётов)?


Могу ответить так
Если у вас есть доступ к 1С.ИТС - то есть статья от 1С более подробная.

Очень круто. Я ушел из 1с 8 лет назад, тогда я считал, что цифры, подобные вашим - фантастика. Но вот по номенклатуре и документам - мне кажется маловато для конторы с 30к юзеров.

А объясните пожалуйста дураку как так получается. 1С c postgre работает уже лет 15. Лет 10 как нас гонят пинками на него. Все это время все понимают что половина затыков - из-за отсутствия в PG аналогов временных таблиц MS SQL. У 1С с деньгами проблем нет. Майнтейнеры PG активно зарабатывают в РФ на импортозамещении и продаже корп версий PG по цене Оракла.

И НИ-ЧЕ-ГО.

Максимум вот такие статьи из которых понятно что за 15 лет проблема никуда не делась, а решать ее предлагается ручной правкой кода PG. Ну или приглашением выскоополачиваемых спецов из тех же 1C и Postgres Professional , которые под вас PG пропатчать.

В чем проблема то кроме жадности -то ?

"Осталось апстрим уговорить", ага.

Но если что - в последнюю пару-тройку лет тесты показывают, что на postgresql (Наконец-то!) 1с стала работать быстрее, чем на mssql. "В среднем", конечно же - по тому же apdex'у.

Ну т.е. типа опять происки "злобного запада", "англичанка гадит", "пиндосы проклятые". 15 лет ведущие разработчики PG и 1С не могли протолкнуть в апстрим.. что? Я может пропустил, но я не видел никаких потуг даже. Так раз в пару месяцев статьи на тему "что мы тут в коде поправили чутька". Зато чуть реально не упал со стула когда мне Postgres Professional КП прислал на 16 ядер.

в последнюю пару-тройку лет тесты показывают, что на postgresql (Наконец-то!) 1с стала работать быстрее, чем на mssql. "В среднем", конечно же - по тому же apdex'у.

Но статьи на тему как мы переписали кучу запросов и упоролись в конфигах чтобы оно нормально заработало почему -то с habr и инфостарта не пропадают.

Но статьи на тему как мы переписали кучу запросов и упоролись в конфигах чтобы оно нормально заработало почему -то с habr и инфостарта не пропадают.

Ну потому что ни postgresql, ни 1С почему-то так и не освоили такую базовую оптимизацию как predicate push down в обычные GROUP, не говоря уже о predicate push down в рекурсивные запросы, с window функциями, адаптивную материализацию подзапросов и т.п. (в отличии от MSSQL или lsFusion)

https://habr.com/ru/companies/lsfusion/articles/468415/#opt

https://habr.com/ru/companies/softpoint/articles/914956/

И переложили все на разработчика. И если в типовых это можно решить руками (точнее деньгами), то что делать при доработках под конкретного заказчика - решительно непонянтно. Вот поэтому и столько статей про "мы переписали кучу запросов и упоролись в конфигах".

Прикольно. А в общем случае поддерживается (как в lsFusion), то есть скажем с оконными и рекурсивными CTE и группировкой проталкиваемых предикатов (а не латералами по сути), или в частном случае как в MSSQL?

https://habr.com/ru/companies/lsfusion/articles/463095/#jppd

Ну и я так понимаю у вас коммерческая закрытая лицензия, то есть по сути те же яйца (MS SQL и Oracle), но в профиль.

У нас реализация нацелена на использование в 1С, поэтому оконные и рекурсивные CTE мы не рассмтривали, а вот с lateral планируем далее реализовать, т.к. в 1С будет эффект.
И да, спасибо за указанную статью, она была, можно сказать, вдохновением для реализации JPPD в нашей СУБД :)

А вы rule-based (как грубо говоря в СКД в частном случае сделано, то есть перед выполнением плана, пытаетесь первым шагом добавить проталкивания предикатов) или cost-based оптимизацию (то есть грубо говоря к общему множеству планов, добавляете еще планы с проталкиванием предикатов и потом выбираете наилучший) делали?

Ну и почему по вашему мнению сам PostgreSQL этого до сих пор не сделал? Это же вроде очевидная и напрашиваемая оптимизация. Я просто думал, что с их немножко лапшеобразным С кодом (без ООП) это архитектурно тяжеловато сделать в общем случае. Но раз у вас получилось, у основных мейнтейнеров по идее это тоже не должно было быть нерешаемой задачей.

В версии 1 это  rule-based, а в версии 2 будет уже cost-based.
В самом Postgresql реализован простейший PPD - https://infostart.ru/1c/articles/2142833/#Predicate pushdown в Postgres
При этом по исходному коду там много ограничений его применения. Я думаю, что просто нет ставки на улучшение планировщика для аналитических запросов, и каждая такая доработка действительно очень сложна в реализации.
При этом по коммерческим СУБД есть описание в патентах или научных статьях как реализована та или иная фича. Вот пример еще одной фичи, которая в 1С встречается, и мы ее себе "портировали", но пока не выпустили - https://nenadnoveljic.com/blog/disjunctive-subquery-optimization/

В версии 1 это  rule-based, а в версии 2 будет уже cost-based.

Если честно не совсем понимаю как его эффективно сделать rule-based. Потому как может несколько предикатов проталкиваться то есть A соединяется с B, а отбор уже по B, и надо понимать соединение A с B идет по индексу или нет. Собственно помню изначально в lsFusion тоже была попытка сделать rule-based, но быстро стало понятно, что при шаге влево / шаге вправо просто оптимизатор будет ошибаться. Да и оказалось что cost-based получился проще и красивее.

В самом Postgresql реализован простейший PPD - https://infostart.ru/1c/articles/2142833/#Predicate pushdown в PostgresПри этом по исходному коду там много ограничений его применения.

Речь естественно о JPPD шла, так как PPD это совсем частный случай.

Я думаю, что просто нет ставки на улучшение планировщика для аналитических запросов, и каждая такая доработка действительно очень сложна в реализации.

А по вашему JPPD это только для аналитических запросов? JPPD в OLTP встречается ничуть не меньше, собственно и мы и вы на это часто указываете.

И перекладывать эту оптимизацию на разработчика это мягко говоря очень опасно.

Вот пример еще одной фичи, которая в 1С встречается, и мы ее себе "портировали", но пока не выпустили - https://nenadnoveljic.com/blog/disjunctive-subquery-optimization/

Ну это выглядит тоже как частный случай:

https://habr.com/ru/companies/lsfusion/articles/463095/#joinwhere

https://habr.com/ru/companies/lsfusion/articles/463095/#oropt

В общем случае логично преобразовывать все типы JOIN и UNION к булевой логике (или изначально иметь все в ней как lsFusion), потом строить ДНФ и группировать вместе условия, если сгруппированное условие имеет такую же стоимость плана выполнения.

У вас на уровне приложения (isFusion) считается стоимость выполнения и выбирается оптимальный план?

Можно сказать что да. На самом деле стоимость выполнения (как и прогнозируемое количество записей) нужна еще в огромном числе мест самой платформе (кроме непосредственно кривового оптимизатора самих СУБД). Например можно ли материализовать инкрементальные изменения (инкрементальность - ключ для реализации ограничений, событий, материализованных представлений и т.п.), можно ли материализовать подзапросы (при ошибке оптимизатора в оценке статистики), да собственно можно ли подключать пользователю динамический выпадающий список (или cost будет слишком большой).

Но cost (как и оценка количества записей) скорее алгоритмический, он оценивает "порядок" (степень заданного основания, то есть по сути сложность алгоритма), а не строит точный план (хотя при этом порядок join'ов тоже строится и даже где-то используется, что важно например из-за join_collapse_limit 8 в postgres). По сути при построении платформа оперирует чисто индексами и статистиками таблиц / полей и старается быть более пессимистичной чем слишком оптимистичные (по опыту) СУБД (для этого правда приходится даже собирать допстатистику которой нет в СУБД, скажем distinct считать только на топ 80 процентах и т.п.)

Ну т.е. типа опять происки "злобного запада", "англичанка гадит", "пиндосы проклятые". 

Та ни, это вот - ваши персональные проЭкции. А тут - opensource, в котором НИКТО НИКОМУ НИЧЕГО НЕ ДОЛЖЕН(ТМ)

Вот пошто в ванильке нет 64х битного счетчика транзаций, который нужен ВОТ ВООБЩЕ ВО ВСЕХ крупных инсталляциях? Набор патчей - есть. Реализация (На основе этого же патчсета, ага) во всех коммерческих дистрибутивах - есть. А в апстриме - не-а, нету. Тоже 1С должен, небось?

А пошто 1с все еще свою сборку postgresql таскает, а не "влил в апстрим"? А апстриму - внезапно - на проблемы одноэсенных положить. У них свой "проджект вижн" и делать из слоника мысыкуель они - н-ннегодяи! не хотят. Даже вот за деньги и чужими руками.

Вам надо - вы в своем приложении и. Вот 1С и. На удивление даже - небезуспешно.

Хм.. вообще это сарказм был. Но без тега видимо уже никто не догадается. Вопрос этот наверное в первую очередь к сотрудникам 1С и PG типа Проф. Но им очевидно и так хорошо. Заодно можно и стомиллионную статью написать на тему как мы (В 1С или PGProf) в 100500 раз "оптимизировали" работу наших о..ных систем.

Вот тут я тестил производительность Postgres как предчувствие. Вычисляем процент импортозамещения в режиме Highload от 1С / Хабр на реальной операции 1С. Краткий вывод - Postgres даже быстрее MS SQL но ценой более высокой загрузки проца, что в конечном итоге делает узким местом сервер СУБД.

Причем Postgres c пакетами для 1C обычная сборка которую можно скачать.

Так что проблемность Postgres преувеличена

из-за отсутствия в PG аналогов временных таблиц MS SQL

В PG есть временные таблицы, платформа 1С работает также кроме нюанса с использованием механизма копий баз данных, когда на реплике нельзя создавать временные таблицы, но это решаемо.

Я так понимаю изменен и код релиза платформы. Какой релиз платформы использовался? Я просто вижу что при записи в регистры analyze и fasttruncate по Временным! таблицам занимает большое время.

И еще вопрос - сколько движений в регистры породили эти 885000 операций? Замечание Crash by про ленивых пользователей справедливо

Какой релиз платформы использовался?

Тест проводился на платформах 8.5.2 и на специальной сборке платформы 8.3.27. Все изменения, сделанные в платформе, войдут в релиз 8.5.2.

сколько движений в регистры породили эти 885000 операций?

Не замеряли.

Статья на официальном сайте датирована февралём 2025 года. Что-то с тех пор принципиально поменялось, почему на Хабре материал был опубликован в июле 2025 года?

Релизы СУБД и платформы 1С с анонсированными изменениями были опубликованы с тех пор в общий доступ?

Статья на официальном сайте датирована февралём 2025 года. Что-то с тех пор принципиально поменялось, почему на Хабре материал был опубликован в июле 2025 года?

Потребовалось время для подготовки статьи и для принятия принципиального решения - какие именно детали будем публиковать "наружу".
Пресс-релиз о результатах - это одно, статья на Хабре - совсем другое)

Релизы СУБД и платформы 1С с анонсированными изменениями были опубликованы с тех пор в общий доступ?

Пока нет, об этом напишем дополнительно.

У меня вопрос , а почему для СУБД выбрали такой странный arm сервер Ampere Altra Max M96−28 2800 MHz 96 cores ? Я понимаю что для 1С сервер СУБД немаштабируем, но вроде бы можно обойтись и х86 архитектурой

Как показали исследования, СУБД не имеет особого выигрыша от "мощной" CISC архитектуры x86. Простая RISC выигрывала за счёт большего количества ядер в процессоре.

Не совсем понял как большое количество ядер RISCа поможет в OLTP транзакциях сложных бизнес-приложений, где транзакции однопоточные по определению, параллелизма там практически нет, и как правило идет много достаточно сложных запросов (которые как раз быстрее будут в CISC архитектуре выполнятся). То есть гипотетически RISC может выиграть в плане лучшей масштабируемости (в смысле как вы правильно сказали большего количества ядер), но проиграет во времени отклика (что также важно). То есть оптимальный вариант это как раз CISC (время отклика) в master slave (масштабируемость) по идее.

С точки зрения архитектуры, теоретически, RISC будет лучше. В СУБД все операции на OLTP не содержат сложных конструкций, поэтому выигрыша от сложных CISC инструкций нет, их попросту негде применять. Плюс у RISC лучше энергопотребление, что позволит работать на бОльшей частоте.

На практике имея то что производят, конечно, мощный EPYC уделает этот процессор (возможно даже в разы) на однопоточных нагрузках. А вот при масштабировании ARM выигрывает с ещё большим отрывом.

Поэтому для 30к обычных пользователей мы выбрали ARM.
Но да, для 16 "одарённых" пользователей мы однозначно бы остались на x86.

С точки зрения архитектуры, теоретически, RISC будет лучше. В СУБД все операции на OLTP не содержат сложных конструкций, поэтому выигрыша от сложных CISC инструкций нет, их попросту негде применять. Плюс у RISC лучше энергопотребление, что позволит работать на бОльшей частоте.

Что значит не содержат сложных инструкций? Небольшой SELECT с нескольким количеством JOIN'ов и парой выражений уже вполне сложная конструкция. Как и работа с временными таблицами. И как вообще в принципе любая SQL команда с учетом того что СУБД делает для обработки. И это отлично видно на практике.

Собственно вы же сами это пишите: "На практике имея то что производят, конечно, мощный EPYC уделает этот процессор (возможно даже в разы) на однопоточных нагрузках."

А вот при масштабировании ARM выигрывает с ещё большим отрывом.

Поэтому для 30к обычных пользователей мы выбрали ARM.
Но да, для 16 "одарённых" пользователей мы однозначно бы остались на x86.

Так я поэтому и писал, что логичнее масштабирование делать не за счет выбора ARM (так как вы тем самым жертвуете временем отклика), а за счет master-slave репликации.

Что значит не содержат сложных инструкций? Небольшой SELECT с нескольким количеством JOIN'ов и парой выражений уже вполне сложная конструкция. 

Конечно, сама по себе операция SELECT невероятно сложна. Но ядро СУБД, выполняя операцию SELECT, оперирует машинными инструкциями x64. При компиляции исходного кода в машинные инструкции "мощные CISC" инструкции практически не используются. Большинство имеют полный аналог в ARM и реализуются одной-двумя RISC инструкциями.

так как вы тем самым жертвуете временем отклика

Верно, время отклика при небольшой нагрузке будет больше. Однако, уже при средней нагрузке ситуация обратная - на ARM время отклика возрастает несильно, а вот на x64 сильно и быстро превосходит таковое у ARM.

Конечно, сама по себе операция SELECT невероятно сложна. Но ядро СУБД, выполняя операцию SELECT, оперирует машинными инструкциями x64. При компиляции исходного кода в машинные инструкции "мощные CISC" инструкции практически не используются. Большинство имеют полный аналог в ARM и реализуются одной-двумя RISC инструкциями.

Честно говоря очень спорное утверждение (кроме непосредственно мощных CISC инструкции, которые вполне даже используется, есть еще более сложная адресация, SIMD-инструкциям, продвинутая out-of-order архитектура, больше кеша и более оптимизированная работа с памятью и еще туча чего еще).

Но мы о разных вещах спорим. Я же не спорю, что если у вас 100 ядер на одном сервере то ARM может выиграть. Но это все вчистую проиграет по времени отклика 5 условным Xeon'ам по 20 ядер в master-slave (или скорее 30 ядрам на мастере и поменьше ядер, но выше частоте на slave'ах).

Мы проверили это и обнаружили, что такая оптимизация неплохо улучшает производительность. Мы получили на наших тестах прирост производительности от 5% до 10%.

Очень жаль, что для такой просто оптимизации, которую нужно было сделать еще лет 20 назад, придется ждать аж 8.5.2 и потом еще годик на исправление багов этой платформы...

А вообще выбор тестовой базы и тестового сервера SQL странный. 20 млн проводок на 2.5 млн клиентов - вы серьезно? 8 проводок на клиента хватит? Ориентируемся на OLTP - значит при вводе заказа ни сложного ценообразования, ни проверки резервов, остатков, взаиморасчетов? Именно за легкость реализации бизнес-логики ценится 1С, в итоге той логики на любой элемент процесса огого сколько пилится...

PS вижу в изменениях платформы 8.3.27 есть "Оптимизирована очистка временных таблиц в MS SQL Server в условиях высокой нагрузки" - это оно?

Если "в MS SQL Server" - то очевидно не оно.

Да нет, все таки оно, я тут удалил сначала пустую ВТ, потом с данными

Спасибо за оптимизацию

Я про то, что в статье - про PostgreSQL.
А изменение "Оптимизирована очистка временных таблиц в MS SQL Server в условиях высокой нагрузки" - оно про MS SQL Server.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий