|
Совпадение порядка вызова с порядком исполнения на MSSQL.
|
|||
---|---|---|---|
#18+
Меня интересует вопрос по проведению следующего эксперимента(сейчас его возможности провести нет). Есть 1000-а потоков, соединений с MSSQL. Эти соединения открыты на самом SQL сервере. На каждом из них готова уже конструкция и ждет команды execute. В управляющем потоке разыгрывается случайным образом очередь вызова, от 1 до 1000. Эта очередь записывается в лог(ЛогОчереди). Затем управляющий поток запускает все потоки на исполнение, предварительно запустив профайлер(трассы, расширенные события). Интересует в каких случаях очередь из лога будет расходиться с очередью вызова в профайлере, как часто это будет происходить? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2020, 17:44 |
|
Совпадение порядка вызова с порядком исполнения на MSSQL.
|
|||
---|---|---|---|
#18+
МуМу Затем управляющий поток запускает все потоки на исполнение, предварительно запустив профайлер(трассы, расширенные события) МуМу Интересует в каких случаях очередь из лога будет расходиться с очередью вызова в профайлере, как часто это будет происходить? Очевидно, это будет зависеть от времени между запуском команд. Например, управляющий поток запускает команды последовательно по одной в час. Или, управляющий поток запускает команды последовательно по одной в такт процессора. (а 1000 потоков работают на 1000 ядрах) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2020, 18:36 |
|
Совпадение порядка вызова с порядком исполнения на MSSQL.
|
|||
---|---|---|---|
#18+
МуМу, С чего бы она расходилась? А вот выполнения потоков могут расходиться с очередностью их постановки. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2020, 10:46 |
|
Совпадение порядка вызова с порядком исполнения на MSSQL.
|
|||
---|---|---|---|
#18+
Владислав Колосов С чего бы она расходилась? А вот выполнения потоков могут расходиться с очередностью их постановки. В сиквеле есть некоторое количество потоков исполнения, и оно не равно количеству коннектов. Соответственно, эти потоки будут "разбирать" в свои очереди проступающие в коннектах команды, а потом их последовательно исполнять (параллельно с остальными потоками). Значит, если интенсивность запуска команд настолько высока, что очереди на исполнение у потоков непустые, порядок исполнения команд не будет соответствовать порядку запуска исполнения в коннектах. Но заранее рассчитать это, вывести "формулу", как я представляю, невозможно. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2020, 11:48 |
|
Совпадение порядка вызова с порядком исполнения на MSSQL.
|
|||
---|---|---|---|
#18+
alexeyvg Владислав Колосов С чего бы она расходилась? А вот выполнения потоков могут расходиться с очередностью их постановки. В сиквеле есть некоторое количество потоков исполнения, и оно не равно количеству коннектов. Соответственно, эти потоки будут "разбирать" в свои очереди проступающие в коннектах команды, а потом их последовательно исполнять (параллельно с остальными потоками). Значит, если интенсивность запуска команд настолько высока, что очереди на исполнение у потоков непустые, порядок исполнения команд не будет соответствовать порядку запуска исполнения в коннектах. Но заранее рассчитать это, вывести "формулу", как я представляю, невозможно. На сервере могут быть ещё пулы ресурсов, которые могут оказывать влияние на возникающую последовательность. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2020, 12:08 |
|
Совпадение порядка вызова с порядком исполнения на MSSQL.
|
|||
---|---|---|---|
#18+
Я знаком поверхностно с работой Win, по-моему работа по переключения задач определяется системой, которая при равных приоритетах потоков вносит элемент случайного выбора, если не хватает ядер. Но вот стартовать обработка врят ли может в порядке, отличном от порядка поступления запросов. Сомневаюсь, что SQL сервер откладывает начало обработки подключения. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2020, 13:39 |
|
Совпадение порядка вызова с порядком исполнения на MSSQL.
|
|||
---|---|---|---|
#18+
Владислав Колосов, У SQL Server свой собственный, cooperative scheduler, в отличие от виндового, который preemptive. Там другая логика, например если поток получает квант процессора, но работать не готов потому что ждет чего-то еще, то он сразу отдает CPU. Винду такие вещи не волнуют, насколько я помню, она поровну все делит. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2020, 14:31 |
|
Совпадение порядка вызова с порядком исполнения на MSSQL.
|
|||
---|---|---|---|
#18+
Ennor Tiegael У SQL Server свой собственный, cooperative scheduler, в отличие от виндового, который preemptive. Там другая логика, например если поток получает квант процессора, но работать не готов потому что ждет чего-то еще, то он сразу отдает CPU. Винду такие вещи не волнуют, насколько я помню, она поровну все делит. По сабжу - в сложных мультипоточных системах говорить о каком-то порядке выполнения чего-то в разных потоках без какой-либо синхронизации, направленной на обеспечение порядка выполнения, смысла не имеет. Если кажется, что вот же он, порядок имеется, то, во-первых, или где-то происходит неявная синхронизация (на io, например), а, во-вторых, в других условиях этот порядок запросто может стать другим. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2020, 14:42 |
|
Совпадение порядка вызова с порядком исполнения на MSSQL.
|
|||
---|---|---|---|
#18+
a_voronin На сервере могут быть ещё пулы ресурсов, которые могут оказывать влияние на возникающую последовательность. Владислав Колосов по-моему работа по переключения задач определяется системой, которая при равных приоритетах потоков вносит элемент случайного выбора, если не хватает ядер. Ennor Tiegael Винду такие вещи не волнуют, насколько я помню, она поровну все делит. Т.е., концептуально, вытесняющая многозадачность Windows превращается в кооперативную (хотя и контролируемую системой, а не приложением), из за постановки потоков в очередь на доступ к ресурсам. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2020, 14:46 |
|
Совпадение порядка вызова с порядком исполнения на MSSQL.
|
|||
---|---|---|---|
#18+
Ну собственно интерес исключительно академический. Ну например есть копия одной и той же базы на разных серверах. Запускаем в одном потоке последовательность операций на изменение. Затем такую же последовательность на другом сервере. По факту применения одинаковых последовательностей - видим одинаковые базы данных. Потом берем все то же самое делаем в разных потоках. И тут... к сожалению базы могут в конце выполнения последовательностей стать разными по составу. Даже если у нас есть последовательность вызовов на первом сервере, на втором мы не можем в многопоточной среде обеспечить такой же порядок.(ну либо задержки большие что неприемлимо) Если был бы какой нибудь аналог блокировки-мьютекса. Типа execute в одном потоке выполнил но обязательно ждешь его подтверждения выполнения на сервере и только после этого выполнение execute следующего потока приступает и так далее. А сейчас пульнул вникуда и далее как сервер забрал и запустил он уже решает.(зависит от нагрузки, распределения по нума узлам и т.п.) ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2020, 18:43 |
|
Совпадение порядка вызова с порядком исполнения на MSSQL.
|
|||
---|---|---|---|
#18+
Была мысль, давным давно на подобных механизмах кластер распределенный построить. Но увы , из за подобных архитектурных ограничений это технически не возможно. (На Постгри подобную возможность с учетом исходников не проверял). В результате обмен данными между серверами было решено реализовать через получение данных с помощью триггеров только в онлайн(после каждого батча на изменение), ну и последовательность выполнения реализуется через блокировочные механизмы центрального сервера. Впрочем я уже совсем скоро статейку на эту тему опубликую.(проверяю некоторые старые предположения, мало ли вдруг они не верные) ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2020, 19:42 |
|
Совпадение порядка вызова с порядком исполнения на MSSQL.
|
|||
---|---|---|---|
#18+
МуМу Если был бы какой нибудь аналог блокировки-мьютекса. Типа execute в одном потоке выполнил но обязательно ждешь его подтверждения выполнения на сервере и только после этого выполнение execute следующего потока приступает и так далее. Тут же концептуальная проблема отсутствия гарантированного порядка выполнения в многопоточной системе, в параллельных вычислениях, а не проблема отсутствия какой то функции в АПИ. Так что поставленная техническая задача не решается никак. А бизнес задача решается определением зависимостей, и синхронизацией (механизмом гарантированного порядка выполнения) зависимых команд. Но определить зависимости в общем случае, для произвольной БД и произвольных команд, невозможно. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2020, 23:01 |
|
Совпадение порядка вызова с порядком исполнения на MSSQL.
|
|||
---|---|---|---|
#18+
Я к тому, что старт запроса - вещь вполне контролируемая, а вот его выполнение и окончание - уже нет. В процессе работы они могут обгонять, отставать. СкАчки, одним словом. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.06.2020, 02:42 |
|
Совпадение порядка вызова с порядком исполнения на MSSQL.
|
|||
---|---|---|---|
#18+
Как раз гарантия старта не вполне контролируемая вещь. Например запуская с клиента вызов, из за долгого пинга у вас нет гарантий о времени его выполнения на сервере, и даже выполняя его на сервере в нагруженной многопоточной среде у вас также нет гарантий порядка выполнения. Впрочем проведите эксперимент и убедитесь. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.06.2020, 12:19 |
|
Совпадение порядка вызова с порядком исполнения на MSSQL.
|
|||
---|---|---|---|
#18+
Хотя пожалуй я придумал способ обеспечить порядок выполнения. Через проверку в бесконечном цикле уже понятно(определение номера последовательности и ожидания), еще подумаю как экономичней сделать через блокировки(пока не придумывается). ... |
|||
:
Нравится:
Не нравится:
|
|||
11.06.2020, 12:31 |
|
Совпадение порядка вызова с порядком исполнения на MSSQL.
|
|||
---|---|---|---|
#18+
МуМу Хотя пожалуй я придумал способ обеспечить порядок выполнения. Я тут соглашусь с Владислав Колосов, для решения задачи "По факту применения одинаковых последовательностей - видим одинаковые базы данных" нужно обеспечить не определённую последовательность старта, а определённую последовательность выполнения всех стейтментов в запускаемых командах. Т.е. если удастся запускать на 2х серверах команды в нужной последовательности, в результате получатся 2 разные БД. (конечно, это зависит от содержания команд, может, и не получатся) ... |
|||
:
Нравится:
Не нравится:
|
|||
11.06.2020, 17:09 |
|
Совпадение порядка вызова с порядком исполнения на MSSQL.
|
|||
---|---|---|---|
#18+
А ещё точнее - обеспечить независимость результата выполнения запросов от их последовательности. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.06.2020, 13:58 |
|
Совпадение порядка вызова с порядком исполнения на MSSQL.
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov А ещё точнее - обеспечить независимость результата выполнения запросов от их последовательности. PS Вообще, в большинстве реальных систем не удастся повторить БД даже при одинаковой последовательности вызовов, но у МуМу это не так, иначе бы не возник этот топик. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.06.2020, 14:10 |
|
Совпадение порядка вызова с порядком исполнения на MSSQL.
|
|||
---|---|---|---|
#18+
alexeyvg PS Вообще, в большинстве реальных систем не удастся повторить БД даже при одинаковой последовательности вызовов, но у МуМу это не так, иначе бы не возник этот топик. тут даже если снятую трассу накатывать, всё равно никто не подпишеться в идентичности ... |
|||
:
Нравится:
Не нравится:
|
|||
12.06.2020, 14:45 |
|
Совпадение порядка вызова с порядком исполнения на MSSQL.
|
|||
---|---|---|---|
#18+
Пару мысленных экспериментов и экспериментов показали что решить задачу многопоточного воспроизведения один в один практически не возможно. Ну то есть в одном потоке все тривиально, но в многопоточной реализации даже если нет стайтментов и операции все примитивные типа I,U,D по первичному ключу, все равно дерево блокировок может отличаться. Время старта нельзя гарантировать не то что время завершения. Тем не менее с некоторыми ограничениями задача решается. То есть можно переигрывать и откатывать. То есть можно проверять статус и в особо "узких" многопоточных запросах при проигрывании можно расставлять маркеры блокировки. А в некоторых случаях просто признавать определенных частях "трассы" что воспроизведение не приводит к повторяемым результатам. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2020, 11:16 |
|
|
start [/forum/topic.php?fid=46&msg=39968315&tid=1685986]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
197ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
others: | 287ms |
total: | 580ms |
0 / 0 |