免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: berlin860
打印 上一主题 下一主题

[求教] 8核Linux上udp狂丢包问题 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2010-03-05 14:49 |只看该作者
回复 8# berlin860


    先不说要不要加锁,这个我不多说了,你看的内核加了锁没有错,内核加锁只是为了保证不会出现同时写的死锁情况。

  比如有这样一个fdbuf:

   发送时
   加锁
  把buf拷到fdbuf中
  解锁

  注意socket层的send和sendto发送接口要判断返回值,send和sendto一次并不能把你想要的一次发送完。
  如果一个线程send的时候没有发送完,有切换到另一个线程在发送,你认为buf里的数据还没有乱吗?
  
  多个线程为什么效率低了,多线程在多核情况下的效率提升在于你的并发运行所占程序百分比,如果并发程序没有写好和串行没有区别,系统还要负责线程的切换效率损失,会更低!

论坛徽章:
0
12 [报告]
发表于 2010-03-05 14:50 |只看该作者
就不知道 为啥很多人喜欢用多线程~而且还是 IO部分 多线程 OMG

论坛徽章:
0
13 [报告]
发表于 2010-03-05 15:00 |只看该作者
回复 12# zhyclt

阿,是阿,多线程对IO瓶颈无济于事。不过这个echo程序与IO基本无关。
是探索一下这个多线程echo的问题所在。

论坛徽章:
0
14 [报告]
发表于 2010-03-05 15:04 |只看该作者
回复 11# 独臂剑客

如果是非阻塞式sockfd,很可能就出现这次send没完成就返回,其他线程又去写。但阻塞式的sockfd,应该没这个乱序的问题吧。

先放下这个加锁的问题。我想请教的是,如果中断只产生在一个cpu核,那单线程无疑是最高效的。
但,如果让中断在多个核产生,那么多个线程应该还是有其优势吧?
不过我不知道怎么让中断在多个核上动态均衡的产生。或者,这样带来的负面影响。

论坛徽章:
0
15 [报告]
发表于 2010-03-05 15:35 |只看该作者
中断有总线控制,应该有中断控制器控制,这个我不懂,说多了这个就是在乱说了....

就说你这种服务器效率问题吧
========================
大型并发在线的SOCKET IO操作,用多程程去做是绝对没有问题,但UDP不像TCP(每个连接有专门的FD识别,所以用epoll kqueue select线程池用得好的话,效率会很不错)

UDP本身是一个点对点,说一下我的想法,不过UDP这种服务器我没有做过,所以只是随便说一下我的想法

UDP用一个主线程recv,只是recv接收到数据以后,就进缓冲队列,由下面的逻辑处理线池去处理操作,发送时也一样,不是直接发送出去,都是进缓冲队列,由一个专门线程发送,这样也不会出现数据乱的情况.各个线程分工也明确,当然也会出现有些工作线程空闲的情况.

论坛徽章:
0
16 [报告]
发表于 2010-03-05 17:04 |只看该作者
不行换换内核试试?
看看我的(UBUNTU 9.10/2.6.31-20):

  1.            CPU0       CPU1      
  2.   0:        642        579   IO-APIC-edge      timer
  3.   1:          1          1   IO-APIC-edge      i8042
  4.   4:          1          1   IO-APIC-edge   
  5.   6:          2          3   IO-APIC-edge      floppy
  6.   7:          0          0   IO-APIC-edge      parport0
  7.   8:          0          1   IO-APIC-edge      rtc0
  8.   9:          0          0   IO-APIC-fasteoi   acpi
  9. 12:     297426     296960   IO-APIC-edge      i8042
  10. 14:      68483      68492   IO-APIC-edge      ata_piix
  11. 15:    1167789    1168681   IO-APIC-edge      ata_piix
  12. 16:       6474       6337   IO-APIC-fasteoi   uhci_hcd:usb5, HDA Intel
  13. 18:         34         32   IO-APIC-fasteoi   uhci_hcd:usb4
  14. 19:         25         26   IO-APIC-fasteoi   uhci_hcd:usb3
  15. 23:          3          2   IO-APIC-fasteoi   ehci_hcd:usb1, uhci_hcd:usb2
  16. 26:     160525     160658   PCI-MSI-edge      i915
  17. 27:    1112184    1112808   PCI-MSI-edge      eth0
  18. NMI:          0          0   Non-maskable interrupts
  19. LOC:   91092623   94203261   Local timer interrupts
  20. SPU:          0          0   Spurious interrupts
  21. CNT:          0          0   Performance counter interrupts
  22. PND:          0          0   Performance pending work
  23. RES:       4890       4285   Rescheduling interrupts
  24. CAL:         82        149   Function call interrupts
  25. TLB:       6328       6190   TLB shootdowns
  26. TRM:          0          0   Thermal event interrupts
  27. THR:          0          0   Threshold APIC interrupts
  28. MCE:          0          0   Machine check exceptions
  29. MCP:       1178       1178   Machine check polls
  30. ERR:          1
  31. MIS:          0
复制代码

论坛徽章:
0
17 [报告]
发表于 2010-03-05 17:09 |只看该作者
回复 15# 独臂剑客

我现在的代码其实就是有个udp接收线程专门收数据,挂载到一个队列,然后由其他线程来处理。

这里的echo只是我简化了的一个原型,方便阐述问题,因为echo的处理线程就是运行sendto。

不过就接收而言,我在双核上1个udp接收线程,90k pack/s的时候,有40%的丢包,
将udp线程修改为>1,则有基本低于10%的丢包。(这里是减少的丢包率)。

但在8核上,这个修改就无效了。而且单线程绝对最高效,2个线程时,性能下降的太厉害。

仍在迷惑中0rz

论坛徽章:
0
18 [报告]
发表于 2010-03-05 17:24 |只看该作者
回复 17# berlin860


    可以一个一个排除问题,建议:

   1: 你只收不发数据,统计一下丢包率?
   2: 叫对端不要发数据只收,你只发不会收到包,这样统计一下丢包率?
   
   附:好像socket在数据接收时,会先检查一下发送缓存,上面如果两个在单一收发情况下是正常的话,就可以考虑将收放在各单独一个线程,那二个线程只负责收发。
   其它线程池负责消息处理,发消息时先进缓存再统一由一个线程作务发。这样试下看。

论坛徽章:
0
19 [报告]
发表于 2010-03-10 16:52 |只看该作者
回复 18# 独臂剑客

经过这几天的测试,有一些发现:
1. 多线程recv, send对同一个sockfd加锁,丢包率下降很多。
2. 单线程的接收的效率是最高的。多线程不加锁接收,丢包剧增;多线程加锁接收,丢包低于不加锁,高于单线程。
3. 单线程接收,放入一个线程安全的队列,多个线程从队列中取数据,再send/echo,在我的实验平台上可以达到input/output: 25w pack/s。

上面没有具体的测试数据,以后专门写个帖子总结,并给出数据

论坛徽章:
0
20 [报告]
发表于 2010-03-10 21:53 |只看该作者
学习的!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP