热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

求助,socketTCP每秒接收大量数据包,如何不掉包,详情请看内容

.net网络编程:通讯类行业-都是大数据级的,对于性能要求很高。问题:Linux中间层客户端向.netTCP服务端发送平均约3万个包s、峰值5万个包s,每包按1000byte算每秒流速
.net网络编程:通讯类行业-都是大数据级的,对于性能要求很高。
问题:
Linux中间层客户端向.net TCP服务端发送平均约3万个包/s、峰值5万个包/s ,每包按1000byte算每秒流速将近230M/S。
我使用tcpListener 监听,NetWorkStream.Read 阻塞式的获取数据(利用阻塞式的是想当Linux客户端崩溃,或断开链接时我.net端能监听到),接收到数据放在安全队列ConcurrentQueue中,然后解析数据、插入数据库。对于这样的流速,包数压力很大,肯定会丢包,刚做这行也不久,网络编程了解不深入。
想知道.net tcp 每秒最多能接收多少包?我怎么做才能最大限度减少丢包?
谢谢各位大神。

 另同事查询的信息-----根据intel测试数据,X86网口处理极限是20万包。

没多少分了。全部贡献上,求助。

27 个解决方案

#1


你的网络怎么可能有速度,就是硬盘都没这速度,你什么服务器需要那么大的数据,是不是12306外包给你了?

#2


引用 1 楼 xu56180825 的回复:
你的网络怎么可能有速度,就是硬盘都没这速度,你什么服务器需要那么大的数据,是不是12306外包给你了?

有哦,亲,通信行业,GB,GN,LTE数据分析,那是海量的包过来,硬盘存储我们解决了 使用磁阵 至少4片7200转的硬盘。其实也不是一定要解决这个问题吧。其实想了解.net 接收数据包 每秒最多能接收多少而不掉包。每秒接收多少M的数据不会掉包。

#3


引用 1 楼 xu56180825 的回复:
你的网络怎么可能有速度,就是硬盘都没这速度,你什么服务器需要那么大的数据,是不是12306外包给你了?

计算下来硬盘存储一个小时需要100多个G。

#4


那不是一台服务器能解决的!其实你的传送速度是看的网速的,就算是硬盘一秒好象也只能传送个百八十兆,

#5


引用 4 楼 xu56180825 的回复:
那不是一台服务器能解决的!其实你的传送速度是看的网速的,就算是硬盘一秒好象也只能传送个百八十兆,

网速,局域网,甚至直连,不可能不够。就是在网速没问题的情况下,.net socket tcp 我使用的是networkstream 接收数据的,那它的缓冲区有多少呢,每秒多少包的情况下 会因为.net socket接收不过来掉包呢?

#6


引用 楼主 mengmeng0807 的回复:
.net网络编程:通讯类行业-都是大数据级的,对于性能要求很高。
问题:
Linux中间层客户端向.net TCP服务端发送平均约3万个包/s、峰值5万个包/s ,每包按1000byte算每秒流速将近230M/S。
我使用tcpListener 监听,NetWorkStream.Read 阻塞式的获取数据(利用阻塞式的是想当Linux客户端崩溃,或断开链接时我.net端能监听到),接收到数据放在安全队列ConcurrentQueue中,然后解析数据、插入数据库。对于这样的流速,包数压力很大,肯定会丢包,刚做这行也不久,网络编程了解不深入。
想知道.net tcp 每秒最多能接收多少包?我怎么做才能最大限度减少丢包?
谢谢各位大神。

 另同事查询的信息-----根据intel测试数据,X86网口处理极限是20万包。

没多少分了。全部贡献上,求助。

230M真牛B。。。你试过没。。。就TCP 连本机的,也达不到这级别。。。所以你就别想了。还有
TCP在局域网丢包可能性很小,。毛没处理好。再说了你用阻塞式,根本达不到230M,可能连10M都达不到。

#7


引用 4 楼 xu56180825 的回复:
那不是一台服务器能解决的!其实你的传送速度是看的网速的,就算是硬盘一秒好象也只能传送个百八十兆,

