AXForum  
Вернуться   AXForum > Microsoft Dynamics CRM > Dynamics CRM: Разработка
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 29.12.2010, 15:37   #1  
Melaen is offline
Melaen
Участник
 
4 / 10 (1) +
Регистрация: 29.12.2010
Angry Производительность
Добрый день всем!

Столкнулись с проблемой производительности при массовом обновлении полей у объектов через веб-сервис CRM.

Пример: консольное приложение.

Исходный код:

Код:
        static CrmSdk.CrmService crmService = new CrmSdk.CrmService();
        static void Main(string[] args)
        {
            string Server = "servername";
            string orgName = "orgname";
            CrmAuthenticationToken token = new CrmAuthenticationToken();
            token.OrganizationName = orgName;

            CrmSdk.CrmService crmService = new CrmSdk.CrmService();
            crmService.Url = "http://" + Server + "/mscrmservices/2007/crmservice.asmx";
            crmService.Credentials = new System.Net.NetworkCredential("", "", "");
            crmService.CrmAuthenticationTokenValue = token;
            crmService.PreAuthenticate = true;

            task task = new task();
            task.subject = "SpeedTest";
            Guid TaskID = crmService.Create(task);
            task = (task)crmService.Retrieve(EntityName.task.ToString(),
                                           TaskID, new AllColumns());

            for (int i = 0; i < 1000; i++)
            {
                task.subject = "SpeedTest " + i.ToString();
                crmService.Update(task);
                Console.WriteLine("Update Task " + task.subject);
            }
}

При запуске приложения, после инициализации веб-сервиса, появляется загрузка процессора на сервере приложением w3wp.exe - ~15% и приложением lsass.exe - ~45% (!). При запуске второй копии приложения одновременно с первой, загрузка процессора возрастает до 100% и работать в CRM становится невозможно. Сервер - виртуальная машина Windows Server 2008 SP2, на ней контроллер домена, SQL Server 2008 и все роли CRM сервера.
Возникли вопросы:
1) Что-то не так с кодом? (это тестовое приложение, но принцип работы с веб-сервисом такой везде)
2) Узкое место в аппаратной части? (два логических процессора 2,66 ГГц, 2 Гб памяти)
3) Или это нормальное поведение при такой нагрузке? То есть теоретически пользователи могут нагрузить сервер до такой степени стандартным функционалом CRM. Вопрос в количестве пользователей.
4) Вопрос с lsass.exe? Не понятно в чем причина загрузки сервера этим процессом.
5) Есть определенная задача, если нужно - объясню суть задачи. Попробуем подумать над другими способами решения. Сейчас думаем над тригерами и прямыми инсертами в базу SQL Но это крайний вариант.
Старый 29.12.2010, 15:50   #2  
a33ik is offline
a33ik
Чайный пьяница
Аватар для a33ik
MCP
MCBMSS
Злыдни
Соотечественники
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,243 / 896 (36) +++++++
Регистрация: 02.07.2008
Адрес: Greenville, SC
Цитата:
Сообщение от Melaen Посмотреть сообщение
Добрый день всем!

Столкнулись с проблемой производительности при массовом обновлении полей у объектов через веб-сервис CRM.

Пример: консольное приложение.

Исходный код:

Код:
        static CrmSdk.CrmService crmService = new CrmSdk.CrmService();
        static void Main(string[] args)
        {
            string Server = "servername";
            string orgName = "orgname";
            CrmAuthenticationToken token = new CrmAuthenticationToken();
            token.OrganizationName = orgName;

            CrmSdk.CrmService crmService = new CrmSdk.CrmService();
            crmService.Url = "http://" + Server + "/mscrmservices/2007/crmservice.asmx";
            crmService.Credentials = new System.Net.NetworkCredential("", "", "");
            crmService.CrmAuthenticationTokenValue = token;
            crmService.PreAuthenticate = true;

            task task = new task();
            task.subject = "SpeedTest";
            Guid TaskID = crmService.Create(task);
            task = (task)crmService.Retrieve(EntityName.task.ToString(),
                                           TaskID, new AllColumns());

            for (int i = 0; i < 1000; i++)
            {
                task.subject = "SpeedTest " + i.ToString();
                crmService.Update(task);
                Console.WriteLine("Update Task " + task.subject);
            }
}

При запуске приложения, после инициализации веб-сервиса, появляется загрузка процессора на сервере приложением w3wp.exe - ~15% и приложением lsass.exe - ~45% (!). При запуске второй копии приложения одновременно с первой, загрузка процессора возрастает до 100% и работать в CRM становится невозможно. Сервер - виртуальная машина Windows Server 2008 SP2, на ней контроллер домена, SQL Server 2008 и все роли CRM сервера.
Возникли вопросы:
1) Что-то не так с кодом? (это тестовое приложение, но принцип работы с веб-сервисом такой везде)
2) Узкое место в аппаратной части? (два логических процессора 2,66 ГГц, 2 Гб памяти)
3) Или это нормальное поведение при такой нагрузке? То есть теоретически пользователи могут нагрузить сервер до такой степени стандартным функционалом CRM. Вопрос в количестве пользователей.
4) Вопрос с lsass.exe? Не понятно в чем причина загрузки сервера этим процессом.
5) Есть определенная задача, если нужно - объясню суть задачи. Попробуем подумать над другими способами решения. Сейчас думаем над тригерами и прямыми инсертами в базу SQL Но это крайний вариант.
По поводу приложения - всё выглядит правильным.
Поскольку аппаратка - виртуалка, то попробуйте добавить процессоров/ОЗУ.
По поводу прямых инсертов и триггеров - можете попробовать, но это нерекомендуемая кастомизация.
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством.

Подписывайтесь на мой блог, twitter и YouTube канал.
Пользуйтесь моим Ultimate Workflow Toolkit
Старый 29.12.2010, 19:25   #3  
Konstantin Katsovich is offline
Konstantin Katsovich
Участник
Аватар для Konstantin Katsovich
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
243 / 57 (2) ++++
Регистрация: 22.10.2008
Адрес: Israel
У меня была похожая проблема
  1. Я перенес код в отдельный веб сервис (из него делаю обращения к CRM).
  2. Сделал консольное приложение, которое обращается к моему веб сервису.
Код стал бежать намного быстрее.


Попробуйте.
__________________
Читайте SDK!!!
Старый 29.12.2010, 20:04   #4  
Артем Enot Грунин is offline
Артем Enot Грунин
Moderator
Аватар для Артем Enot Грунин
MCBMSS
Злыдни
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,912 / 623 (28) +++++++
Регистрация: 16.08.2007
Адрес: Пермь!
Записей в блоге: 151
Виртуальная машина одна или у нее много соседей? После виртуализации моего сервера и выделении идентичных ресурсов что были у физического, машина стала работать в полтора раза медленнее, чем на физической платформе. Узким местом может быть жесткий диск. В идеале каждая виртуалка должна иметь свой личный диск или массив. Дело в том что при ее работе возникает большое количество дисковых операции, так что две или три машины могут существенно снижать производительность друг друга.
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия.

MS Certified Dirty Magic Professional
Старый 30.12.2010, 11:18   #5  
Melaen is offline
Melaen
Участник
 
4 / 10 (1) +
Регистрация: 29.12.2010
Цитата:
Сообщение от Артем Enot Грунин Посмотреть сообщение
Виртуальная машина одна или у нее много соседей? После виртуализации моего сервера и выделении идентичных ресурсов что были у физического, машина стала работать в полтора раза медленнее, чем на физической платформе. Узким местом может быть жесткий диск. В идеале каждая виртуалка должна иметь свой личный диск или массив. Дело в том что при ее работе возникает большое количество дисковых операции, так что две или три машины могут существенно снижать производительность друг друга.
Проблема воспроизводится на физическом сервере. Причем MS SQL вынесен на отдельный сервер. Операции массового создания/изменения объектов через веб-сервис сильно нагружают процессор. Вот и возникли вопросы. Проблема в коде или в настройках IIS или все таки в самом сервере.
Старый 30.12.2010, 13:59   #6  
Артем Enot Грунин is offline
Артем Enot Грунин
Moderator
Аватар для Артем Enot Грунин
MCBMSS
Злыдни
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,912 / 623 (28) +++++++
Регистрация: 16.08.2007
Адрес: Пермь!
Записей в блоге: 151
Возможно что-то не так с настройками. В сети, в том числе на этом форуме есть бенчмарки CRM 4.0. Насколько я помню, она легко держит десятки тысяч конкурирующих пользователей. Из своей практики могу заметить, что импорт 13000+ организаций и 9000+ контактов длился в общей сложности около 10 минут и при этом система отвечала на запросы. Если вы пишете интеграцию, то очень не рекомендую связываться с базой. Используйте все же сервисы.
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия.

MS Certified Dirty Magic Professional
Старый 30.12.2010, 14:35   #7  
Melaen is offline
Melaen
Участник
 
4 / 10 (1) +
Регистрация: 29.12.2010
Цитата:
Сообщение от Артем Enot Грунин Посмотреть сообщение
Насколько я помню, она легко держит десятки тысяч конкурирующих пользователей. Из своей практики могу заметить, что импорт 13000+ организаций и 9000+ контактов длился в общей сложности около 10 минут и при этом система отвечала на запросы.
В принципе вот это и хотелось услышать - практические знания.

Цитата:
Сообщение от Артем Enot Грунин Посмотреть сообщение
Если вы пишете интеграцию, то очень не рекомендую связываться с базой. Используйте все же сервисы.
Задача следующая:
Вести логи изменения полей объекта "Заявка" и "Продукт для заявки", а также логи создания новых заявок. Сейчас реализовано на коллаутах. Причем сами логи - тоже объекты При этом при массовом создании/изменении заявок сервер "закипает"
Сейчас есть идея повесить триггеры на таблицы в базе (вместо коллаутов) и сделать ведение логов в своей(!) таблице в БД CRM (вместо создания объектов в CRM).
Старый 30.12.2010, 15:34   #8  
a33ik is offline
a33ik
Чайный пьяница
Аватар для a33ik
MCP
MCBMSS
Злыдни
Соотечественники
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,243 / 896 (36) +++++++
Регистрация: 02.07.2008
Адрес: Greenville, SC
Цитата:
Сообщение от Melaen Посмотреть сообщение
Вести логи изменения полей объекта "Заявка" и "Продукт для заявки", а также логи создания новых заявок.
В принципе довольно типичная задача.

Цитата:
Сообщение от Melaen Посмотреть сообщение
Сейчас реализовано на коллаутах.
Если у вас 4.0 рекомендую переписать под плагины.

Цитата:
Сообщение от Melaen Посмотреть сообщение
Причем сами логи - тоже объекты
А что тут противозаконного?

Цитата:
Сообщение от Melaen Посмотреть сообщение
Сейчас есть идея повесить триггеры на таблицы в базе
Ансапорт, не советую так поступать.

Цитата:
Сообщение от Melaen Посмотреть сообщение
сделать ведение логов в своей(!) таблице в БД CRM (вместо создания объектов в CRM).
5 баллов. А когда пользователь попросит показать как изменялась та или иная заявка вы ему установите SQL Management Studio и научите T-SQL?
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством.

Подписывайтесь на мой блог, twitter и YouTube канал.
Пользуйтесь моим Ultimate Workflow Toolkit
Старый 30.12.2010, 22:22   #9  
AndreyS is offline
AndreyS
Moderator
Сотрудники Microsoft Dynamics
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
283 / 61 (3) ++++
Регистрация: 18.05.2006
Идея вынести все в отдельную базу - достаточно здравая, но тогда вы получите проблему, о которой написал a33ik (и для его решения придется писать aspx-страничку для отображения журнала). Как вариант - пишите в базу (в свой объект Запись журнала), но таблицу поместите в отдельную файловую группу на отдельном диске - это уменьшит проблемы с производительностью, бэкапом, но в то же время, Вы сможете отображать лог прямо в CRM.
Старый 30.12.2010, 22:28   #10  
AndreyS is offline
AndreyS
Moderator
Сотрудники Microsoft Dynamics
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
283 / 61 (3) ++++
Регистрация: 18.05.2006
А вообще - как говорит мой коллега из поддержки: "В проблеме производительности CRM опять оказался не при чем"
Старый 05.01.2011, 23:23   #11  
Melaen is offline
Melaen
Участник
 
4 / 10 (1) +
Регистрация: 29.12.2010
Thumbs up
Цитата:
Сообщение от a33ik Посмотреть сообщение
Если у вас 4.0 рекомендую переписать под плагины.
В чем принципиальная разница?

Цитата:
Сообщение от a33ik Посмотреть сообщение
5 баллов. А когда пользователь попросит показать как изменялась та или иная заявка вы ему установите SQL Management Studio и научите T-SQL?
Чтобы получить данные из БД есть много способов
Хотя бы тотже Report Services. Суть не в этом.
Суть в том, что то, как реализовано сейчас - тормозит. При загрузке заявок из внешней разработки, работать в CRM невозможно.
Старый 06.01.2011, 00:15   #12  
a33ik is offline
a33ik
Чайный пьяница
Аватар для a33ik
MCP
MCBMSS
Злыдни
Соотечественники
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,243 / 896 (36) +++++++
Регистрация: 02.07.2008
Адрес: Greenville, SC
Cool
Цитата:
Сообщение от Melaen Посмотреть сообщение
Чтобы получить данные из БД есть много способов
Хотя бы тотже Report Services. Суть не в этом.
Суть как раз в этом. Отчёт - это дополнительные затраты на разработку отчёта и интеграцию его в CRM. Я уже не говорю про механизмы получения простым пользователем данных непосредственно из таблиц

Цитата:
Сообщение от Melaen Посмотреть сообщение
В чем принципиальная разница?
Плагины могут быть зарегистрированы как асинхронные (а калауты - нет) и отсюда ответ на следующую часть вашего сообщения:

Цитата:
Сообщение от Melaen Посмотреть сообщение
Суть в том, что то, как реализовано сейчас - тормозит. При загрузке заявок из внешней разработки, работать в CRM невозможно.
Зарегистрируйте плагин, который выполняет логирование как асинхронный.
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством.

Подписывайтесь на мой блог, twitter и YouTube канал.
Пользуйтесь моим Ultimate Workflow Toolkit

Последний раз редактировалось a33ik; 06.01.2011 в 12:15.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Производительность CRM системы slivka_83 Dynamics CRM: Администрирование 10 10.02.2011 12:29

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 09:58.