我使用方法Do work创建了一个简单的WCF服务,该方法休眠15秒然后返回一个字符串。它是一个具有多个并发的Singleton服务。
客户端(.net桌面应用程序)的for循环为100以调用此函数。我想看看我可以同时处理多少个线程并提高性能。
我正在使用NetTCP绑定并添加了性能参数
服务器配置
<services>
<service name="WCFService.WCFService" behaviorConfiguration="mexbahaviour">
<endpoint address="WCFService" binding="netTcpBinding" contract="WCFService.IWCFService" ></endpoint>
<endpoint address="WCFService" binding="netNamedPipeBinding" contract="WCFService.IWCFService" ></endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" ></endpoint>
<host>
<baseAddresses>
<add baseAddress="http://localhost:8090/ "/>
<add baseAddress="net.tcp://localhost:8091/ "/>
<add baseAddress="net.pipe://localhost/ "/>
</baseAddresses>
</host>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="mexbahaviour">
<serviceMetadata httpGetEnabled="true" />
<serviceThrottling maxConcurrentCalls="300" maxConcurrentSessions="300"
maxConcurrentInstances="600" />
</behavior>
</serviceBehaviors>
</behaviors>
问题是请求没有足够快地命中服务器。初始秒有4个请求,但之后每秒有2个请求。 The output window on service looks like this.
因此,只要请求命中服务并记录接收时间并进入休眠状态,就会创建一个新线程。
我在客户端添加了连接管理部分
<connectionManagement>
<add address="*" maxconnection="100"/>
</connectionManagement>
是否因线程创建而延迟?或者我遇到的一些服务限制限制?
请提出我的建议。
我也尝试使用这篇有用的文章来实现 Boost WCF Performance
答案 0 :(得分:0)
我认为,这是基于线程池的基本策略。您可以按如下方式修改minThreads,
int worker, int io;
ThreadPool.GetMinThreads(out worker, out io);
ThreadPool.SetMinThreads(worker, 100 - io); // 100 is just sample value.