【发布时间】:2011-03-13 09:39:40
【问题描述】:
我最近阅读了很多关于线程的文章,因为我正在寻求开发一个高性能、可扩展的 TCP 服务器,能够处理多达 10,000-20,000 个客户端,其中每个客户端始终与服务器进行双向通信基于命令的系统。服务器将接收命令,并根据命令执行单个(或多个)任务。我的问题是如何在各种情况下适当地使用 .NET 线程构造,执行可能需要一分钟到几个小时的任务,具体取决于正在执行的工作。
最让我困惑的是,在我阅读的任何地方,我都会看到类似“使用手动创建的线程(或自定义线程池)来处理‘长时间运行’的任务,并使用 TPL 来处理短期任务,或需要并行处理的任务。”究竟什么是 一项长期运行的任务?那是 5 秒、60 秒还是一个小时?
我应该在什么时间范围内使用这三种创建线程的方法:
- 手动创建的线程
- .NET 线程池类
- TPL
我考虑过的另一个问题如下——假设我的服务器实际上连接了 20,000 个客户端,每个客户端每秒发送 1 个命令(可以转换为一个或多个任务)。即使拥有强大的硬件,我是否有可能将过高的工作负载推入我拥有的任何线程池/工作项队列,从而最终在队列慢慢填满到最大值后生成 OutOfMemoryException?
任何见解将不胜感激。
【问题讨论】:
-
平均而言,处理每个命令需要多长时间?
-
就是这样——真的不知道命令需要多长时间才能完成。我觉得我已经收到了足够的信息来制定相应的计划。当然,20,000 个客户是一个很长的目标(5,000 个更像它),但如果有必要,我希望在未来做好扩大规模的准备。谢谢大家的回复。
-
@slashp 长时间运行意味着“超过几百毫秒”,即。会破坏您的其他工作(并为处理带来显着延迟)的东西。例如,如果您的目标是 5 毫秒延迟,即使 1 毫秒也可以被认为是“长时间运行”:D 另外,我想指出 20k TCP 客户端正在接近实际限制 - 每个 TCP 连接都需要一个单独的端口,而你只有 65535 个 maximum - 而且它们在关闭后可以存活大约 4 分钟。您可能不得不考虑横向扩展(更多服务器)而不是纵向扩展(每台服务器更多连接)。
标签: c# multithreading c#-4.0 threadpool