繁体   English   中英

异步线程tcp服务器

[英]Async threaded tcp server

我想用C#创建一个高性能服务器,可能需要大约10万个客户端。 现在我开始用C#编写TcpServer,并为每个客户端连接打开一个新线程。 我还使用一个线程来接受连接。 到目前为止这么好,工作正常。

服务器必须反序列化AMF传入对象做一些逻辑(比如保存播放器的位置)并发回一些对象(序列化对象)。 我并不担心序列化/反序列化部分atm。

我主要担心的是,我将拥有10k个客户端的大量线程,而且我已经读过某个操作系统只能保持几个hunderd线程的地方。

有没有关于编写体面的异步线程服务器的资料/文章? 还有其他可能性还是10k线程可以正常工作? 我看过谷歌,但我找不到很多关于设计模式或清楚解释的方法的信息

你会遇到很多问题。

  1. 出于几个原因,您无法启动10,000个线程。 它会破坏内核调度程序。 如果您运行的是32位,则默认堆栈地址空间为1MB意味着10k线程将保留大约10GB的地址空间。 那会失败。

  2. 您也不能使用简单的选择系统。 在它的核心,选择是O(N)的插座数量。 有10k插座,这很糟糕。

  3. 您可以使用IO完成端口。 这是他们设计的场景。 据我所知,没有稳定的托管IO完成端口库。 您必须使用P / Invoke或Managed C ++编写自己的代码。 玩得开心。

编写高效多线程服务器的方法是使用I / O完成端口(每个请求使用一个线程是非常低效的,如@Marcelo所提到的)。

如果您使用.NET套接字类的异步版本,则可以免费获得。 请参阅此问题 ,其中包含指向文档的内容。

你绝对不希望每个请求都有一个帖子。 即使您拥有较少的客户端,创建和销毁线程的开销也会削弱服务器,并且您无法获得10,000个线程; 操作系统调度程序很久就会死于可怕的死亡。

网上有很多关于C#中异步服务器编程的文章(例如, 这里 )。 只是google一下。

您想要研究使用IO完成端口 您基本上有一个线程池和一个IO操作队列。

I / O完成端口提供了一种有效的线程模型,用于处理多处理器系统上的多个异步I / O请求。 当进程创建I / O完成端口时,系统会为请求创建关联的队列对象,这些请求的唯一目的是为这些请求提供服务。 处理许多并发异步I / O请求的进程可以通过将I / O完成端口与预分配的线程池结合使用,而不是在接收I / O请求时创建线程,从而更快速有效地执行此操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM