Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 SSIS - script transform распараллеливание  [new]
Denis@nk
Member

Откуда:
Сообщений: 193
Добрый день. Задумали выкачивать сторонний ресурс через веб сервисы.
Написали в script transform чтение данных и дальнейшую обработку в Data Flow.

Потом появилось желание ускорить выгрузку и распараллелить процесс.
В вызывающем пакете добавили вызов 32 Execute Package Task и ожидали линейного прироста.
Но по факту столкнулись с сильным замедлением. Добавили замер времени непосредственно вызова веб-метода.
Он стал вместо 0,5 с работать 7 с.

Для проверки сделали консольное приложение на C#, и там вызывали эти методы в 32 потока. Замедления не было.

В связи с чем вопрос. Что так сильно в SSIS замедляет работу и как этого избежать?
3 июн 16, 13:19    [19254620]     Ответить | Цитировать Сообщить модератору
 Re: SSIS - script transform распараллеливание  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4902
Denis@nk,

Покажите скрин структуры потока
3 июн 16, 13:29    [19254683]     Ответить | Цитировать Сообщить модератору
 Re: SSIS - script transform распараллеливание  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4478
Denis@nk
В связи с чем вопрос. Что так сильно в SSIS замедляет работу и как этого избежать?

А куда загружаете данные?
Попробуйте изменить уровень изоляции для пакета.
3 июн 16, 13:43    [19254779]     Ответить | Цитировать Сообщить модератору
 Re: SSIS - script transform распараллеливание  [new]
Karramba
Member

Откуда:
Сообщений: 8
В Data Flow Task в скрипте вызывается веб-сервис:
var wsClient = new SoapClient(bindingElement, endPointAddress);
DateTime BeginQuery = DateTime.Now;
string response = wsClient.GetReport("", "", Param, out xml);
TimeSpan TimeElapsed = DateTime.Now - BeginQuery;

Проблема в том, что при увеличении числа одновременно запущенных пакетов увеличивается TimeElapsed.

При этом корреляции с выгрузкой данных в БД нет. Пробовали удалять все выходные потоки.

К сообщению приложен файл. Размер - 68Kb
3 июн 16, 14:04    [19254953]     Ответить | Цитировать Сообщить модератору
 Re: SSIS - script transform распараллеливание  [new]
Denis@nk
Member

Откуда:
Сообщений: 193
Отключили транзакции и убрали уровень изоляции - не повлияло.
6 июн 16, 12:15    [19262035]     Ответить | Цитировать Сообщить модератору
 Re: SSIS - script transform распараллеливание  [new]
Ferdipux
Member

Откуда: Москва
Сообщений: 594
Denis@nk,

Приведите, пожалуйста, кусок кода из script transform.
6 июн 16, 12:37    [19262181]     Ответить | Цитировать Сообщить модератору
 Re: SSIS - script transform распараллеливание  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31984
Denis@nk
Но по факту столкнулись с сильным замедлением. Добавили замер времени непосредственно вызова веб-метода.
Он стал вместо 0,5 с работать 7 с.
Для проверки сделали консольное приложение на C#, и там вызывали эти методы в 32 потока. Замедления не было.
Да, интересно.
Получается, есть где то в сиквельном хосте .NET какая то общая точка блокировки...
Либо для конкретно SoapClient, либо для вообще хостинга .NET

Karramba
В Data Flow Task в скрипте вызывается веб-сервис:
var wsClient = new SoapClient(bindingElement, endPointAddress);
DateTime BeginQuery = DateTime.Now;
string response = wsClient.GetReport("", "", Param, out xml);
TimeSpan TimeElapsed = DateTime.Now - BeginQuery;


Проблема в том, что при увеличении числа одновременно запущенных пакетов увеличивается TimeElapsed.
А в консольном приложении на C# точно такой же код вызова веб-сервиса?
6 июн 16, 12:45    [19262232]     Ответить | Цитировать Сообщить модератору
 Re: SSIS - script transform распараллеливание  [new]
Denis@nk
Member

Откуда:
Сообщений: 193
Ferdipux,

Karramba привел пример.
6 июн 16, 13:09    [19262413]     Ответить | Цитировать Сообщить модератору
 Re: SSIS - script transform распараллеливание  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8828
Denis@nk,

а почему вы пытаетесь запускать пачку пакетов, вместо того, чтобы сделать это внутри одного пакета с расшариванием подключения?
6 июн 16, 13:14    [19262445]     Ответить | Цитировать Сообщить модератору
 Re: SSIS - script transform распараллеливание  [new]
Denis@nk
Member

Откуда:
Сообщений: 193
alexeyvg,

В консольном приложении такой же код.
Я думаю даже не в SoapClient проблема. Отключили вообще все вызовы, оставили просто запись в буфер время выполнения.
Каждый поток получает всего по 100 записей, и время выполнения потока доходит до 7 секунд. При этом повторюс в скрипте уже нет никакой обработки.
6 июн 16, 13:17    [19262472]     Ответить | Цитировать Сообщить модератору
 Re: SSIS - script transform распараллеливание  [new]
Denis@nk
Member

Откуда:
Сообщений: 193
Владислав Колосов, мы посчитали это наиболее целесообразным и штатным решением. Разрабатываем логику для одного потока, затем штатными средствами вызываем его параллельно столько раз, сколько нам надо.

Или я неправильно понял вопрос, мы запускаем пакет один раз, а в нем 32 раза вызываются с помощью Execute Package Task дочерние пакеты. Как правильнее сделать по другому?
6 июн 16, 13:22    [19262509]     Ответить | Цитировать Сообщить модератору
 Re: SSIS - script transform распараллеливание  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8828
Denis@nk,

понятно, вы что так что эдак вызываете один пакет 32 раза, пусть даже и с помощью другого пакета.

Я имел в виду, что не пробовали ли ваше дерево копировать внутри одного пакета несколько раз? Например, как контейнер последовательности.
6 июн 16, 14:02    [19262745]     Ответить | Цитировать Сообщить модератору
 Re: SSIS - script transform распараллеливание  [new]
Denis@nk
Member

Откуда:
Сообщений: 193
Владислав Колосов, не пробовали, это выглядит неподдерживаемым решением - копирование кода.
6 июн 16, 14:51    [19263095]     Ответить | Цитировать Сообщить модератору
 Re: SSIS - script transform распараллеливание  [new]
Ferdipux
Member

Откуда: Москва
Сообщений: 594
Denis@nk
...
Но по факту столкнулись с сильным замедлением. Добавили замер времени непосредственно вызова веб-метода.
Он стал вместо 0,5 с работать 7 с.

Для проверки сделали консольное приложение на C#, и там вызывали эти методы в 32 потока. Замедления не было.


По факту вы моделировали не совсем то, что делает SSIS. Для более-менее адекватной модели - в консольном приложении нужно запустить 32 процесса - это самый простой способ убедиться, что тот же wsClient не кешируется между потоками, а действительно создаются 32 различных инстанса. SSIS же внутри себя при запуске 32 дочерних пакетов себя ничего не знает о том, что скрипт трансформацию можно кешировать, и честно создаст вам 32 инстанса прокси клиента. Создание WCF прокси - достаточно затратная задача, и поэтому они кешируются внутри AppDomain.

Почему же простой код
var wsClient = new SoapClient(bindingElement, endPointAddress);
DateTime BeginQuery = DateTime.Now;
string response = wsClient.GetReport("", "", Param, out xml);
TimeSpan TimeElapsed = DateTime.Now - BeginQuery;

при повторном исполнении сильно замедляется? Мои предположения, что это связано с тем, что
1. Перед первым вызовом прокси клиента, созданного SoapClient, неявно делается вызов wsClient.Open().
2. Открытие клиента - затратная операция для нового клиента
3. Как сказано выше, для прокси кешируются, но вызовы конструкторов с явным указание binding отключают кеширование.

Подробнее см. Performance Improvement for WCF Client Proxy Creation in .NET 3.5 and Best Practices

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

Идеи, как можно улучшить производительность SSIS script source
1. Запихать все вызовы в один script - для использования одного прокси.
2. Отказаться от указания binding при создании WCF прокси в script - гм, или указанием binding в самом config файле для dtexec или созданием своей компоненты.
6 июн 16, 14:52    [19263107]     Ответить | Цитировать Сообщить модератору
 Re: SSIS - script transform распараллеливание  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31984
Denis@nk
Я думаю даже не в SoapClient проблема. Отключили вообще все вызовы, оставили просто запись в буфер время выполнения.
Каждый поток получает всего по 100 записей, и время выполнения потока доходит до 7 секунд. При этом повторюс в скрипте уже нет никакой обработки.

В смысле вот так?
//  var wsClient = new SoapClient(bindingElement, endPointAddress);
DateTime BeginQuery = DateTime.Now;
//  string response = wsClient.GetReport("", "", Param, out xml);
TimeSpan TimeElapsed = DateTime.Now - BeginQuery;

И в результате TimeElapsed выводится как 7 секунд???

Или тогда где происходит задержка?
Потому что либо задержка происходит в вызове метода веб-клиента, как описал Karramba, либо она происходит в другом месте.
Но она не может перемещаться :-)

Тут нужно всё очень точно описывать и мерять, иначе не разобраться.
6 июн 16, 14:56    [19263125]     Ответить | Цитировать Сообщить модератору
 Re: SSIS - script transform распараллеливание  [new]
Denis@nk
Member

Откуда:
Сообщений: 193
alexeyvg, да отключили как Вы написали. Смотрим BeginQuery время первой записи в потоке и последнее (сотое).
У скрипта всего 100 строк на входе.
6 июн 16, 15:17    [19263267]     Ответить | Цитировать Сообщить модератору
 Re: SSIS - script transform распараллеливание  [new]
Karramba
Member

Откуда:
Сообщений: 8
Извините, коллеги, что невзначай ввёл в заблуждение.

