求TCP长连接高并发解决方案,该如何处理

求TCP长连接高并发解决方案
本人为一家GPS汽车定位公司开发在线定位系统,GPS终端通过GPRS连接服务器的某个端口来发送和接收数据,目前采用的是TCPListener,为每个GPS连接开一个新的线程来收发数据,GPS终端每3分钟发一次心跳包来保持在线,GPS可以主动发送数据给服务器,服务器也可以主动发数据给GPS,因此必须要保持长连接。目前运行一段时间发现,最大只能保持2000~3000个GPS终端连接,再多就会提示10061服务器拒绝连接错误了。目前无论是同步还是异步、线程池都试过,都无法超过3000个连接,已经排除是带宽和服务器配置问题,服务器目前在机房托管,10M光纤独享,服务器双CPU,16G内存。我看网上有人做到过5000个甚至10000个同时保持在线连接不断开,求大神们给点建议,如何能提高并发性能?
------解决思路----------------------
通常只会(动态地)占用几个线程就能保持3000个长连接会话了。

“为每个GPS连接开一个新的线程”这是设计错误。你可以使用NetworkStream的异步Read,在没有消息的时候无需阻塞在什么线程里。
------解决思路----------------------
引用:
大神,用异步接收的话可以,但服务器如果要主动发消息给客户端怎么办?异步发送的时候,如何能找到对应的客户端?怎么知道服务器要连接的客户端是否在线?

心跳包呀。。就算TCP长连接也要用到心跳包。因为有些路邮断了服务端还会以为客户端连着。
所以要每隔一定的时间向服务端发一个心跳包。服务端一定时间内没收到客户端的包就认断开。
------解决思路----------------------
引用:
大神,用异步接收的话可以,但服务器如果要主动发消息给客户端怎么办?异步发送的时候,如何能找到对应的客户端?怎么知道服务器要连接的客户端是否在线?


找个 List or Dictionary 保存下来就是了嘛。每个 Socket 有不同的 Socket.Handle。
------解决思路----------------------
sp1234  的观点是对的,不需要那么多的线程,线程多了,本身对系统而言就是负担.


如果你用.net 开发,你可以使用  supersocket 这个是我目前开发比较全面的, 或者用一个较 fastsocket的,也不错(相关更轻一点).

.net的soket的开源库好像不是很多.. 前面两个是我找到最好的了.

另外,对于IO密集型的处理,一定要使用异步处理,否则迟早有伸缩性问题。