|
![]() |
#1 |
Участник
|
Для истории: есть KB 3216955 KB 3216955, Bug Id 3804879 "Continuous dead locks in batch" для AX 2012 R2, где реализован целый ряд исправлений в классе BatchRun. Они сводятся к тому, чтобы при обновлении таблиц пакетной инфраструктуры вместо оптимистичной конкуренции использовать mutex на уровне СУБД, управляемый с помощью класса ReqReaderWriterLock. Такой подход позволяет надежно синхронизировать различные потоки пакетных обработчиков, в том числе выполняющиеся на разных пакетных серверах. См. также соотв. изменения в коде.
|
|
![]() |
#2 |
Участник
|
![]()
2012 R3. Внесены все изменения по мьютексам в BatchRun и даже больше (ускоряющие хинты), но неожиданно всплыла очень медленная вставка в таблицу BatchConstraintsHistory. Из-за этого другие пакетники нарываются на блокировку мьютекса и ничего не стартует и не двигается десятками минут. Переиндексации и обновление статистик тут особо не работают, так как таблички часто меняются, а структура запроса не позволяла применить стандартные мантры хинтов из 2012 (forceSelectOrder forceNestedLoop). Но удалось переписать и этот запрос. Может кому-то пригодится.
BatchRun.serverProcessFinishedJobs Оригинальный код: X++: insert_recordset batchConstraintsHistory (BatchId, ExpectedStatus, DependsOnBatchId) select RecId from batchHistory join ExpectedStatus from batchConstraints where batchHistory.BatchId == batchConstraints.BatchId join RecId from batchHistoryDepends where batchHistoryDepends.BatchId == batchConstraints.DependsOnBatchId exists join batchJobHistory where batchJobHistory.Finishing == 1 && batchJobHistory.RecId == batchHistory.BatchJobHistoryId && batchJobHistory.RecId == batchHistoryDepends.BatchJobHistoryId; X++: insert_recordset batchConstraintsHistory (DependsOnBatchId, ExpectedStatus, BatchId) select forcePlaceholders forceSelectOrder forceNestedLoop batchJobHistory where batchJobHistory.Finishing == 1 join RecId from batchHistoryDepends where batchHistoryDepends.BatchJobHistoryId == batchJobHistory.RecId join ExpectedStatus from batchConstraints where batchConstraints.DependsOnBatchId == batchHistoryDepends.BatchId join RecId from batchHistory where batchHistory.BatchJobHistoryId == batchJobHistory.RecId && batchHistory.BatchId == batchConstraints.BatchId; |
|
|
За это сообщение автора поблагодарили: Logger (3), A_BAS (2). |
![]() |
#3 |
Участник
|
Цитата:
Сообщение от gl00mie
![]() Для истории: есть KB 3216955 KB 3216955, Bug Id 3804879 "Continuous dead locks in batch" для AX 2012 R2, где реализован целый ряд исправлений в классе BatchRun. Они сводятся к тому, чтобы при обновлении таблиц пакетной инфраструктуры вместо оптимистичной конкуренции использовать mutex на уровне СУБД, управляемый с помощью класса ReqReaderWriterLock. Такой подход позволяет надежно синхронизировать различные потоки пакетных обработчиков, в том числе выполняющиеся на разных пакетных серверах. См. также соотв. изменения в коде.
Просто установить недостаточно, необходимо еще включить, вставив запись в sysGlobalConfig Мы пробовали сделать на одном из клиентов(у них очень много пакетных заданий), в итоге это работало где-то день, потом все зависло. Т.е. какая-то сессия взяла этот мутекс и при этом ничего не делала. Попробовали еще раз, такая же история через день. В итоге решили что постоянные деадлоки это меньшее зло, чем полностью зависающая система Вопрос - кто нибудь побеждал эти деадлоки(они встречаются практически на всех клиентах, где несколько пакетных АОСов) и если да, то как? X++: #define.ConfigName_EnableBatchRunServerTaskLock('EnableBatchRunServerTaskLock') select Value from sysGlobalConfig where sysGlobalConfig.Name == #ConfigName_EnableBatchRunServerTaskLock; |
|
![]() |
#4 |
Участник
|
У меня используются эти мьютексы. Но я точечно изменения из CU13 перенес. Там все прозрачно и не проверяется ничего из sysGlobalConfig. Подвисания были как раз из-за batchConstraintsHistory, но моя правка свежая и утверждать, что проблема ушла окончательно еще не могу.
|
|
Теги |
ax2012, batch, batchrun, reqreaderwriterlock, баг, блокировки, закрытие склада |
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|