如何增加 .NET Remoting over TCP 使用的线程数?
Posted
技术标签:
【中文标题】如何增加 .NET Remoting over TCP 使用的线程数?【英文标题】:How do you increase the number of threads used by .NET Remoting over TCP? 【发布时间】:2015-06-09 01:37:35 【问题描述】:我们正在尝试增加 .NET Remoting over TCP 使用的线程数。我们已经尝试更改 ThreadPool.SetMinThreads,但我们的压力测试表明 .NET Remoting 只能处理大约 100 个并发请求。 (但这不是硬性限制)。在任务管理器中,我们可以看到我们的 Remoting Server 进程线程数从 11 增长到大约 80,然后在压力测试后又下降到 11。我们正在运行一个 ASP.NET 4.0 应用程序。
【问题讨论】:
我有几个问题。 1. 你使用什么样的远程对象? Singleton,SingleCall,客户端或服务器激活? 2. 我不确定我是否理解正确。线程数下降对您来说是个问题吗? 3. 你的机器有多少个处理器/内核? 4. 你使用 IIS 来托管远程对象,我说得对吗? 5. 为什么要拥有这么多线程?您想提高性能吗? 单呼。客户端激活。 16 核。 IIS 托管远程客户端。 Windows 服务托管远程服务器。我们希望提高性能,因为我们注意到我们一次只能通过远程管道挤压 100 个请求(即使这些请求在另一端只执行 Thread.Sleep)。 我想再问两件事。 1. 我在远程服务器上使用ThreadPool.SetMinThread
对吗? 2. 你是如何进行压力测试的?我想知道对服务器的请求是从托管在 IIS 上的远程客户端发送的,还是从不在 IIS 上托管的另一个应用程序发送的?
1) 是的。 2)我们创建了一个简单地休眠十秒钟的远程服务器方法。然后,我们使用具有 1000 个并发线程的 Apache Bench 从远程客户端调用此方法(因此 IIS 是远程客户端)。
【参考方案1】:
总结一下。远程服务器由 Windows 服务托管,远程客户端由 IIS 托管。为了执行压力测试,您使用调用远程服务器的远程客户端的 Apache Bench。您观察到远程服务器处理的并发请求不超过 100 个,尽管您增加了远程服务器上线程池中的最大线程数。
如果我说的都是真的,我认为这里缺少一件事,即 IIS 也有可用于处理请求的线程限制。您可以从 Apache Bench 向远程客户端发送 1000 个请求,但只能同时处理其中的 100 个请求。我怀疑这可能是一个原因。
为了增加 IIS 的线程数,我建议您尝试:
检查配置(见question)。 尝试在 IIS 上使用SetMinThreads
。
我的最后一条评论是,您必须记住,线程池中的线程数太少或太高都不好。这两种情况都会影响性能。
【讨论】:
【参考方案2】:你确定瓶颈是线程,而不是网络连接..?默认情况下,.net 每个远程 IP 的可用套接字数量相当有限。这适用于远程处理、http(WCF、Web 服务客户端)等。
如果这是您所看到的,您可以在应用程序 config/web.config 中的 system.net/connectionManagement 下覆盖它,例如:
<configuration>
...
<system.net>
<connectionManagement>
<add address="*" maxconnection="1000"/>
</connectionManagement>
</system.net>
可以在此处找到有关该配置设置的更多详细信息:https://msdn.microsoft.com/en-us/library/fb6y0fyc%28v=vs.110%29.aspx
【讨论】:
【参考方案3】:检查 SetMinThreads 的返回值。
如果您指定负数或大于活动线程池线程的最大数量(使用 GetMaxThreads 获得),SetMinThreads 将返回 false,并且不会更改任何一个最小值。 (link)
【讨论】:
是的,我们已经尝试过了,我们得到的返回值为 true。之后我们还调用了 GetMinThreads 以确认我们将最小线程设置为我们预期的值。看来远程处理实际上并没有使用 ThreadPool 来管理其线程......以上是关于如何增加 .NET Remoting over TCP 使用的线程数?的主要内容,如果未能解决你的问题,请参考以下文章
如何唤醒和启用 .NET Remoting 服务器的客户端以异步获取数据?
asp。net 中的B/S项目中Remoting的应用?ASP.NET B/S项目中能做成有的状态?
在 IIS 7.5 中托管的 .Net Remoting 服务中,如何删除“Server : IIS/7.5”标记表单响应头