TCPListener最多支持多少个长连接

KevinGao1980 2013-12-26 10:58:32
本人为一家GPS汽车定位公司开发在线定位系统,GPS终端通过GPRS连接服务器的某个端口来发送和接收数据,目前采用的是TCPListener,为每个GPS连接开一个新的线程来收发数据,GPS终端每3分钟发一次心跳包来保持在线,GPS可以主动发送数据给服务器,服务器也可以主动发数据给GPS,因此必须要保持长连接。目前运行一段时间发现,最大只能保持2000~3000个GPS终端连接,再多就会提示10061服务器拒绝连接错误了。目前无论是同步还是异步、线程池都试过,都无法超过3000个连接,已经排除是带宽和服务器配置问题,服务器目前在机房托管,10M光纤独享,服务器双CPU,16G内存。我看网上有人做到过5000个甚至10000个同时保持在线连接不断开,求大神们给点建议,如何能提高并发性能?
...全文
755 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
例如一个终端分别非服务器发送了消息 --> 例如一个终端分别向服务器发送了消息 当你的服务器端不但是异步接收消息,而且解析出消息之后异步执行(执行是异步的,那么返回消息给客户端自然也是使用执行线程,因此也是异步的),那么你的服务器就不会等着执行完毕才继续接收下面的消息,而是不等执行完毕就立刻继续接收下面的消息,那么自然就能让你的服务器充分被利用起来。
  • 打赏
  • 举报
回复
异步的Receive消息是收到消息时才会(系统自动从系统线程池中)分配线程处理,而并不是让一个线程“死循环、阻塞”在那里。 打个比方,假设沃尔玛超市只有20台收银机工作,可是实际上卖场里有3000名顾客(而不是只能有20名顾客)。 异步操作自然会很干净,写出来的代码也很精简。 另外,一个很关键的是,是服务器处理长连接消息也应该是多线程的。例如一个终端分别非服务器发送了消息1、2、3、4、5,服务器每当解析出一个消息则都会并发处理,最终以顺序3、2、1、4、5返回了回答,你的客户端应该可以处理。如果你这个也搞不定(你只会顺序处理),那么自然就会慢了。
  • 打赏
  • 举报
回复
同行啊,貌似 操作系统默认握手的端口有限制。改下试试看。
qldsrx 2013-12-26
  • 打赏
  • 举报
回复
对于你的情况,可以考虑使用UDP来处理,UDP速度快,不需要保持连接,开销也少。 另外既然你有心跳包,不如考虑将此改造为轮询服务器,那样也不需要保持长连接了。
qldsrx 2013-12-26
  • 打赏
  • 举报
回复
理论上连接数可以达到int类型的最大值,实际得看你的设备好坏。并发是使用多线程的,连接数不等于并发,并发数过多时可以排队处理,线程池处理请求自动维护线程数量。
KevinGao1980 2013-12-26
  • 打赏
  • 举报
回复
引用 2 楼 wyd1520 的回复:
,为每个GPS连接开一个新的线程来收发数据....3000个。。。你就开了3000个线程。。太牛了。 你看到5000个甚至10000知道人家人了多少个线程么。只用了5+1个就够了。 一个是用来处理客户端连接的,5个是用来处理所有的数据包接收与发送的。 http://www.ikende.com/Product/beetle 看这个吧也可以的好像有提供原码。 我自己写的服务端10000个不成问题
那5个线程是怎么实现保持连接不断开呢?你是说GPS发完数据立即断开连接吗?但因为服务要主动控制GPS,会主动发数据给GPS,如果连接断开了就发不出去了,所以一定要保持连接。能讲一下具体实现的思路吗?
KevinGao1980 2013-12-26
  • 打赏
  • 举报
回复
引用 1 楼 rtdb 的回复:
1. 线程数太多了,换异步非线程吧 2. 查是不是系统连接数限制?
异步试过了,性能强不了多少,其实异步也是用多线程实现的,只不过优化的好些。 不是系统连接数限制,已经修改过还是一样。
本拉灯 2013-12-26
  • 打赏
  • 举报
回复
,为每个GPS连接开一个新的线程来收发数据....3000个。。。你就开了3000个线程。。太牛了。 你看到5000个甚至10000知道人家人了多少个线程么。只用了5+1个就够了。 一个是用来处理客户端连接的,5个是用来处理所有的数据包接收与发送的。 http://www.ikende.com/Product/beetle 看这个吧也可以的好像有提供原码。 我自己写的服务端10000个不成问题
rtdb 2013-12-26
  • 打赏
  • 举报
回复
1. 线程数太多了,换异步非线程吧 2. 查是不是系统连接数限制?
  • 打赏
  • 举报
回复
哥们,加个Q沟通下呗。!
飞小猪 2013-12-26
  • 打赏
  • 举报
