请教长连接、高并发的问题

liqgulit 2017-08-14 05:14:19
各位大神,我现在需完成一个数据采集的工作,要求并发连接数在10000左右,通过tcp传输,都是长连接,现在采用一个点创建一个新的线程处理,结果到了1000个点左右的时候,服务端就出现死机情况,请问各位我怎么改进,想过线程池,不知线程池对长连接是否有效,谢谢!
...全文
866 34 打赏 收藏 转发到动态 举报
写回复
用AI写文章
34 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangyongchao880622 2017-08-17
  • 打赏
  • 举报
回复
建议可以用硬件(网络模块)做服务端,上位与网络模块做通讯。
ownding 2017-08-16
  • 打赏
  • 举报
回复
测试我的程序12000个TCP连接没有问题(可以更多,maxConnections设置),可以直接参考这个例子:
https://github.com/OwnDing/Async_Await_TCP_Server


上面链接你使用的时候,重新编译一下。不想编译直接bin文件下就有执行程序(该程序在tcp链接断开的时候,写入txt不能并发,建议取消掉这个功能,或者直接重新编译就可以了),程序使用的时候记得安装sqlite-netFx45-setup-bundle-x64-2012-1.0.105.2,程序会将信息写入sqlite的。

关于SocketAsyncEventArgs程序,也可以参考:
https://github.com/OwnDing/TCP_Server_APP
里面也有相应的程序。
xian_wwq 2017-08-15
  • 打赏
  • 举报
回复
引用 22 楼 liqgulit 的回复:
[quote=引用 19 楼 xian_wwq 的回复:] [quote=引用 楼主 liqgulit 的回复:] 各位大神,我现在需完成一个数据采集的工作,要求并发连接数在10000左右,通过tcp传输,都是长连接,现在采用一个点创建一个新的线程处理,结果到了1000个点左右的时候,服务端就出现死机情况,请问各位我怎么改进,想过线程池,不知线程池对长连接是否有效,谢谢!
只看描述,是看不出描述的 建议楼主把问题拆分简化下 1.先说通讯模块,SocketAsyncEventArgs类是必备,在windows平台iocp是首选。 否则网络通信很快就到瓶颈了。 可以把后期的业务处理统统屏蔽掉,只测网络模块,如果业务去掉,还是出现死机,那就继续在通信模块进行排雷 如果业务去掉,不死机,那么通信模块通过,重点测业务处理。 2.出现死机,比较大的方面: 可能系统资源耗尽,需要自行查找内存泄漏、句柄泄漏等问题; 也可能内存碎片太多,系统无可用资源,对象分配就得引入“对象池” 3.一个客户端一个线程额模型少量还能应付,上了规模肯定不行 按一个线程消耗1M资源来算,10000用户占用多少,可以估算出来的。 4.长连接是否必要?如果更新频率在分钟级或者几十秒级,个人感觉真的不需要长连接。 [/quote] 查过内存、cpu占用情况,1000+连接是,并不高。但就是服务端的接收程序掉了。后续的客户端连接服务器无反应。不过通信模块我没有使用SocketAsyncEventArgs,msdn中也没找到。您能提供吗?[/quote] 不是很难找呀 http://blog.csdn.net/luyikk/article/details/5081133 https://msdn.microsoft.com/zh-cn/library/system.net.sockets.socketasynceventargs.aspx
caomy0320 2017-08-15
  • 打赏
  • 举报
回复
Windows系统可以考虑IOCP,或者直接用HP-Socket这个类库也行 Linux系统可以用libevent
caomy0320 2017-08-15
  • 打赏
  • 举报
回复
可以考虑用libevent类库,
threenewbee 2017-08-15
  • 打赏
  • 举报
回复
这个并发量单机怎么搞也不行,得群集。
倒退一天 2017-08-15
  • 打赏
  • 举报
回复
如果只是挂载连接数10000,而并不是10000个连接同时发包或者发包很频繁,就如楼主所说是应用在物联网上,我想我这有一现成的服务端框架代码,应该可以满足你的要求,只需做一下适当的调整就行了。如果需要,可以私信我留下邮箱
liqgulit 2017-08-15
  • 打赏
  • 举报
回复
引用 18 楼 diaodiaop 的回复:
可能你的理解存在误区.. 就比如你下面这句话.
引用
要求并发连接数在10000左右
并发是并发 连接是连接. .. 他们其实不太一样.. 比如你用网上的.net的框架 来实现tcp server 是可以达到几万"连接"的.. 但是并不是说这几万连接瞬间给你发数据 你能处理过来. 所以你现在还没有找到你所谓的问题; 是连接到了1000后代码挂掉了?还是1000个同时发送数据挂掉了? 对于你现在遇到的问题 显然是前者.. 而且你自己说 连接到了1000就死了..现在还根本没有设计到"数据接收" 不是吗? 什么上报数据 连接数据库 那都是后话... 所以我猜你现在是使用那种while true 里面new thread的代码.. 我说的对吗?
我感觉应该是连接到了1000+就死了,因为后续客户端无法接入。如果不用while true 里面new thread的代码,应该如何实现?请赐教?谢谢!
liqgulit 2017-08-15
  • 打赏
  • 举报
