免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4181 | 回复: 8
打印 上一主题 下一主题

求助: linux 2.6 SMP环境,kernel, 多线程UDP发包远大于网络带宽,为什么?在线等待 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-11-27 17:27 |只看该作者 |倒序浏览
如题,初始化时根据CPU个数分别指定各线程(每个线程的任务就是发UDP包,每个线程使用了10个SOCKET轮循发送)。使用sock_sendmsg进行UDP包发送远大于网络带宽,为什么?在线等待 谢谢!!!!!!!!!

论坛徽章:
0
2 [报告]
发表于 2007-11-27 17:33 |只看该作者

回复 #1 xaking 的帖子

是不是  sock_sendmsg在CPU之间 需要什么同步 或者保护之类的??? 急 谢谢!

论坛徽章:
0
3 [报告]
发表于 2007-11-28 10:51 |只看该作者

回复 #2 xaking 的帖子

计算方法?
具体数据?
或者是包没发出去?

论坛徽章:
0
4 [报告]
发表于 2007-11-28 13:38 |只看该作者
原帖由 xaking 于 2007-11-27 17:27 发表
如题,初始化时根据CPU个数分别指定各线程(每个线程的任务就是发UDP包,每个线程使用了10个SOCKET轮循发送)。使用sock_sendmsg进行UDP包发送远大于网络带宽,为什么?在线等待 谢谢!!!!!!!!!



这依赖于你的测试手段,首先UDP本身没有flow control如果你的测试工具也是没有flow control的话,

那么测试UDP发送就没有意义,基本上测试接收就可以了,发送再多,也可能是被协议栈丢弃。

论坛徽章:
0
5 [报告]
发表于 2007-11-28 16:39 |只看该作者

回复 #4 Solaris12 的帖子

谢谢Solaris12  的回答,但是,netperf是怎么测试出网络的最大带宽的??? 我看来一下 不是靠检查对方是否收到包为保准的,是检查自身发出包个数的。不过netpertf是用户态的代码,我不知道在kernel需要加什么控制,比如:不加MSG_DONTWAIT标志???

但是 我的程序都是成功返回的。由于每个kernel线程(我为每个CPU开一个处理线程,以便balance)有10个socket轮循发包,我门可以任务包都缓存在协议栈了 但是,为什么也没有发出去啊? 既然发不过来了  sock_sendmsg 应该返回失败啊?

求高手指点!

论坛徽章:
0
6 [报告]
发表于 2007-11-28 16:47 |只看该作者

回复 #3 cowboy_fang 的帖子

具体过程是这样的:(比如2个CPU)

netfilter---|-->|_buffer__| ----->thread(有10个socket,轮循发包)----->sock_sendmsg
                |                                           (分别发往300或者更多地址)
                |-->|_buffer__| ----->thread(有10个socket,轮循发包)----->sock_sendmsg
                                                              (分别发往300或者更多地址)

计算方法是:
统计发送出去的包数,每个包是1K数据,netfilter进来的是每秒50个,如果发出的是一共1000个不同的地址的话,那么 全部成功的带宽是:
1000个*50包/S*1K Bytes = 50MB/S
---- 其实 我测试了5000个都可以 那么
5000个*50包/S*1K Bytes = 250MB/S

但是 我的网络带宽是100Mbps=12.5MB/s

论坛徽章:
0
7 [报告]
发表于 2007-11-28 16:49 |只看该作者

回复 #6 xaking 的帖子

即使 考虑缓存 也不会有这么大的差别

论坛徽章:
0
8 [报告]
发表于 2007-11-28 16:51 |只看该作者

回复 #3 cowboy_fang 的帖子

实际发出去的包 刚好是一定时间内最大网络带宽的包数,表明 有包不见了(我测试差了一个数量级) 但是 sock_sendmsg 一直返回成功, 那么包哪里去了呢???

论坛徽章:
0
9 [报告]
发表于 2007-11-28 20:07 |只看该作者
原帖由 xaking 于 2007-11-28 16:47 发表
具体过程是这样的:(比如2个CPU)

netfilter---|-->|_buffer__| ----->thread(有10个socket,轮循发包)----->sock_sendmsg
                |                                           (分别发往300或者更 ...




没做过这方面的,不过我想发是一方面,接收还是一方面,
而且带宽也不能那样算吧,
要知道网络传输,接收不了,会延时等待哦.

也就是要发送成功,接收也要成功,才行吧.

延时太长,那只能丢包咯.
发再多也没用.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP