gpt4 book ai didi

c# - WCF 每秒无法处理 1000 个调用

转载 作者:太空宇宙 更新时间:2023-11-03 13:06:01 25 4
gpt4 key购买 nike

我正在使用 nettcpbinding 开发托管在 Windows 服务中的 WCF 服务。

当我尝试对服务执行负载测试时,我构建了一个简单的客户端,它在一秒钟内调用该服务大约 1000 次,从服务返回一开始大约需要 2 到 8 秒,然后让简单的客户端运行大约返回结果时间增加半小时,部分客户端发送超时异常,配置为2分钟。

我修改了服务节流配置是这样的

这些是我尝试执行的步骤:

  1. 修改服务节流配置

    <serviceThrottling maxConcurrentCalls="2147483647" maxConcurrentInstances="2147483647" maxConcurrentSessions="2147483647"/>

  2. 在 Windows 7 机器上工作,所以我转移到服务器 2008,但结果相同。
  3. 将 tcp 绑定(bind)的配置更新为如下所示NetTcpBinding baseBinding = new NetTcpBinding(SecurityMode.None, true); baseBinding.MaxBufferSize = int.MaxValue;

            baseBinding.MaxConnections = int.MaxValue;
    baseBinding.ListenBacklog = int.MaxValue;
    baseBinding.MaxBufferPoolSize = long.MaxValue;

    baseBinding.TransferMode = TransferMode.Buffered;
    baseBinding.MaxReceivedMessageSize = int.MaxValue;
    baseBinding.PortSharingEnabled = true;
    baseBinding.ReaderQuotas.MaxDepth = int.MaxValue;
    baseBinding.ReaderQuotas.MaxStringContentLength = int.MaxValue;
    baseBinding.ReaderQuotas.MaxArrayLength = int.MaxValue;
    baseBinding.ReaderQuotas.MaxBytesPerRead = int.MaxValue;
    baseBinding.ReaderQuotas.MaxNameTableCharCount = int.MaxValue;
    baseBinding.ReliableSession.Enabled = true;
    baseBinding.ReliableSession.Ordered = true;
    baseBinding.ReliableSession.InactivityTimeout = new TimeSpan(23, 23, 59, 59);


    BindingElementCollection elements = baseBinding.CreateBindingElements();
    ReliableSessionBindingElement reliableSessionElement = elements.Find<ReliableSessionBindingElement>();
    if (reliableSessionElement != null)
    {
    reliableSessionElement.MaxPendingChannels = 128;



    TcpTransportBindingElement transport = elements.Find<TcpTransportBindingElement>();

    transport.ConnectionPoolSettings.MaxOutboundConnectionsPerEndpoint = 1000;

    CustomBinding newBinding = new CustomBinding(elements);
    newBinding.CloseTimeout = new TimeSpan(0,20,9);
    newBinding.OpenTimeout = new TimeSpan(0,25,0);
    newBinding.ReceiveTimeout = new TimeSpan(23,23,59,59);
    newBinding.SendTimeout = new TimeSpan(0,20,0);
    newBinding.Name = "netTcpServiceBinding";

    return newBinding;
    }
    else
    {
    throw new Exception("the base binding does not " +
    "have ReliableSessionBindingElement");
    }
  4. 将我的服务功能更改为使用异步和等待

    public async Task<ReturnObj> Connect(ClientInfo clientInfo)
    {
    var task = Task.Factory.StartNew(() =>
    {
    // do the needed work
    // insert into database
    // query some table to return information to client
    });


    var res = await task;
    return res;
    }

    并更新客户端以在其对服务的调用中使用异步和等待。

  5. 应用了此链接中提出的工作线程解决方案 https://support.microsoft.com/en-us/kb/2538826尽管我使用的是 .net 4.5.1,并将 MinThreads 设置为 1000 worker 和 1000 IOCP

在所有这一切之后,服务开始处理更多的请求,但延迟仍然存在,简单的客户端需要大约 4 个小时才能超时

奇怪的是,我发现服务在 100 毫秒内处理了大约 8 到 16 个调用,这与服务中当前事件的线程数有关。

我发现很多文章都在谈论需要放置在 machine.config 和 Aspnet.config 中的配置,我认为这与我的情况无关,因为我在 Windows 服务而不是 IIS 上使用 nettcp,但我已经实现了这些变化,发现结果没有变化。

有人能告诉我我缺少什么或者我想从服务中得到它不支持的东西吗?

最佳答案

这可能是您的测试客户端的编写方式。使用 NetTcp,当您创建一个 channel 时,它会尝试从空闲连接池中获取一个。如果它是空的,那么它会打开一个新的套接字连接。当您关闭客户端 channel 时,它会返回到空闲连接池。空闲连接池的默认大小是 10,这意味着一旦空闲池中有 10 个连接,任何后续的关闭都会实际关闭 TCP 套接字。如果您的测试代码正在快速创建和处理 channel ,您可能会丢弃池中的连接。然后,您可能会遇到处于 TIME_WAIT 状态的套接字过多的问题。
Here是一篇描述如何修改池行为的博客文章。

关于c# - WCF 每秒无法处理 1000 个调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30783803/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com