Выявление причины медленного самостоятельного размещения WCF в определенных средах

1

Я пытаюсь отлаживать, почему наше программное обеспечение (клиент и сервер) работает медленно в определенных средах. Я пробовал несколько вещей без успеха, и теперь я не понимаю, как продолжить отслеживание проблемы. Мой вопрос: какие вещи я могу попробовать или изучить, чтобы решить эту проблему?

Мы разрабатываем самостоятельную службу WCF для запуска на сервере и клиентское приложение для подключения к ней. Служба взаимодействует с базой данных (MS SQL server).

Настройка A

  • Сервер работает в VM (2 ГБ ОЗУ, 1 ядро для ВМ)
  • клиент - отдельный настольный компьютер в той же интрасети
  • Запуск клиента (проверка подлинности и инициализация - около 40 вызовов службы) выполняется менее чем за пять секунд

Настройка B

  • Сервер не виртуализирован (16 ГБ оперативной памяти, двойной XEON e5-2640)
  • Клиент работает на том же компьютере, что и сервер (подключается к 127.0.0.1) для целей тестирования
  • Запуск клиента занимает около 45 секунд

сходства

  • Сервер и клиентское программное обеспечение являются одинаковыми для обеих настроек
  • Операционная система сервера - Windows 2008 r2
  • Роль Windows файлового сервера и IIS (не должно быть никаких других действий типа сервера, за исключением SQL-сервера)
  • Функция Windows.NET 4.5.1

Различия

  • В программе установки B используется SQL-сервер 2012. В программе установки A используется SQL Server 2008
  • Установки A и B находятся на расстоянии более 1000 миль (разные сети, управляемые по различным правилам IA)
  • Некоторые отличия в функциях сервера Windows, но ничего похожего на это не должно вызывать проблемы

Вещи, которые я пробовал

  • В программе установки A нет брандмауэра и антивируса на сервере.
  • В программе установки B отключен брандмауэр Windows. Защита Symant Endpoint работает; проницательность, ищейка, автоматическая защита, проницательность загрузки были отключены для тестирования, но не имели значения.
  • Службы интеграции SQL, отчетов и анализа были отключены с небольшими изменениями.
  • Я посмотрел в окно просмотра событий Windows и не вижу ничего необычного, но я не уверен, есть ли что-то конкретное, что я должен искать.
  • Я включил ведение журнала WCF (как здесь), но просмотр журнала в SvcTraceViewer.exe на самом деле не говорит мне ничего полезного.
  • Аналогичным образом, попытка регистрации различных характеристик в perfmon не была продуктивной.

Другие мысли

  • Не использовать Entity Framework в службе.
  • хранилище файлов находится на одной физической машине
  • Сервер запускает IIS для связанного webtool, но сам самостоятельный хостинг WCF не должен быть затронут (правда?)
  • Запуск профилировщика SQL, все вызовы базы данных быстро разрешаются (миллисекунды), поэтому я не думаю, что это проблема с базой данных.
  • Использование ЦП всегда очень низкое. Использование ОЗУ при настройке B составляет менее 60% (для каждого диспетчера задач).
  • Поскольку это не проблема базы данных или ресурсов, я предполагаю, что это проблема с сетью или WCF.

Вещи, которые я собираюсь попробовать

  • Есть несколько различий, которые еще предстоит решить - различные исправления, функции сервера и т.д.
  • Настройка клонирования ВМ на сервер настройки B
  • не уверен