而且硬盘存储的问题已经解决,单个磁盘确实不够,所以用磁阵,阵列。

#8


引用 6 楼 wyd1520 的回复:
Quote: 引用 楼主 mengmeng0807 的回复:

.net网络编程:通讯类行业-都是大数据级的,对于性能要求很高。
问题:
Linux中间层客户端向.net TCP服务端发送平均约3万个包/s、峰值5万个包/s ,每包按1000byte算每秒流速将近230M/S。
我使用tcpListener 监听,NetWorkStream.Read 阻塞式的获取数据(利用阻塞式的是想当Linux客户端崩溃,或断开链接时我.net端能监听到),接收到数据放在安全队列ConcurrentQueue中,然后解析数据、插入数据库。对于这样的流速,包数压力很大,肯定会丢包,刚做这行也不久,网络编程了解不深入。
想知道.net tcp 每秒最多能接收多少包?我怎么做才能最大限度减少丢包?
谢谢各位大神。

 另同事查询的信息-----根据intel测试数据,X86网口处理极限是20万包。

没多少分了。全部贡献上,求助。

230M真牛B。。。你试过没。。。就TCP 连本机的,也达不到这级别。。。所以你就别想了。还有
TCP在局域网丢包可能性很小,。毛没处理好。再说了你用阻塞式,根本达不到230M,可能连10M都达不到。

这个数据是计算得到的,也在苦恼,.net tcp 差不多 10M左右 我也知道,实际应用过程中,差不多7M/S以上就丢包了。
其实也是想知道有人对于.net TCP 接收包的最大限度,或者说有没有人做过这种测试。
另....Linux端c/c++他们峰值需要达到500M/S,每秒几十万个包。想想也头疼额...,不过貌似Linux差不多撑的下来。

#9


引用 8 楼 mengmeng0807 的回复:
Quote: 引用 6 楼 wyd1520 的回复:

Quote: 引用 楼主 mengmeng0807 的回复:

.net网络编程:通讯类行业-都是大数据级的,对于性能要求很高。
问题:
Linux中间层客户端向.net TCP服务端发送平均约3万个包/s、峰值5万个包/s ,每包按1000byte算每秒流速将近230M/S。
我使用tcpListener 监听,NetWorkStream.Read 阻塞式的获取数据(利用阻塞式的是想当Linux客户端崩溃,或断开链接时我.net端能监听到),接收到数据放在安全队列ConcurrentQueue中,然后解析数据、插入数据库。对于这样的流速,包数压力很大,肯定会丢包,刚做这行也不久,网络编程了解不深入。
想知道.net tcp 每秒最多能接收多少包?我怎么做才能最大限度减少丢包?
谢谢各位大神。

 另同事查询的信息-----根据intel测试数据,X86网口处理极限是20万包。

没多少分了。全部贡献上,求助。

230M真牛B。。。你试过没。。。就TCP 连本机的,也达不到这级别。。。所以你就别想了。还有
TCP在局域网丢包可能性很小,。毛没处理好。再说了你用阻塞式,根本达不到230M,可能连10M都达不到。

这个数据是计算得到的,也在苦恼,.net tcp 差不多 10M左右 我也知道,实际应用过程中,差不多7M/S以上就丢包了。
其实也是想知道有人对于.net TCP 接收包的最大限度,或者说有没有人做过这种测试。
另....Linux端c/c++他们峰值需要达到500M/S,每秒几十万个包。想想也头疼额...,不过貌似Linux差不多撑的下来。

net tcp程序写的好些不可能丢包。我自己写了500人每秒2个包(20byte)全服广播(500*500*2) 就达到10M了,没丢包,如果你只是连接几个客户端,那更不可能丢包。要是不做全服广告播,只是单向的,连接数达到5000都没问题。。

#10


引用 楼主 mengmeng0807 的回复:
.net网络编程:通讯类行业-都是大数据级的,对于性能要求很高。


别人云亦云地什么“大数据”好不好?

如果说到“通讯类行业”,你这里瞎忽悠这个词儿了。通讯中千方百计地让数据更小、更短。“大数据”是指存储以及搜索算法。

#11


引用 9 楼 wyd1520 的回复:
Quote: 引用 8 楼 mengmeng0807 的回复:

Quote: 引用 6 楼 wyd1520 的回复:

Quote: 引用 楼主 mengmeng0807 的回复:

.net网络编程:通讯类行业-都是大数据级的,对于性能要求很高。
问题:
Linux中间层客户端向.net TCP服务端发送平均约3万个包/s、峰值5万个包/s ,每包按1000byte算每秒流速将近230M/S。
我使用tcpListener 监听,NetWorkStream.Read 阻塞式的获取数据(利用阻塞式的是想当Linux客户端崩溃,或断开链接时我.net端能监听到),接收到数据放在安全队列ConcurrentQueue中,然后解析数据、插入数据库。对于这样的流速,包数压力很大,肯定会丢包,刚做这行也不久,网络编程了解不深入。
想知道.net tcp 每秒最多能接收多少包?我怎么做才能最大限度减少丢包?
谢谢各位大神。

 另同事查询的信息-----根据intel测试数据,X86网口处理极限是20万包。

没多少分了。全部贡献上,求助。

230M真牛B。。。你试过没。。。就TCP 连本机的,也达不到这级别。。。所以你就别想了。还有
TCP在局域网丢包可能性很小,。毛没处理好。再说了你用阻塞式,根本达不到230M,可能连10M都达不到。

这个数据是计算得到的,也在苦恼,.net tcp 差不多 10M左右 我也知道,实际应用过程中,差不多7M/S以上就丢包了。
其实也是想知道有人对于.net TCP 接收包的最大限度,或者说有没有人做过这种测试。
另....Linux端c/c++他们峰值需要达到500M/S,每秒几十万个包。想想也头疼额...,不过貌似Linux差不多撑的下来。

net tcp程序写的好些不可能丢包。我自己写了500人每秒2个包(20byte)全服广播(500*500*2) 就达到10M了,没丢包,如果你只是连接几个客户端,那更不可能丢包。要是不做全服广告播,只是单向的,连接数达到5000都没问题。。


嗯嗯,把链接数放大,确实可以,我原程序是用的默认链接数 应该是10个吧。我去查查,是个思路。5000*1000*30000,这么算 可以达到150M哦。
我去查查算算,谢谢。

#12


关于什么“ 阻塞式、安全 队列然后解析插入数据库”之类的,我想你可能是学点c编程然后来做c#编程的。

建议先从你“不丢包”开始,来设计你的程序。所谓丢包,是因为你习惯了底层简单地照着书本编程。

#13


引用 10 楼 sp1234 的回复:
Quote: 引用 楼主 mengmeng0807 的回复:

.net网络编程:通讯类行业-都是大数据级的,对于性能要求很高。


别人云亦云地什么“大数据”好不好?

如果说到“通讯类行业”,你这里瞎忽悠这个词儿了。通讯中千方百计地让数据更小、更短。“大数据”是指存储以及搜索算法。

少打个字,大数据量。虽然对于大数据只是表面认识,但是也是知道一点点,大数据是需要在海量的数据里去找数据、分析、挖掘,从而衍生数据仓库、数据挖掘等等。大数据是把数据变的更小,是通过分析,等手段获取更有用的数据。 我知道不是很全面,认识不是很足,还得花功夫,受教了,谢谢。
通讯中是千方百计的把数据更小,从硬件采集-->linux解码分析-->.net端展示,这一层层下来到.net端的数据没有一个是垃圾数据。已经把数据变得很小。就这样.net端压力也挺很大。

#14


引用 12 楼 sp1234 的回复:
关于什么“ 阻塞式、安全 队列然后解析插入数据库”之类的,我想你可能是学点c编程然后来做c#编程的。

建议先从你“不丢包”开始,来设计你的程序。所谓丢包,是因为你习惯了底层简单地照着书本编程。


嗯嗯,谢谢,是得好好琢磨。不丢包是根本。

#15


该回复于2014-01-17 00:02:13被版主删除

#16


引用 11 楼 mengmeng0807 的回复:
嗯嗯,把链接数放大,确实可以,我原程序是用的默认链接数 应该是10个吧。我去查查,是个思路。5000*1000*30000,这么算 可以达到150M哦。
我去查查算算,谢谢。
2000个连接100Mb/s倒是测试过,只要连接上,通讯是没有任何问题的。

在网络正常的情况下,理论上丢包有两个原因:缓冲区大小跟不上处理频率;处理速度跟不上接收速度。
对于前一种只要设置合适的缓冲区大小就可以了。
对于后一种情况如果数据接收以后直接丢给队列不做处理都解决不了,那就说明内存或者CPU跟不上了。230Mb/s并不大,不至于出现这种情况。

#17


引用 11 楼 mengmeng0807 的回复:
嗯嗯,把链接数放大,确实可以,我原程序是用的默认链接数 应该是10个吧。我去查查,是个思路。5000*1000*30000,这么算 可以达到150M哦。
我去查查算算,谢谢。
5000*1000*30000,将近150GB了。

#18


引用 16 楼 sbwwkmyd 的回复:
Quote: 引用 11 楼 mengmeng0807 的回复:
嗯嗯,把链接数放大,确实可以,我原程序是用的默认链接数 应该是10个吧。我去查查,是个思路。5000*1000*30000,这么算 可以达到150M哦。
我去查查算算,谢谢。
2000个连接100Mb/s倒是测试过,只要连接上,通讯是没有任何问题的。

在网络正常的情况下,理论上丢包有两个原因:缓冲区大小跟不上处理频率;处理速度跟不上接收速度。
对于前一种只要设置合适的缓冲区大小就可以了。
对于后一种情况如果数据接收以后直接丢给队列不做处理都解决不了,那就说明内存或者CPU跟不上了。230Mb/s并不大,不至于出现这种情况。

嗯嗯,是的。谢谢,一个是缓冲区,一个是链接数,两个点我研究研究

#19


1)NetWorkStream.Read 阻塞式的获取数据(利用阻塞式的是想当Linux客户端崩溃,或断开链接时我.net端能监听到)
     这个观点我不赞同,异步也可以啊,当然如果你只有1个中间层,这样也无所谓了
2)你确信中间的路由线路都是用的千M以上的
3)我觉得还是要异步,阻塞是也可以,不过要开线程
   如果是异步
   异步是用线程的,所以读取完成后,马上开线程再读取,而原来线程处理数据,这样就可以加快读取速度,减小真个缓冲区
     void  beginread()
   {
ClientSocket.BeginReceive(.....);
  }
     void endrend(iar)
     {
             recv = ClientSocket.EndReceive(iar);
           byte[] buff = new byte[recv];
                Array.Copy(sendDataSession.Buffer, 0, buff, 0, recv);
             beginread()//马上继续读取
             //处理数据
     }
    如果是阻塞
    while(true)
    {
         data=socket.read.....
         线程处理(data)
     }

#20


230MB/s?先看看你的硬件支持吗,你软件设计的再牛逼,结果是个百兆的网络,这不全在瞎扯淡吗.另外好奇windows下这么大量的数据传输,系统不会有什么限制吗

#21


230/8=28.75

#22


还有,如果要开发高性能的socket,还是建议使用iocp模型,这是windows下最高效的,没有之一

#23


1、通信的吞吐量,可以用分布式来解决,有成熟框架;
2、存储的瓶颈可以用缓存、阵列来解决;
3、链路层不能避免丢包,要从业务逻辑入手,优化业务流程,减少数据量。

#24


我曾经做过抄表系统,当时也是socket连接tcp协议,丢包到没发现,不过客户端达到2w后,服务器端就承载能力就大了。一般走tcp不会丢包的。你的传输速度和数据量都这么大,关键还是靠你的硬件设备,建议把数据按类型分解,多开几个端口。

#25


我也需要此问题的求解,大家的见解值得学习!

#26


想知道.net tcp 每秒最多能接收多少包? 
这个和你的网络接入带宽以及网卡速率有关。

我怎么做才能最大限度减少丢包?
尽可能地提高数据吞吐率. 减少数据包的处理时间。

抛开网络问题不说,TCP是保证数据的可靠传输的,TCP本身就有流控,出现数据丢包情况,可能跟程序的数据处理逻辑有关。

#27


吹牛是一回事,事实上强实时,一般Windows也只能处理200Mbps的性线流量,稳定地。估计一旦上到500Mbps,CPU和硬件支撑不了,除非服务器性能超强。按最大值来计算,Windows Server每秒也最多接入2000个TCP,估计一般人设计的程序,未必能达到2000。要加大流量,就必须加大发送和接收窗口BUFFER值,超过32K的包,都是不科学的。上传一图,是以16KB来测试的。如果计算机CPU能支持物理128线程,理论上,超过2Gbps是可以实现的。因为高速时,CPU线程间切换,也需要时间。内存其实用不了多少,主要是CPU计算跟不上。异步IO轮转,也是有时间成本的。从图上看出来,就i7的客户端,发送这么大流量,CPU都快到了60%。还有网卡处理中断的能力,高通好像说,最大每秒也就20000次。看了一下MongoDB推荐,最大连接,2000也就OK了,太多没有啥意义,实际性能会降低。Linux一样,过多的并发线程,实际上内核处理相应的切换,即便你使用流式算法,没有锁定,但在List中去检测完成信号,也需要时间。现在DC即便用40Gbps的光线连接,多网卡,实际上,如果一台服务器可以用到2Gbps的线性流量,也就20台用完了所有通道。连接少,全传大包,流量可以上升,但实际上,你超过400Mbps,存储根本处理不过来,只能用Memory DB来缓存。至于有人说,用小连接,一台PC长连接上百万的TCP,那只能传点小数据,如果像ATM一样,只传几十BYTES,那完全是另一回事了。真要一个应用,以200Mbps的线性速度同步,根本搞不定,像后台的数据库服务器同步,当然是越快越好,有时镜像硬COPY一份,如果以2Gbps的速度来执行,一般公司的主数据库,也就几分钟搞定了。即便服务器出问题了,硬PUSH到备份节点,也就几分钟就可以恢复。就是电信应用,有时你在极端情况下,还是有可能几分钟,信号无法恢复。

推荐阅读
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • Skywalking系列博客1安装单机版 Skywalking的快速安装方法
    本文介绍了如何快速安装单机版的Skywalking,包括下载、环境需求和端口检查等步骤。同时提供了百度盘下载地址和查询端口是否被占用的命令。 ... [详细]
  • 本文介绍了解决Netty拆包粘包问题的一种方法——使用特殊结束符。在通讯过程中,客户端和服务器协商定义一个特殊的分隔符号,只要没有发送分隔符号,就代表一条数据没有结束。文章还提供了服务端的示例代码。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • WebSocket与Socket.io的理解
    WebSocketprotocol是HTML5一种新的协议。它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送 ... [详细]
  • 本文介绍了在Linux下安装和配置Kafka的方法,包括安装JDK、下载和解压Kafka、配置Kafka的参数,以及配置Kafka的日志目录、服务器IP和日志存放路径等。同时还提供了单机配置部署的方法和zookeeper地址和端口的配置。通过实操成功的案例,帮助读者快速完成Kafka的安装和配置。 ... [详细]
  • 深入理解Kafka服务端请求队列中请求的处理
    本文深入分析了Kafka服务端请求队列中请求的处理过程,详细介绍了请求的封装和放入请求队列的过程,以及处理请求的线程池的创建和容量设置。通过场景分析、图示说明和源码分析,帮助读者更好地理解Kafka服务端的工作原理。 ... [详细]
author-avatar
黄乐瞳_319
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有