回复
引用 13 楼 huanggreat 的回复:
[quote=引用 11 楼 xiaozhu39505 的回复:] [quote=引用 9 楼 huanggreat 的回复:] [quote=引用 8 楼 hubeigaofeng 的回复:] [quote=引用 7 楼 huanggreat 的回复:] 同行啊,貌似 操作系统默认握手的端口有限制。改下试试看。
请问你的最大能达到多少个连接呢?[/quote] 5000 多吧 差不多 server2003 也就这样了 基本枯竭。 现在准备做个 负载均衡。[/quote] 我不知道你是怎么弄的,我之前用过一个socket一个线程的方式,最大连接数受最大开启线程数影响,只能达到2000个左右,后来摒弃线程,改为socket异步接收,测试的并发能上万。 socket异步里面实现了完全端口,性能比同步强太多。[/quote] 因为我还不止是单纯的SOCKET 接收 还要用到数据库访问 , 跟 WEBrequest 等 去获取纠偏 和地址信息等,所以......[/quote] 你的其他需求跟提高socket并发链接数并不冲突。我之前做的采集程序也需要访问数据库的。 如果改成socket异步还不能满足性能需求,在考虑均衡负载吧
  • 打赏
  • 举报
回复
引用 11 楼 xiaozhu39505 的回复:
[quote=引用 9 楼 huanggreat 的回复:] [quote=引用 8 楼 hubeigaofeng 的回复:] [quote=引用 7 楼 huanggreat 的回复:] 同行啊,貌似 操作系统默认握手的端口有限制。改下试试看。
请问你的最大能达到多少个连接呢?[/quote] 5000 多吧 差不多 server2003 也就这样了 基本枯竭。 现在准备做个 负载均衡。[/quote] 我不知道你是怎么弄的,我之前用过一个socket一个线程的方式,最大连接数受最大开启线程数影响,只能达到2000个左右,后来摒弃线程,改为socket异步接收,测试的并发能上万。 socket异步里面实现了完全端口,性能比同步强太多。[/quote] 因为我还不止是单纯的SOCKET 接收 还要用到数据库访问 , 跟 WEBrequest 等 去获取纠偏 和地址信息等,所以......
  • 打赏
  • 举报
回复
推荐异步socket
飞小猪 2013-12-26
  • 打赏
  • 举报
回复
引用 9 楼 huanggreat 的回复:
[quote=引用 8 楼 hubeigaofeng 的回复:] [quote=引用 7 楼 huanggreat 的回复:] 同行啊,貌似 操作系统默认握手的端口有限制。改下试试看。
请问你的最大能达到多少个连接呢?[/quote] 5000 多吧 差不多 server2003 也就这样了 基本枯竭。 现在准备做个 负载均衡。[/quote] 我不知道你是怎么弄的,我之前用过一个socket一个线程的方式,最大连接数受最大开启线程数影响,只能达到2000个左右,后来摒弃线程,改为socket异步接收,测试的并发能上万。 socket异步里面实现了完全端口,性能比同步强太多。
showjim 2013-12-26
  • 打赏
  • 举报
回复
引用 3 楼 hubeigaofeng 的回复:
异步试过了,性能强不了多少,其实异步也是用多线程实现的,只不过优化的好些。 不是系统连接数限制,已经修改过还是一样。
异步是基于线程池队列处理的,与1对1的线程处理完全是两回事。
引用 4 楼 hubeigaofeng 的回复:
那5个线程是怎么实现保持连接不断开呢?你是说GPS发完数据立即断开连接吗?但因为服务要主动控制GPS,会主动发数据给GPS,如果连接断开了就发不出去了,所以一定要保持连接。能讲一下具体实现的思路吗?
对于异步模式,线程数与连接数或者链接状态是没有关系的。 服务器端程序逻辑可以是这样的: 1. 服务器接收新的请求,根据需求将socket保存到一个全局集合S中。 2. 如果需要接收处理客户端数据,调用BeginRecive;如果不需要忽略这一步。 当你需要向某个客户端发送数据,在集合S中取出需要的socket异步发送数据。数据发送完后如果还需要继续保持连接,再次将该socket保存到集合S中,否则释放它。 如果服务器端发送数据时间不可控,应该定时主动检测socket连接状态清理垃圾。
  • 打赏
  • 举报
回复
引用 8 楼 hubeigaofeng 的回复:
[quote=引用 7 楼 huanggreat 的回复:] 同行啊,貌似 操作系统默认握手的端口有限制。改下试试看。
请问你的最大能达到多少个连接呢?[/quote] 5000 多吧 差不多 server2003 也就这样了 基本枯竭。 现在准备做个 负载均衡。
KevinGao1980 2013-12-26
  • 打赏
  • 举报
回复
引用 7 楼 huanggreat 的回复:
同行啊,貌似 操作系统默认握手的端口有限制。改下试试看。
请问你的最大能达到多少个连接呢?

110,545

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