Сервис app.config

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
   <configSections>
      <section name="fooNET.serviceProvider" type="foo.fooNET.ServiceRegistration.Classes.ServiceProviderConfiguration, foo.fooNET.ServiceRegistration" />
      <section name="nlog" type="bar.com.foo.NLog.Config.ConfigSectionHandler, foo.NLog" />
   </configSections>
   <connectionStrings>
      <add name="BaseDB" connectionString="..." />
      <add name="UserStore2" connectionString="..." />
      <add name="UserStore" connectionString="..." providerName="System.Data.EntityClient" />
      <add name="MetricCollectionDAL.Properties.Settings.MASSMetricsConnectionString" connectionString="..." />
   </connectionStrings>
   <appSettings>
      <add key="maxRequestLength" value="16384" />
      <add key="exclusiveFlag" value="true" />
      <add key="SubscriptionDeleteNotification" value="true" />
   </appSettings>
   <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <targets>
         <target name="file" xsi:type="File" fileName="${basedir}/fooNetLog.txt" keepFileOpen="true" layout="${date:format=MM/dd/yyyy HH\:mm\:ss}|${level}|${windows-identity}|${callsite}|${message}" archiveEvery="Day" maxArchiveFiles="5" />
         <target name="session" xsi:type="File" fileName="${basedir}/sessionlog.txt" keepFileOpen="true" layout="${date:format=MM/dd/yyyy HH\:mm\:ss}|${level}|${windows-identity}|${callsite}|${message}" concurrentWrites="false" deleteOldFileOnStartup="true" />
      </targets>
      <rules>
         <logger name="*" minlevel="Error" writeTo="file,session" />
      </rules>
   </nlog>
   <fooNET.serviceProvider xmlns="foo.fooNET">
      <plugins directory="Plugins" />
      <baseAddress uri="https://localhost:6040/ServiceProvider" />
      <brokers count="1" remoteRegister="true" registrationInterval="1" />
   </fooNET.serviceProvider>
   <system.serviceModel>
      <diagnostics performanceCounters="All" />
      <services>
         <service behaviorConfiguration="ServiceProviderBehavior" name="foo.fooNET.ServiceRegistration.Classes.ServiceProvider">
            <endpoint address="" binding="ws2007FederationHttpBinding" bindingConfiguration="ws2007Binding" behaviorConfiguration="EndpointBehavior" contract="foo.fooNET.Shared.Server.Interfaces.IServiceProvider" />
            <endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange" />
            <host>
               <baseAddresses>
                  <add baseAddress="https://localhost:6040/ServiceProvider" />
               </baseAddresses>
               <timeouts closeTimeout="00:10:00" openTimeout="00:10:00" />
            </host>
         </service>
      </services>
      <behaviors>
         <serviceBehaviors>
            <behavior name="ServiceProviderBehavior">
               <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" policyVersion="Policy15" />
               <serviceDebug includeExceptionDetailInFaults="false" />
               <serviceSecurityAudit auditLogLocation="Application" suppressAuditFailure="false" serviceAuthorizationAuditLevel="Failure" messageAuthenticationAuditLevel="Failure" />
               <serviceThrottling maxConcurrentCalls="32" maxConcurrentSessions="20" maxConcurrentInstances="2147483647" />
            </behavior>
         </serviceBehaviors>
         <endpointBehaviors>
            <behavior name="EndpointBehavior">
               <dispatcherSynchronization maxPendingReceives="6" />
            </behavior>
         </endpointBehaviors>
      </behaviors>
      <bindings>
         <ws2007FederationHttpBinding>
            <binding name="2007MtomBinding" closeTimeout="01:00:00" openTimeout="00:40:00" receiveTimeout="01:00:00" sendTimeout="00:40:00" transactionFlow="false" maxBufferPoolSize="0" maxReceivedMessageSize="2147483647" messageEncoding="Mtom" useDefaultWebProxy="false">
               <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
               <reliableSession ordered="false" inactivityTimeout="01:00:00" enabled="false" />
               <security mode="TransportWithMessageCredential">
                  <message establishSecurityContext="false">
                     <claimTypeRequirements>
                        <add claimType="http://bar.com/foo/fooNET/claims/FirstName" isOptional="false" />
                     </claimTypeRequirements>
                  </message>
               </security>
            </binding>
            <binding name="ws2007Binding" closeTimeout="01:00:00" openTimeout="00:05:00" receiveTimeout="01:00:00" sendTimeout="00:40:00" maxReceivedMessageSize="2147483647" maxBufferPoolSize="0" useDefaultWebProxy="false">
               <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
               <reliableSession inactivityTimeout="01:00:00" />
               <security mode="TransportWithMessageCredential">
                  <message negotiateServiceCredential="false" establishSecurityContext="false">
                     <claimTypeRequirements>
                        <add claimType="http://bar.com/foo/fooNET/claims/FirstName" isOptional="false" />
                     </claimTypeRequirements>
                  </message>
               </security>
            </binding>
         </ws2007FederationHttpBinding>
         <wsHttpBinding>
            <binding name="AuthenticationBinding" closeTimeout="01:00:00" receiveTimeout="01:00:00" sendTimeout="00:40:00" maxReceivedMessageSize="2147483647" bypassProxyOnLocal="true">
               <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
               <reliableSession inactivityTimeout="01:00:00" />
               <security mode="Transport" />
            </binding>
         </wsHttpBinding>
         <ws2007HttpBinding>
            <binding name="SecurityAuth" sendTimeout="00:40:00" maxReceivedMessageSize="2147483647" closeTimeout="01:00:00" receiveTimeout="01:00:00" useDefaultWebProxy="false">
               <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
               <reliableSession inactivityTimeout="01:00:00" />
               <security mode="TransportWithMessageCredential">
                  <message negotiateServiceCredential="true" />
               </security>
            </binding>
         </ws2007HttpBinding>
      </bindings>
   </system.serviceModel>
   <startup>
      <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0" />
   </startup>
