免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123
最近访问板块 发新帖
楼主: it-rocket

高手的经验:Linux网络通信程序中,最快的数据发送和接收速度能达到的多少? [复制链接]

论坛徽章:
7
丑牛
日期:2013-10-18 14:43:21技术图书徽章
日期:2013-11-03 09:58:03辰龙
日期:2014-01-15 22:57:50午马
日期:2014-09-15 07:04:39丑牛
日期:2014-10-16 14:25:222015年亚洲杯之伊朗
日期:2015-03-16 10:24:352015亚冠之城南
日期:2015-05-31 09:52:32
发表于 2010-06-05 21:11 |显示全部楼层
回复 20# it-rocket

之前分析有误,没搞清楚usleep.看我上面的编辑后的帖子
交互效率最高的mmap
你的数据量不是很大,你原先的那方式我想就可以了.

问题在于中断中如何通知应用层数据已经接受到.
其实前面的你帖子里别人给的就是方法.

问题是数率低会不会是你算法占用时间的问题。
你应该做下算法+发送数据的实验.不采集.

论坛徽章:
0
发表于 2010-06-06 00:00 |显示全部楼层
回复  it-rocket

之前分析有误,没搞清楚usleep.看我上面的编辑后的帖子
交互效率最高的mmap
你的数据 ...
smalloc 发表于 2010-06-05 21:11


呵呵 还是smalloc推测的正确!经过测试,确实是我把线程所占CPU的使用率搞错了。正确顺序是:
T1(数据处理线程)为最高;T2(准备发送数据到发送缓冲区);T3(main线程,具有发送数据功能);T4(采样线程),

其中T1的最高,T4的几乎可以为0,T2与T3的几乎相等,为10%左右。具体的占用比例,明天我再跑板子试试。
真没有想到T1(数据处理线程)会占用那么高的CPU。该线程主要是完成一些滤波运算、采样值的电压转换等处理,而且在做100ksps采样时,我仅仅只开启了将采样值转换成电压的功能,该转换算法很简单:只是将采样在FIFO1中的一组(比如2048个整型值)数据逐个逐个地转换成float型的电压值,存放在环形FIFO2当中,放入FIFO2处会涉及到与T2线程的互斥操作而要已。该转换电压比较耗时处,我认为就是它需一个个地转换成float电压。

“丢失数据的原因还可能是你采集进程睡过头了.()根据上面的精确度推断存在这种可能).”这种可能极可能存在,因为我在用gettimeofday来判断前后两次取数操作时,所用时间完全超过,比如取2048个数据所需要的时间20480微秒,则多出1万微秒左右。

处理器是450MHz的,应该问题不大。

至于那个实验,我明天再试一试,其实上面测网速达4.0Mbps的,也是这种做法来测出来的。

论坛徽章:
0
发表于 2010-06-07 19:27 |显示全部楼层
路过看看!

论坛徽章:
0
发表于 2010-06-07 20:46 |显示全部楼层
标注下,大家多多讨论交流啊:wink:

论坛徽章:
0
发表于 2010-06-07 22:18 |显示全部楼层
标注下,大家多多讨论交流啊
duanjigang 发表于 2010-06-07 20:46



    呵呵 谢谢版主。

论坛徽章:
0
发表于 2010-06-08 22:02 |显示全部楼层
本帖最后由 it-rocket 于 2010-06-08 22:05 编辑

回复 21# smalloc


    当我屏蔽掉转换电压的那部分调用之后,数据的网络传输速度确实提高了许多,而且各个线程,包括数据处理线程,它们的CPU占有量都差不了太多。
听取了老总和其他同事的建议后,改进了转换电压函数的实现和调用方式,测试之后,虽然在100ksps情况下,还存在1分钟采样缺少70万左右的数据量,但可能这个问题的解决更多还是应该继续优化程序的一些实现算法和提高性能上。

论坛徽章:
7
丑牛
日期:2013-10-18 14:43:21技术图书徽章
日期:2013-11-03 09:58:03辰龙
日期:2014-01-15 22:57:50午马
日期:2014-09-15 07:04:39丑牛
日期:2014-10-16 14:25:222015年亚洲杯之伊朗
日期:2015-03-16 10:24:352015亚冠之城南
日期:2015-05-31 09:52:32
发表于 2010-06-08 22:33 |显示全部楼层
回复 26# it-rocket


    缺少是指数据丢失?
如果是,那么看我前面提到的,usleep方式的问题.
虽然是US级别的.但是C版有人实验过休眠的最小其实为一个1/1HZ.那么就是10ms,那其实你的是休眠30ms,所以大约丢失1/3.当然这个还没考虑精确的切换时间.
,其实一般硬件来的做法是用中断程序处理接收到的数据才不会有丢失.

论坛徽章:
0
发表于 2010-06-08 22:52 |显示全部楼层
本帖最后由 it-rocket 于 2010-06-08 23:12 编辑

回复 27# smalloc


不好意思,因为这两天去调试另外的一个新仪器了,所以这个很忙急的问题也就落下了些时间。
这1分钟缺少的70万左右的数据,也就是缺少大约7秒左右的采样时间。数据从硬件的角度来讲,应该是不存在丢失,因为这个老总和另一位硬件老工程师验证过,丢失数据,绝大部分原因就是我程序(采样线程)从驱动中读取数据慢了,让硬件的buffer溢出了。哪天和老总他们讨论过,从半满中断中取数,一次中断就会有32k*2=64kByte的数据量需要从驱动的中断中读回来,那位老硬件工程师认为这数据量在采集时间一长,稍不注意也会数据溢出。所以他认为用目前这种读数方式还是可以,减少数据的拷贝,但这个休眠的时间(20480微秒)在程序中确实不好精确控制,我都是从统计中获得大概需要休眠多少时间,来大约的设置休眠时间,所以这里也存在的问题。

论坛徽章:
0
发表于 2010-06-12 21:45 |显示全部楼层
本帖最后由 it-rocket 于 2010-06-12 21:49 编辑

想了几个方法来解决上述的问题,但是还是未能得到好的答案。 应该还会采用半满中断来处理这个采集,有不明白的地方,还请大家多多指教,非常感谢。

论坛徽章:
0
发表于 2010-09-15 22:16 |显示全部楼层
回复 27# smalloc


感谢楼上各位的help,尤其是smalloc和ShadowStar两位大侠!

由于前端时间较m,今天才来结贴。
项目已交付,问题已解决:采用半满中断取数据,有多少数据就发送多少数据。
呵呵
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP