请大牛们帮助解决,udp 多线程接收性能问题

风涛hit 2016-05-30 10:01:46
最近项目需要,在做udp性能测试。但是测试过程发现一个问题,还没弄太明白,希望各位大牛帮助解决。
问题描述:两台计算机,通过千兆网卡通信,使用udp编程,一台做客户端,一台做服务端。服务端采用多线程模式编写,每个线程创建都会创建属于自己的socket,这些socket都绑定到同一IP的不同端口下,并在此socket上等待接收数据。客户端同样采用多线程模式,每个线程开辟对应服务程序各线程的socket,通过此socket发送数据。经过测试,当使用单线程运行时,服务端与客户端能正常收发数据,双方速度均在130Mbps左右,基本无丢包。但是当使用2个线程或更多线程进行数据收发时,例如使用两个线程进行收发,发送线程速度依然130Mbps,但是接收线程丢包严重,导致速度下滑厉害,有时才几兆bit每秒。
  但是如果同时打开2个服务程序及客户端程序进行数据收发,每个程序中使用1个线程进行工作,则每个服务程序的接收速度与客户端的发送速度基本一致,大概130Mbps,且都没有丢包。两个服务程序的接收速度和为260Mbps。
  现在不清楚的是为什么在多线程情况下跟多进程情况下有这么大的差距,原因为何?
  先谢谢各位了,这几天一直没弄明白,希望大家能提供一些有用的思路。
...全文
976 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
darlingshen 2018-11-15
  • 打赏
  • 举报
回复
服务端在线程里面创建socket指定不同端口 那你发送端怎么确定该往哪个端口发送数据比较合理呢?udp服务端做多线程必须要创建多个udp对象吗?
夏小鹏吖 2018-11-08
  • 打赏
  • 举报
回复
哥们你能把 你udp实现并发的思路给我吗
风涛hit 2016-06-03
  • 打赏
  • 举报
回复
我的问题解决了,之前各线程调用sendto时使用的发送缓存是由进程创建的,所以各线程是共享该发送缓存的,因为不改变发送数据,而且为了提高线程的发送速度,取消了对共享发送缓存区的加锁。代码运行的结果就是之前描述的那样。 昨天重新整理了代码,为了方便,各个线程独立创建自己的发送缓存,之后再运行程序,就没有之前的问题了。但是具体原因还没有想的很明白,但是可以肯定的是socket使用sendto进行数据发送时会检查发送缓存,因为传给sendto的是缓存地址,这个地址需要映射到内核中,驱动执行发送操作时可能是以直接方式进行的,这样就需要在内核中锁定用户缓冲区的地址,导致当其他线程也进行发送时,不能访问该用户缓冲地址,导致发送延时,造成对端接收超时。 产生了上述的问题。 不过这也只是我自己的想法,还没有更深入的研究udp的内部实现。有机会再研究吧
风涛hit 2016-06-01
  • 打赏
  • 举报
回复
现在基本能确定是udp发送的问题了,而不是之前考虑的udp接收的问题。因为我又做了两个实验: 实验1:开启两个接收进程,每个进程创建自己的socket,等待接收。同时开启两个发送进程,每个发送进程创建对应于接收进程的socket,并循环发送数据。循环发送次数为100000次,每次发送数据长1404字节。接收进程显示,成功接收到100000包数据,无丢包,收发速度基本一致; 实验2:开启两个接收进程,配置同实验1.开启一个发送进程,在此发送进程中创建两个线程,每个线程独立创建自己的socket,与接收进程对应。发送线程循环发送100000次1404字节的报文。两个接收进程都显示丢包,丢包率很高(大概严重时可能50%以上) 综合以上两个实验,可以知道,主要问题是多线程发送造成的,但是多进程发送为什么没有这个问题呢? 已经好几天了,虽然有些进展但是仍然没有找到原因和解决办法。查询资料,有的网友说可能是发送速度快导致的这个问题。但是多进程时的发送速度跟多线程是一样的。而且修改代码,降低发送速度到100Mbps左右,丢包仍然严重,四号没有改善。 希望各位大牛能看到这个问题,帮助解决一下。谢谢了
风涛hit 2016-06-01
  • 打赏
  • 举报
回复
首先谢谢你的回复。 因为是测试程序,线程代码其实比较简单,主要就是创建socket,配置socket的发送缓冲区(扩大缓冲),绑定socket到本地IP的指定端口,绑定好之后就是循环发送1408字节的测试数据(没有实际意义)10000次,发送完成统计速度信息,然后退出。相同的代码,放在进程中运行与在线程中运行结果就如上面的描述,暂时还是不清楚,进程与线程在socket上为什么会有这么大的不同。代码现在不在手边,找个时间贴上来
yahle 2016-06-01
  • 打赏
  • 举报
回复
无代码无解,帖一下你的多线程代码吧。
风涛hit 2016-05-30
  • 打赏
  • 举报
回复
再补充一下,这些程序都运行在Windows xp平台,多线程时的丢包率最高达到80%-90%。查阅了tcpip协议详解,但是可能能力尚浅,没有找到具体原因。项目中本想使用多线程模式开发,但是没有料到会遇到这种问题。
风涛hit 2016-05-30
  • 打赏
  • 举报
回复
各位,有了解的吗?谢谢了

4,356

社区成员

发帖
与我相关
我的任务
社区描述
通信技术相关讨论
社区管理员
  • 网络通信
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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