+ -
当前位置:首页 → 问答吧 → 嵌入式linux下大数据量的网络传送问题<请通信程序高手帮帮忙>

嵌入式linux下大数据量的网络传送问题<请通信程序高手帮帮忙>

时间:2009-09-20

来源:互联网

请通信程序前辈 多多帮帮忙!
    小弟刚进嵌入式的门槛不久,最近在做一款中速的数据采集产品,在网络通信这块儿遇到问题,还望大家多提提意见,帮帮忙!
产品的采样率达到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:[email protected]   QQ: 759402252,望前辈提提意见,不吝指教!

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

作者: it-rocket   发布时间: 2009-09-20

问题可能出在你从驱动中把数据读出来的方式,你用的什么方式,是不是共享内存的形式?

作者: .kaka   发布时间: 2009-09-21

以1M算,32MB能缓冲20多秒,网络速度一般都是10M,100M的,何来"网络传输跟不上数据产生速度"一说?

作者: epegasus   发布时间: 2009-09-21



QUOTE:
原帖由 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的数据,才导致了“网络传输跟不上数据产生速度"一说!
  对于这种大数据量的 网络传输,有没有什么开源的类似代码参考呢? 谢谢指教!

作者: it-rocket   发布时间: 2009-09-21



QUOTE:
原帖由 .kaka 于 2009-9-21 13:39 发表
问题可能出在你从驱动中把数据读出来的方式,你用的什么方式,是不是共享内存的形式?


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

作者: it-rocket   发布时间: 2009-09-21

加大缓冲区没用,主要是你产生的数据量大于了你的吞吐能力。
你必须优化收发的过程。

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

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

作者: emmoblin   发布时间: 2009-09-21



QUOTE:
原帖由 emmoblin 于 2009-9-21 23:30 发表
加大缓冲区没用,主要是你产生的数据量大于了你的吞吐能力。
你必须优化收发的过程。

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

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


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

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

作者: it-rocket   发布时间: 2009-09-22

今天才来结贴,实在是有些不好意思!
问题已经解决,感谢LS上各位大侠的帮助:有多少就传送多少,网络传输速度就上去了。呵呵

作者: it-rocket   发布时间: 2010-09-15