【问题标题】:WCF cannot reach 100% CPU. What is the bottleneck?WCF 无法达到 100% CPU。瓶颈是什么?
【发布时间】:2011-11-17 14:52:17
【问题描述】:

我正在对自托管 nettcp WCF 服务进行基准测试,从 50 个线程向不在同一台计算机上的服务发出请求。问题是至强 E3-1270 的 CPU 利用率从未超过 35%。当我在两核笔记本电脑上运行相同的测试时,它确实达到了 100%。

WCF 方法什么都不做,所以它不应该受到 IO 的限制。我试图增加线程数,但这无济于事。每个线程创建一个服务通道并重复使用该通道实例执行数千次调用。

这是我正在使用的服务类:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple)]
public class TestService : ITestService
{
    public void Void()
    {
        // DO NOTHING
    }
}

配置:

ServiceThrottlingBehavior: MaxConcurrentCalls = 1000 MaxConcurrentInstances = 1000, MaxConcurrentSessions = 1000

NetTcpBinding ListenBacklog = 2000 最大连接数 = 2000

【问题讨论】:

  • 如果你投入一些像return Enumerable.Range(1, 10000).Sum();这样的实际工作会发生什么?
  • 打开性能计数器 msdn.microsoft.com/en-us/library/ms735098.aspx 并使用 perfmon.exe 检查您的某些(限制/积压)设置是否达到上限。

标签: wcf performance


【解决方案1】:

我会尝试将您的 InstanceContextMode 更改为 PerCall。我很确定您当前的配置设置将被忽略,因为 WFC 只会创建您的类的单个实例并将按顺序处理它们。使用 PerCall 将为每个请求创建一个新实例,直到达到最大线程数或您的配置限制。您也不应该需要 netTcpBinding 设置,但要保持节流行为,但要确保比例正确,否则可能会产生不利影响。

  • MaxConcurrentCalls: 16 * 处理器计数
  • MaxConcurrentSessions: 100 * 处理器计数
  • MaxConcurrentInstance: Sum (116 * Processor Count)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多