Pull to refresh

Comments 24

Получается, имхо, что одна база - один инстанс.

Да, лучше использовать такой подход

Тогда было бы здорово, если бы Вы написали как расчитывать вышеуказанные настройки postgresql при наличии нескольких инстансов на одной машине.

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

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

Если по ВМ не разделять, то базу можно сделать одну, а внутри разделение по схеме делать. Но это уже сложности со стороны 1с

И как вы 1с к этому подключите? И как бекапить будете каждую базу отдельно?

В состояние гонки дисковую подсистему воркеры не введут, если инстансы на разные диски положить.

UFO just landed and posted this here

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

При этом я не знаю как дела обстоят с постгресом. Но по крайней мере, postgres pro входит в реестр российского ПО.

У open source проектов нет "прописки". По отношению к такому софту важно чтобы былы "отечественные" разработчики которые в состоянии эту разработку поддерживать. Вот разработчики готовые поддерживать PostgreSQL в России есть."Импортозамещение" ведь нужно не для того чтобы просто "не платить за буго", а главное чтобы быть независимыми от этого "забугра".

Ерунда всё это. Вы не упоминаете о таких запросах как расчёт себестоимости, закрытия месяца. В компаниях с большим количеством движений, номенклатуры на в усмерть затюнингованном погреce подобные операции могут выполняться сутками. На том же железе просто установленый MS SQL выполнит эти операции за 16 часов. Всё дело в параллелизме исполнения запросов. В MS SQL он работает по умолчанию, а в postgres SQL заставить выполняться на нескольких ядрах запрос из расчёта себестоимости мне так и не удалось. Представьте себе запрос выполняющий 40 с лишним часов на одном ядре сервера! В MS SQL этот запрос будет выполняться на всех доступных ядрах при настройках по умолчанию. Описание подобных ситуаций я неоднократно находил на разных ресурсах.

Программисты утверждают что стандартный код 1С по расчёту себестоимости они не меняли. Да и глупо лезть в столь сложную процедуру. Остаётся только купить MS SQL.

Представьте себе запрос выполняющий 40 с лишним часов на одном ядре сервера

max_worker_processes
max_parallel_workers
max_parallel_workers_per_gather
https://postgrespro.ru/docs/postgresql/14/runtime-config-resource#GUC-MAX-PARALLEL-WORKERS


ну и explain стоит смотреть (если это действительно один большой запрос)

max_worker_processes = 12
max_parallel_workers = 12
max_parallel_workers_per_gather = 6 (пробовал 0, без разницы)

Эксплейн смотрю сейчас.

рекомендую, кстати
https://explain.tensor.ru/


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

Да, я читал. Но я не ДБА, мне это не особо нужно. А в код расчета себестоимости 1с лезть - у программистов лапки. Со своей стороны я могу только миграцию на МС СКУЛь предложить.

Боюсь соврать, но, насколько я помню, Postgres Pro включает в себя патч который сильно ускоряет производительность временных таблиц, и фикса этого в "основном" Postgres нету.

PG Pro вообще сильно тюнингован под 1С относительно ванильного Postgres. Запросы которые клали ванильный сервер насмерть, но работали в MS SQL - на Pro версии работают примерно с той же скоростью, что MS SQL. Но Pro и стоит не сказать, что дешевле MS.

Ах да. Всё же основной вопрос при миграции баз данных 1С на postgresql сегодня, как и 10 лет назад когда я впервые это делал, "почему всё так тормозит?"

Как видно из результатов, PostgreSQL проигрывает в работе с временными таблицами, однако показывает лучшую производительность при работе с объектами, что суммарно дает одинаковую производительность с 1С.


Нет, не видно. Видно невероятное различие во временных таблицах и по 10% в остальных пунктах. А при увеличении числа потоков различие во временных таблицах растет (!!!), а различие по остальным пунктам уменьшается. Как у вас одно уравновешивает другое?
Во время выгрузки база должна быть открыта в монопольном режиме.


НО! Эти ограничения можно обойти при помощи штатной консольной утилиты ibcmd


И лучше бы писать «нельзя», имхо. Можно нахватать грязного чтения и массу несогласованных данных (ведь сервер приложений управляет блокировками, если вы залезаете в СУБД в обход него — то читаете данные, не взирая на блокировки). Кто потом будет заниматься поиском такого среди миллионов объектов?
Убираем перевыделение памяти по умолчанию: в значении vm.overcommit_memory=0 происходит эвристический анализ для определения выделяемой процессу памяти. Это дополнительная трата ресурсов

нет, потребление ресурсов на этот эвристический анализ вы никак не заметите


а острая нехватка памяти и большая конкуренция запустит процесс OOM Killer, при этом вы получите сообщения: “Out of Memory: Killed process 12345 (postgres)”.

ровно то же самое будет и в предлагаемом вами варианте.
всё отличие overcommit_memory=0: вместо вас значением overcommit_ratio управляют разработчики ядра.


чудес не бывает, не хотите видеть падения приложений по недостатку памяти — выделяйте достаточно оперативной памяти/свопа и всё.


Стоит разносить WAL и файлы базы на отдельные дисковые группы, если они на SSD?

рекомендации о разнесении времён hdd; для ssd никакого смысла в таком разнесении нет.

Тут стараемся не полностью от OOM Killera избавится, а снизить вероятность, что он "убъёт" наш процесс PostgreSQL.
Чудес действительно не бывает: реалии таковы, что на одной машинке с постгресом ради экономии может крутиться много постороннего ПО - какой-нибудь pgadmin4, да и у 1C:предприятия есть своя версия для linux.
По SSD:
Во-первых: 2TB SSD в 3х экзеплярах для самого простого кластера patroni с потоковой репликацией - иногда выходит дороговато. HDD, увы, пока ещё производятся и дёшевы.
Во-вторых: это касается только крайне высоконагруженных систем или крайне неоптимизированных запросов. Но всё же, упереться в конкуренцию на запись или пропускные возможности контроллера - возможно.

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

снизить вероятность, что он "убъёт" наш процесс PostgreSQL

для этого достаточно прописать в unit-файле потсгреса


[Service]
OOMScoreAdjust=-1000
Sign up to leave a comment.