回复
引用 19 楼 xian_wwq 的回复:
[quote=引用 楼主 liqgulit 的回复:] 各位大神,我现在需完成一个数据采集的工作,要求并发连接数在10000左右,通过tcp传输,都是长连接,现在采用一个点创建一个新的线程处理,结果到了1000个点左右的时候,服务端就出现死机情况,请问各位我怎么改进,想过线程池,不知线程池对长连接是否有效,谢谢!
只看描述,是看不出描述的 建议楼主把问题拆分简化下 1.先说通讯模块,SocketAsyncEventArgs类是必备,在windows平台iocp是首选。 否则网络通信很快就到瓶颈了。 可以把后期的业务处理统统屏蔽掉,只测网络模块,如果业务去掉,还是出现死机,那就继续在通信模块进行排雷 如果业务去掉,不死机,那么通信模块通过,重点测业务处理。 2.出现死机,比较大的方面: 可能系统资源耗尽,需要自行查找内存泄漏、句柄泄漏等问题; 也可能内存碎片太多,系统无可用资源,对象分配就得引入“对象池” 3.一个客户端一个线程额模型少量还能应付,上了规模肯定不行 按一个线程消耗1M资源来算,10000用户占用多少,可以估算出来的。 4.长连接是否必要?如果更新频率在分钟级或者几十秒级,个人感觉真的不需要长连接。 [/quote] 查过内存、cpu占用情况,1000+连接是,并不高。但就是服务端的接收程序掉了。后续的客户端连接服务器无反应。不过通信模块我没有使用SocketAsyncEventArgs,msdn中也没找到。您能提供吗?
liqgulit 2017-08-15
  • 打赏
  • 举报
回复
引用 18 楼 diaodiaop 的回复:
可能你的理解存在误区.. 就比如你下面这句话.
引用
要求并发连接数在10000左右
并发是并发 连接是连接. .. 他们其实不太一样.. 比如你用网上的.net的框架 来实现tcp server 是可以达到几万"连接"的.. 但是并不是说这几万连接瞬间给你发数据 你能处理过来. 所以你现在还没有找到你所谓的问题; 是连接到了1000后代码挂掉了?还是1000个同时发送数据挂掉了? 对于你现在遇到的问题 显然是前者.. 而且你自己说 连接到了1000就死了..现在还根本没有设计到"数据接收" 不是吗? 什么上报数据 连接数据库 那都是后话... 所以我猜你现在是使用那种while true 里面new thread的代码.. 我说的对吗?
是的。
xian_wwq 2017-08-15
  • 打赏
  • 举报
回复
更正: 只看描述,是看不出描述的 -> 只看描述,是看不出问题的
xian_wwq 2017-08-15
  • 打赏
  • 举报
回复
引用 楼主 liqgulit 的回复:
各位大神,我现在需完成一个数据采集的工作,要求并发连接数在10000左右,通过tcp传输,都是长连接,现在采用一个点创建一个新的线程处理,结果到了1000个点左右的时候,服务端就出现死机情况,请问各位我怎么改进,想过线程池,不知线程池对长连接是否有效,谢谢!
只看描述,是看不出描述的 建议楼主把问题拆分简化下 1.先说通讯模块,SocketAsyncEventArgs类是必备,在windows平台iocp是首选。 否则网络通信很快就到瓶颈了。 可以把后期的业务处理统统屏蔽掉,只测网络模块,如果业务去掉,还是出现死机,那就继续在通信模块进行排雷 如果业务去掉,不死机,那么通信模块通过,重点测业务处理。 2.出现死机,比较大的方面: 可能系统资源耗尽,需要自行查找内存泄漏、句柄泄漏等问题; 也可能内存碎片太多,系统无可用资源,对象分配就得引入“对象池” 3.一个客户端一个线程额模型少量还能应付,上了规模肯定不行 按一个线程消耗1M资源来算,10000用户占用多少,可以估算出来的。 4.长连接是否必要?如果更新频率在分钟级或者几十秒级,个人感觉真的不需要长连接。
by_封爱 版主 2017-08-15
  • 打赏
  • 举报
回复
可能你的理解存在误区.. 就比如你下面这句话.
引用
要求并发连接数在10000左右
并发是并发 连接是连接. .. 他们其实不太一样.. 比如你用网上的.net的框架 来实现tcp server 是可以达到几万"连接"的.. 但是并不是说这几万连接瞬间给你发数据 你能处理过来. 所以你现在还没有找到你所谓的问题; 是连接到了1000后代码挂掉了?还是1000个同时发送数据挂掉了? 对于你现在遇到的问题 显然是前者.. 而且你自己说 连接到了1000就死了..现在还根本没有设计到"数据接收" 不是吗? 什么上报数据 连接数据库 那都是后话... 所以我猜你现在是使用那种while true 里面new thread的代码.. 我说的对吗?
闭包客 2017-08-15
  • 打赏
  • 举报
回复
引用 14 楼 liqgulit 的回复:
[quote=引用 13 楼 closurer 的回复:] [quote=引用 9 楼 liqgulit 的回复:] [quote=引用 5 楼 closurer 的回复:] 看上去是你把别人的网站爬挂了啊。
不是,物联网数据采集,传感器数据上传,数据量不大,点多。[/quote] 哦,原来如此。你要找到性能的瓶颈,是网络连接的部分,还是数据存储的部分等等。 我说一下线程池。线程池是解决反复创建,终止线程的问题的,把创建好的线程放到“池”里面供随时使用。编程中,所有的【池】的概念都是解决资源反复创建和回收的问题的。 如果你的线程没有反复创建和终止的操作,那么使用线程池的作用是不大的。反之则非常有用。 [/quote] 谢谢,现在是当tcp连接超过1000时,客户端就连接不上服务器了,所以感觉应该是网络问题,这个怎么解决呀,请指教![/quote] 我对物联网的编程并不太了解,抱歉,不过从你现在提供的信息来看,并不能确认性能瓶颈在哪里。
正怒月神 2017-08-15
  • 打赏
  • 举报
回复
引用 14 楼 liqgulit 的回复:
谢谢,现在是当tcp连接超过1000时,客户端就连接不上服务器了,所以感觉应该是网络问题,这个怎么解决呀,请指教!
至于连接不上客户端,那需要看你设置的数据库连接池最大值。 或者很多连接加起来导致服务器连接满了?也可能是网络问题
正怒月神 2017-08-15
  • 打赏
  • 举报
回复
引用 12 楼 liqgulit 的回复:
因为,各个传感器数据开始传输后,客户端那边要求一直建立连接。
只要你短时间内不关闭connection,并且一直有传递数据,那么自然就是长连接了。 最简单的长连接就是 类似于下面这样。占着连接不放,不close进入连接池。
using (SqlConnection conn = new SqlConnection("server=.;database=TestUserData;uid=sa;pwd=sasa;"))
            {
                conn.Open();
                for (int i = 0; i < 100; i++)
                {
                    SqlCommand cmd = new SqlCommand(string.Format("insert into U1 Values('hello',{0},{1})",i,2*i), conn);
                    cmd.ExecuteNonQuery();
                    Thread.Sleep(2000);
                }
                conn.Close();
            }
liqgulit 2017-08-15
  • 打赏
  • 举报
回复
引用 13 楼 closurer 的回复:
[quote=引用 9 楼 liqgulit 的回复:] [quote=引用 5 楼 closurer 的回复:] 看上去是你把别人的网站爬挂了啊。
不是,物联网数据采集,传感器数据上传,数据量不大,点多。[/quote] 哦,原来如此。你要找到性能的瓶颈,是网络连接的部分,还是数据存储的部分等等。 我说一下线程池。线程池是解决反复创建,终止线程的问题的,把创建好的线程放到“池”里面供随时使用。编程中,所有的【池】的概念都是解决资源反复创建和回收的问题的。 如果你的线程没有反复创建和终止的操作,那么使用线程池的作用是不大的。反之则非常有用。 [/quote] 谢谢,现在是当tcp连接超过1000时,客户端就连接不上服务器了,所以感觉应该是网络问题,这个怎么解决呀,请指教!
闭包客 2017-08-15
  • 打赏
  • 举报
回复
引用 9 楼 liqgulit 的回复:
[quote=引用 5 楼 closurer 的回复:] 看上去是你把别人的网站爬挂了啊。
不是,物联网数据采集,传感器数据上传,数据量不大,点多。[/quote] 哦,原来如此。你要找到性能的瓶颈,是网络连接的部分,还是数据存储的部分等等。 我说一下线程池。线程池是解决反复创建,终止线程的问题的,把创建好的线程放到“池”里面供随时使用。编程中,所有的【池】的概念都是解决资源反复创建和回收的问题的。 如果你的线程没有反复创建和终止的操作,那么使用线程池的作用是不大的。反之则非常有用。
liqgulit 2017-08-15
  • 打赏
  • 举报
回复
引用 11 楼 hanjun0612 的回复:
我现在是每个新连接,就新建一个线程,SQL也在线程中,异步怎么实现长连接的高并发,请指教。 sql也有数据库连接池,他也是有数量限制的。而且为何你要长连接呢?1000个线程的长连接?
因为,各个传感器数据开始传输后,客户端那边要求一直建立连接。
正怒月神 2017-08-15
  • 打赏
  • 举报
回复
我现在是每个新连接,就新建一个线程,SQL也在线程中,异步怎么实现长连接的高并发,请指教。 sql也有数据库连接池,他也是有数量限制的。而且为何你要长连接呢?1000个线程的长连接?
加载更多回复(14)

110,566

社区成员

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

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

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