Прокси класс создаётся один раз для сессии в блоке PreExecute.
Тут же вызывается Open() и метод авторизации для получения куки.
public override void PreExecute()
    {
        base.PreExecute();

        EndpointAddress endPointAddress = new EndpointAddress(new Uri("http://uri.ru/service.asmx"));
        BasicHttpBinding bindingElement = new BasicHttpBinding();
        bindingElement.AllowCookies = true;
        bindingElement.MaxReceivedMessageSize = Int32.MaxValue;
        bindingElement.MaxBufferSize = Int32.MaxValue;
        wsClient = new SoapClient(bindingElement, endPointAddress);
        wsClient.Open();
        wsClient.Authmethod();
        
    }


В ProcessInputRow вызывается нужный метод для каждой строки входных данных
public override void Input0_ProcessInputRow(Input0Buffer Row)
{
    DateTime BeginQuery = DateTime.Now;
    string response = wsClient.GetReport("", "", Row.Param, out xml);
    TimeSpan TimeElapsed = DateTime.Now - BeginQuery;
    //обработка xml

   //вывод сведений о скорости в отдельный буфер
        PerfomanceBuffer.AddRow();
        PerfomanceBuffer.Action = "GetReport: " + Row.Param + " - Thread " + Variables.Thread.ToString();
        PerfomanceBuffer.ActionDate = DateTime.Now;
        PerfomanceBuffer.ActionDuration = TimeSpan.FromMilliseconds(1);
        PerfomanceBuffer.SessionID = Variables.SessionID;
        PerfomanceBuffer.Size = 1;
        PerfomanceBuffer.FullQueryDuration = TimeElapsed;
}
6 июн 16, 15:37    [19263386]     Ответить | Цитировать Сообщить модератору
 Re: SSIS - script transform распараллеливание  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31984
Denis@nk
alexeyvg, да отключили как Вы написали. Смотрим BeginQuery время первой записи в потоке и последнее (сотое).
У скрипта всего 100 строк на входе.
Не, так вы определите только тот факт, что "программа работает медленно", а это и так известно :-)

Нужно именно "точку остановки" найти.

Вот было предположение, что эта точка - вызов веб-сервиса.
Но это оказалось не так. видимо, что то перепутали.

Нужно искать точку. Просто тупо вставлять логирование.

Для многих типов средств есть всякие профайлеры, удобно показывающие дерево времени выполнения, но, конечно, в SSIS пакете такого нету (точнее, есть, но на слишком высоком уровне)
Значит, просто пишите логи. Найдите это время вплоть до вызова нижнего (то есть не вашего, а библиотечного) уровня.
6 июн 16, 15:58    [19263527]     Ответить | Цитировать Сообщить модератору
 Re: SSIS - script transform распараллеливание  [new]
Ferdipux
Member

Откуда: Москва
Сообщений: 594
Karramba,

Правильно я понял вас и Denis@nk выше - что вы отключили в методе Input0_ProcessInputRow все кроме timespan таймера и вывода его результата? И получается что timespan между тривиальным методом (комментарием) растет внутри Script Transform?
Из интереса - сделал подобный скрипт (правда, без WCF proxy) у себя, эффект не воспроизводится.
6 июн 16, 16:06    [19263615]     Ответить | Цитировать Сообщить модератору
 Re: SSIS - script transform распараллеливание  [new]
Karramba
Member

Откуда:
Сообщений: 8
Ferdipux, отключили вызов GetReport и обработку xml.
По сути остался только вывод в PerfomanceBuffer.
Но остальные 17 выходов на схеме остались, без фактического заполнения.
6 июн 16, 16:35    [19263799]     Ответить | Цитировать Сообщить модератору
 Re: SSIS - script transform распараллеливание  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31984
Karramba
Ferdipux, отключили вызов GetReport и обработку xml.
По сути остался только вывод в PerfomanceBuffer.
Но остальные 17 выходов на схеме остались, без фактического заполнения.
А может там медленный, и к тому же лочащий что то OLE DB Source?
6 июн 16, 19:18    [19264647]     Ответить | Цитировать Сообщить модератору
 Re: SSIS - script transform распараллеливание  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8828
Если я правильно понимаю, то выходы формируют данные. Может там банально ядер не хватает, но не под веб-сервисы. Попробуйте стрелки стереть.
6 июн 16, 23:01    [19265163]     Ответить | Цитировать Сообщить модератору
 Re: SSIS - script transform распараллеливание  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31984
Владислав Колосов
Если я правильно понимаю, то выходы формируют данные. Может там банально ядер не хватает, но не под веб-сервисы. Попробуйте стрелки стереть.
ДА, но там же нет строк в последнем эксперименте...

Karramba
Ferdipux, отключили вызов GetReport и обработку xml.
По сути остался только вывод в PerfomanceBuffer.
Но остальные 17 выходов на схеме остались, без фактического заполнения.

Впрочем, задержка может быть и в оставшихся "вывод в PerfomanceBuffer", и в какой нибудь авторизации, и в чём то ещё...
6 июн 16, 23:26    [19265227]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить