作者:黄乐瞳_319 | 来源:互联网 | 2023-05-17 18:07
.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 个解决方案
你的网络怎么可能有速度,就是硬盘都没这速度,你什么服务器需要那么大的数据,是不是12306外包给你了?
那不是一台服务器能解决的!其实你的传送速度是看的网速的,就算是硬盘一秒好象也只能传送个百八十兆,
关于什么“
阻塞式、安全
队列、
然后解析插入数据库”之类的,我想你可能是学点c编程然后来做c#编程的。
建议先从你“不丢包”开始,来设计你的程序。所谓丢包,是因为你习惯了底层简单地照着书本编程。
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)
}
230MB/s?先看看你的硬件支持吗,你软件设计的再牛逼,结果是个百兆的网络,这不全在瞎扯淡吗.另外好奇windows下这么大量的数据传输,系统不会有什么限制吗
还有,如果要开发高性能的socket,还是建议使用iocp模型,这是windows下最高效的,没有之一
1、通信的吞吐量,可以用分布式来解决,有成熟框架;
2、存储的瓶颈可以用缓存、阵列来解决;
3、链路层不能避免丢包,要从业务逻辑入手,优化业务流程,减少数据量。
我曾经做过抄表系统,当时也是socket连接tcp协议,丢包到没发现,不过客户端达到2w后,服务器端就承载能力就大了。一般走tcp不会丢包的。你的传输速度和数据量都这么大,关键还是靠你的硬件设备,建议把数据按类型分解,多开几个端口。
想知道.net tcp 每秒最多能接收多少包?
这个和你的网络接入带宽以及网卡速率有关。
我怎么做才能最大限度减少丢包?
尽可能地提高数据吞吐率. 减少数据包的处理时间。
抛开网络问题不说,TCP是保证数据的可靠传输的,TCP本身就有流控,出现数据丢包情况,可能跟程序的数据处理逻辑有关。