免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3872 | 回复: 8

[应用] 嵌入式linux下大数据量的网络传送问题<请通信程序高手帮帮忙> [复制链接]

论坛徽章:
0
发表于 2009-09-20 18:04 |显示全部楼层
请通信程序前辈 多多帮帮忙!
    小弟刚进嵌入式的门槛不久,最近在做一款中速的数据采集产品,在网络通信这块儿遇到问题,还望大家多提提意见,帮帮忙!
产品的采样率达到100ksps到500ksps,产品板跑的是linux系统,开发板上的内存总共是32MB,用fpga来做fifo,有不到1MB的空间。如果按100ksps的采样率采样的话,基本上每秒钟会出现如下的数据量:
   100 *1000* sizeof(short) 每秒! 每秒约有200kB的数据量产生。若为500ksps,则约有1MB/秒 的数据。
所以我需要很快地通过网络通信程序把这些数据全部传送到windows端! 在linux端构建了一个server,专门把这数据传到windos段的客户端。关键是我的server受限于linux下网络传输的最大块4096B限制,所以基本上我一次就传输2000个数据,约有4000B,再加上一些包头96字节。我也用setsockopt来设置过发送缓冲区为8192B,但是不太好使!网络传输跟不上数据产生速度,导致了数据有丢失,这是老总坚决不同意的!

    所以请教高手,对于这种大量数据的传输问题,在linux下是如何去解决的呢? 像对于agilent,NI的上兆上G采样率的产品,它们是如何实现把这种大数据传到windows端呢?  
   
    我的数据传输过程中,都是以字符数组的形式来将数据发送的。我想请问一下linux下,在网络中有二进制数据流这种传输形式吗?不解!
    我的MSN:scastronaut@gmail.com   QQ: 759402252,望前辈提提意见,不吝指教!

[ 本帖最后由 it-rocket 于 2009-9-21 22:50 编辑 ]

论坛徽章:
0
发表于 2009-09-21 13:39 |显示全部楼层
问题可能出在你从驱动中把数据读出来的方式,你用的什么方式,是不是共享内存的形式?

论坛徽章:
0
发表于 2009-09-21 15:07 |显示全部楼层
以1M算,32MB能缓冲20多秒,网络速度一般都是10M,100M的,何来"网络传输跟不上数据产生速度"一说?

论坛徽章:
0
发表于 2009-09-21 23:20 |显示全部楼层
原帖由 epegasus 于 2009-9-21 15:07 发表
以1M算,32MB能缓冲20多秒,网络速度一般都是10M,100M的,何来"网络传输跟不上数据产生速度"一说?


   我在UNIX.Network.Programming.Volume.1中,查了socket的buffer默认情况是4096Byte,我目前开发板上的linux就是这个上限,但该socket的接收和发送缓冲区,据书上所说,最多能够设置到from 8,192 to 61,440 bytes. 所以我觉得虽说网卡是10/100M自适应的,但是最大只能达到61440 *8约为500K比特,远不到1M,所以10/100M是个和操作系统有关系的理论值吗? 小弟对这不太清楚哈!
  另外在我的开发板上,我增加我的发送缓冲区大小,但是好像不起作用,不知道是何原因!可能是我的客户端程序构建的有问题,服务器每发送一块数据过来,我需要休眠不到1秒,才可以继续向我的windows上客户端发送下一包数据,不然客户端会停机。在客户端这种情况,如果用线程处理好的话,是否可以消除这种情况!
  正因为 我服务器段休眠约一秒之后,在发送下一包4096Byte的数据,才导致了“网络传输跟不上数据产生速度"一说!
  对于这种大数据量的 网络传输,有没有什么开源的类似代码参考呢? 谢谢指教!

论坛徽章:
0
发表于 2009-09-21 23:27 |显示全部楼层
原帖由 .kaka 于 2009-9-21 13:39 发表
问题可能出在你从驱动中把数据读出来的方式,你用的什么方式,是不是共享内存的形式?

我是直接调用类似于read这样的函数来读取数据的,一次能读到1024个采样数据,我不断地这样读数就可以将采样数据读回来,不用考虑fpga所构成的fifo这块与系统的情况!
  今天调试了读取数据那块儿,发觉读出来的原始数据全部能够形成正弦波,符合信号源发送的信号情况。但是当我把数据传输到windows上客户端画曲线时却是杂乱无章的曲线,不知道我的网络传输哪块儿出了问题,导致传过来的数据不正确!

论坛徽章:
0
发表于 2009-09-21 23:30 |显示全部楼层
加大缓冲区没用,主要是你产生的数据量大于了你的吞吐能力。
你必须优化收发的过程。

加大缓冲区能解决问题吗?如果数据不能立刻搬移走,再多的缓冲区也放不下阿。

你的消耗我觉得是不是浪费在了用户层和内核层的来回通信上了。
干脆直接全部在内核实现应该会更快

论坛徽章:
0
发表于 2009-09-22 23:18 |显示全部楼层
原帖由 emmoblin 于 2009-9-21 23:30 发表
加大缓冲区没用,主要是你产生的数据量大于了你的吞吐能力。
你必须优化收发的过程。

加大缓冲区能解决问题吗?如果数据不能立刻搬移走,再多的缓冲区也放不下阿。

你的消耗我觉得是不是浪费在了用户层和 ...

以前看过你的很多帖子,看见你能出现在这里帮我一起解决问题!真的非常感谢!
我今天重写了一下板子上的server,开了个2MB的环形缓冲区,用采样数据的线程和发送数据的线程以及命令处理线程,借助互斥锁和条件变量,来完成对server的修改,由于今天信号源不再,所以还未测出效果如何!
    确实像开辟大的缓冲区的方式,对于上G,上M的采样率,我想绝对是有问题的,弄不好一不小心,两三秒就会有上G的数据产生,以前和同事一起计算过agilent的一款上G采样率的公司用的数采产品,真的很吓人! 呵呵 但是这个问题,真不知道老外是如何解决的!
   我想听听你所说的 优化收发 过程,是要怎样进行处理呢? 由于我需要对该板子进行控制,所以我都是将数据和控制进行打包处理的,开一个字符型的发送缓冲区,来将一个个包发送出去,这种方式和流传输有区别吗?  
   目前就是网络传输速度达不上去,我一次只能传送2000个数据,和包头一起共4096字节,所以实在是个问题!
   对linux还没有那么深入地去研究,所以你说的那种做到内核中去,你能否给我讲讲,非常感谢!

[ 本帖最后由 it-rocket 于 2009-9-22 23:25 编辑 ]

论坛徽章:
0
发表于 2010-09-15 22:10 |显示全部楼层
今天才来结贴,实在是有些不好意思!
问题已经解决,感谢LS上各位大侠的帮助:有多少就传送多少,网络传输速度就上去了。呵呵

论坛徽章:
0
发表于 2010-09-28 16:49 |显示全部楼层
回复 8# it-rocket


    楼主 ,问题咋解决的啊  我也碰到了相同的问题~~~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

SACC2019中国系统架构师大会

【数字转型 架构演进】SACC2019中国系统架构师大会
2019年10月31日~11月2日第11届中国系统架构师大会(SACC2019)将在北京隆重召开。四大主线并行的演讲模式,1个主会场、20个技术专场、超千人参与的会议规模,100+来自互联网、金融、制造业、电商等领域的嘉宾阵容,将为广大参会者提供一场最具价值的技术交流盛会。




----------------------------------------

大会官网>>
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP