Память и утечки в моем сервисе - PullRequest
3 голосов
/ 30 сентября 2011

У меня есть ServiceHost в сервисном приложении, которое обменивается данными с 1700 клиентами каждые 60 секунд.Когда я запускаю службу, она почти сразу достигает 1500 открытых дескрипторов, а затем продолжает добавлять еще 300 через 5 минут (и продолжает непрерывно после этого.)

Я посмотрел на ProcessExplorer и в SplitПо его мнению, он показывает сотни дескрипторов типа File с именем «Device \ Afd», который является представителем сокета TCP, используемого для связи (я полагаю).

Я только предполагаю, что утечка моего дескриптора связана с ServiceHost, поскольку она представляет наибольшее количество дескрипторов, наблюдаемых в Process Explorer.Мне интересно, почему служба не закрывает их?Нужно ли устанавливать какое-то время ожидания или мне нужно где-нибудь самостоятельно активно их закрывать?

Вот как создается мой ServiceHost:

wcfObject = new WcfObject();
host = new ServiceHost(wcfObject, baseWcfAddress);

ServiceBehaviorAttribute attribute = (ServiceBehaviorAttribute)host.Description.Behaviors[typeof(ServiceBehaviorAttribute)];
attribute.ConcurrencyMode = ConcurrencyMode.Multiple;
attribute.InstanceContextMode = InstanceContextMode.Single;

И в моем app.config:

<?xml version="1.0"?>
<configuration>
  <system.serviceModel>
    <services>
      <service name="WcfObject" behaviorConfiguration="DefaultBehavior">
        <host>
          <baseAddresses >
            <!-- Defined in code -->
          </baseAddresses>
        </host>
        <endpoint name="NetTcpEndPoint" address="" binding="netTcpBinding" bindingConfiguration="netTcpBinding" contract="IWcfObject"/>
        <endpoint name="NetTcpMetadataPoint" address="mex" binding="mexTcpBinding" contract="IMetadataExchange"/>
      </service>
    </services>
    <bindings>
      <netTcpBinding>
        <binding name="netTcpBinding" maxReceivedMessageSize="9655360" maxBufferSize="9655360" maxBufferPoolSize="524288">
          <readerQuotas maxArrayLength = "932000" maxStringContentLength="900000" maxDepth="32"/>
          <security mode="None"></security>
        </binding>
      </netTcpBinding>
    </bindings>
    <behaviors>
      <serviceBehaviors>
        <behavior name="DefaultBehavior" >
          <serviceMetadata httpGetEnabled="False" httpGetUrl="" />
          <serviceDebug includeExceptionDetailInFaults="True"/>
          <serviceThrottling maxConcurrentCalls="50" maxConcurrentSessions="100" />          
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

Ответы [ 2 ]

0 голосов
/ 12 октября 2011

Как выяснилось, я запускал свой сервис из [STAThread] - всякий раз, когда приложение использует COM-вызовы, вы можете потерять память, если не используете режим [MTAThread].

0 голосов
/ 01 октября 2011

Я думаю, что ваша конкретная проблема описана здесь .

Когда канал создан и контекст операции существует, каждый новый экземпляр канала добавляется в список WmiChannels(см. свойство InstanceContext.WmiChannels в коде ниже).Этот список вызывает утечку.Однако, если InstanceContext воссоздается при каждом вызове операции (то есть, когда InstanceContextMode установлен на PerCall), список будет воссоздан, и утечка не будет вызвана.сообщение.Пожалуйста, держите нас в курсе ваших выводов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...