嵌入式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
作者: epegasus 发布时间: 2009-09-21
以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
问题可能出在你从驱动中把数据读出来的方式,你用的什么方式,是不是共享内存的形式?
我是直接调用类似于read这样的函数来读取数据的,一次能读到1024个采样数据,我不断地这样读数就可以将采样数据读回来,不用考虑fpga所构成的fifo这块与系统的情况!
今天调试了读取数据那块儿,发觉读出来的原始数据全部能够形成正弦波,符合信号源发送的信号情况。但是当我把数据传输到windows上客户端画曲线时却是杂乱无章的曲线,不知道我的网络传输哪块儿出了问题,导致传过来的数据不正确!
作者: it-rocket 发布时间: 2009-09-21
你必须优化收发的过程。
加大缓冲区能解决问题吗?如果数据不能立刻搬移走,再多的缓冲区也放不下阿。
你的消耗我觉得是不是浪费在了用户层和内核层的来回通信上了。
干脆直接全部在内核实现应该会更快
作者: emmoblin 发布时间: 2009-09-21
加大缓冲区没用,主要是你产生的数据量大于了你的吞吐能力。
你必须优化收发的过程。
加大缓冲区能解决问题吗?如果数据不能立刻搬移走,再多的缓冲区也放不下阿。
你的消耗我觉得是不是浪费在了用户层和 ...
以前看过你的很多帖子,看见你能出现在这里帮我一起解决问题!真的非常感谢!
我今天重写了一下板子上的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
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28