看到一个问题,说如何保持5000-10000+的健壮的socket服务。windows
初学者确定是会把每一个链接都开一个线程来监听。这很浪费资源服务器
一般只会(动态地)占用几个线程就能保持3000个长链接会话了。
“为每一个监听对象开一个新的线程”这是设计错误。你可使用NetworkStream的异步Read,在没有消息的时候无需阻塞在什么线程里。多线程
据不一样的操做系统,多线程的约束条件也不一样。当你发现工做线程超过1000个,或者IOCP(IO完成端口)线程超过800个,就应该赶忙断掉服务器进行维护了。
首先要有一个意识,使用几个、十几个线程就足以应付上千个普通业务链接了。
有人说“若是我要保持1000个客户端链接,就得开1001个线程来接收数据”,这纯粹是瞎扯。请必定要注意。异步
我说的“工做线程”是指你的进程中使用的工做线程总数,而不是只windows的。socket
在你的windows中,总线程数超过1500个是常常有的事情。你能够打开你的进程管理器看看cpu的指标,看看当前有多少线程在切换使用。极可能超过1500个。可是能够监视每个单个的进程,看看它的线程数,一般只有10个左右(只有System线程数会有100多)。
而你的服务器进程,工做线程数不该该过高。日常只有十几个线程足以应对几千客户端了。操作系统