Entity Framework с Sql Azure через net tcp низкая производительность

#performance #entity-framework #azure #azure-sql-database #nettcpbinding

#Производительность #entity-framework #azure #azure-sql-database #nettcpbinding

Вопрос:

Привет, ребята,

Итак, у меня здесь действительно большая проблема с производительностью. У меня есть приложение WPF, которое подключается к службе, которая выполняется внутри рабочей роли. Служба использует привязку net tcp с полным дуплексом. Весь уровень доступа к данным находится в библиотеке, на которую я ссылаюсь в своем сервисе. Поэтому, когда моя служба хочет получить данные, она использует методы в этой библиотеке. Эта библиотека использует EF 4.1, который сопоставлен с базой данных Sql Azure.

Проблема, с которой я сталкиваюсь, заключается в том, что запрос, подобный получению пользователя из базы данных, занимает где-то более 4 секунд. У меня также есть служба http (используемая приложением Silverlight), которая использует ту же библиотеку доступа к данным, тот же запрос там занимает 115 мс, что нормально.

Есть ли проблема с Entity Framework, когда я использую службу net tcp? Я действительно не знаю, в чем проблема, потому что через службу http все запросы ведут себя нормально.

Комментарии:

1. Итак, что касается проблемы, я сузил ее до чего-то, что связано с рабочими ролями. У меня также есть другая рабочая роль, которая выполняет операции с базой данных sql Azure, используя ту же библиотеку, что и EF4.1. У этой рабочей роли также есть проблемы с производительностью в отношении запросов. Я действительно в замешательстве…

2. Находятся ли ваши роли и база данных SQL в одной и той же группе привязки? Вы абсолютно хотите убедиться, что работаете в одном центре обработки данных. Я бы также рассмотрел возможность реализации метода службы «stub», который не предоставляет доступ к данным, чтобы узнать, есть ли где-то проблема с привязкой net-tcp.

3. Да, роли находятся в одной и той же группе привязки к базе данных. Ну, я думаю, что проблема не в привязке, потому что, как я уже говорил выше, у меня есть другая роль, в которой не размещается служба, она выполняет только операции с базой данных, и проблема с производительностью также возникает в этой роли. У обеих рабочих ролей одна и та же проблема, только веб-роль (в которой размещено веб-приложение Silverlight с сервисом basichttp) работает без проблем. Во всех 3 ролях я использую одну и ту же библиотеку доступа к данным с теми же операциями, только когда я вызываю их из рабочих ролей, операции выполняются очень медленно.

4. Сколько записей возвращает запрос? Я обнаружил, что использование SQL Azure, если у вас есть запрос, который возвращает более нескольких сотен строк, будет довольно медленным.

5. И сколько запросов библиотека выполняет за запрос? Мы обнаружили, что даже в одном и том же центре обработки данных вы можете получить задержку ~ 50 мс или хуже на запрос — так что, если у вас есть плохо написанный фрагмент кода, который выполняет запросы в цикле, вы можете получить ужасающую производительность. Перенесите нагрузку на базу данных.

Ответ №1:

Возможно ли, что вы используете отложенную загрузку вместо быстрой загрузки с помощью вашего объекта? Отложенная загрузка через Интернет происходит намного медленнее, поскольку это приводит к гораздо большему количеству переходов к SQL Azure, что в данном случае было бы бутылочным горлышком. Быстрая загрузка просто получит все данные сразу за один раз.

Ссылка: http://msdn.microsoft.com/en-us/library/bb896272.aspx

Комментарии:

1. Я не думаю, что это связано с отложенной загрузкой. Я также пробовал это, устанавливая значение отложенной загрузки false для контекста, но никакого эффекта. Как я уже сказал, у меня есть веб-роль со службой, которая работает без проблем с производительностью, используя ту же библиотеку доступа к данным, что и рабочие роли. Только при использовании рабочих ролей я сталкиваюсь с этой проблемой.