</configuration>

Обновление 2014-11-18

Получил "моментальный снимок" сервера A (single file.vhd). Создал новую виртуальную машину в гипер-v (должен был добавить роль гипер-v) на сервере B с одним процессором и 2 ГБ оперативной памяти и загружен на сервер A vhd. Локальная виртуальная машина сервера A с локальным соединением выполняется так же быстро, как ожидалось. Единственное, что это говорит мне, - нет ничего плохого в физической коробке. Пробовал изменять количество ядер, выделенных VM, до 4 без каких-либо изменений.

  • 0
    Можете ли вы показать, как выглядит ваш файл .config? Мне интересно посмотреть, как эти две строки выглядят как <behaviors> <endpointBehaviors> и <behaviors> <serviceBehaviors>
  • 1
    Попробуйте Fiddler или Wire Shark, чтобы узнать, сможете ли вы получить информацию о сетевых пакетах и сравнить их. Я предполагаю, что та же версия IIS и пул приложений работает на той же .NET Framework?
Показать ещё 4 комментария
Теги:
wcf

1 ответ

0
Лучший ответ

Вытащил сервер A VM. Я сделал три изменения

  1. IP-адрес должен быть видимым в сети
  2. Присоединился к локальному домену
  3. Изменена учетная запись службы из [предыдущего] домена на учетную запись локального компьютера (не домена)

Я провел wirehark и захватил первоначальную аутентификацию и запуск. Мгновенно получил тонну записей, таких как:

Изображение 174551

Я изменил учетную запись, которая запускает службу для учетной записи в домене, но тогда я вообще не мог общаться. Я получаю исключение (на клиенте), которое говорит

"Объект связи, System.ServiceModel.Channels.ServiceChannel, не может использоваться для связи, поскольку он находится в состоянии Faulted".

Который, кажется, указывает, что это неперехваченное/необработанное исключение.

Удалось извлечь полезное исключение:

"Ошибка аутентификации поставщика поддержки безопасности (SSPI). Возможно, сервер не запущен в учетной записи с идентификатором" host/[computer] ". Если сервер работает в учетной записи службы (например, Network Service), укажите учетную запись ServicePrincipalName как идентификатор в EndpointAddress для сервера. Если сервер работает в учетной записи пользователя, укажите учетную запись UserPrincipalName как идентификатор в EndpointAddress для сервера. "

Собирался начать выяснять, что это значит (например, здесь), но затем я изменил с учетной записи домена на флажок "локальная системная учетная запись" в services.msc, и все очень быстро.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню