免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: it-rocket
打印 上一主题 下一主题

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

论坛徽章:
0
11 [报告]
发表于 2010-06-05 11:17 |只看该作者
回复 10# aaaaa5aa


    这确实很值得我考虑这种方法。我想问一下,内核态里从驱动中把数据取回来一次能返回给APP的内存块大小,有限制吗?

论坛徽章:
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
12 [报告]
发表于 2010-06-05 11:54 |只看该作者
回复 11# it-rocket


    另一个帖子也看了。 既然这边人关注的多.就在这边讨论好了.
很明显是usleep占用时间太多了:
while(1)
{
  usleep(20480);
  // 调用驱动的取数接口
  ...
  // 将数据填入FIFO1缓冲中
  ...
}

ShadowStar 说的方法是正确的做法
看你时间好象来不急.
最简单的可行的解决方案应该是 完成变量
LKD中文第2版118页
去掉usleep
直接在驱动读函数对应的内核函数内添加wait_for_compleition()
int2中断函数中加completion()
我对完成变量喊不是很了解.不知道中断函数里能不能调用completion().

论坛徽章:
0
13 [报告]
发表于 2010-06-05 13:15 |只看该作者
回复 12# smalloc


    感谢smalloc和Shadowstar等的分析和建议,我查查相关资料,使用它的半满中断改进一下采样的效率,降低这个采样线程占用CPU的使用率。

此外我验证了一下,在停掉采样线程之后,其他线程正常时,数据传输能达到大约4.0Mbps,所以是否确认没有什么问题?

论坛徽章:
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
14 [报告]
发表于 2010-06-05 14:41 |只看该作者
回复 13# it-rocket


    有没有问题.我不知道咋说.
先申明下我上的给的完成变量似乎不一定行.
首先是中断里是否能调用completion()的问题
然后是你的采样读周期大概是2ms,而通常一个时间片为10ms.
是否提高效率要,节省CPU资源要看一个调度函数大概需要多少时间运行了.

然后是你说的4M绝对不是有线的速率的上限.最少也能达到7M
如果没有等待采样耗时,那么只能是处理器运算耗时了.曾经接触过一个软件方法加密的东西。 也是因为处理器加密运算瓶颈导致传输率低.
这个时候应该看到你的处理器仍然占很高的使用率.
另外在应用层处理数据也会因为进程切换导致一个数据包处理时间变长.

在处理器满负荷工作下的传输率,就是你能采样处理的最大传输率.
采样本身应该占用及少的处理器时间.所有的处理器资源应该尽量分配在数据处理算法.这样才是最有效的.

论坛徽章:
0
15 [报告]
发表于 2010-06-05 15:34 |只看该作者
分析的真是透彻,深入学习

论坛徽章:
0
16 [报告]
发表于 2010-06-05 16:12 |只看该作者
本帖最后由 it-rocket 于 2010-06-05 16:14 编辑

回复 14# smalloc

谢谢smalloc的细致分析。
   A/D在100ksps的采样率下,一个点的采样周期为10us,所以以前的在APP中的做法就是usleep休眠20480微秒后,APP一次从driver中读取2048个采样点放入FIFO1中,紧接着在休眠20480微秒,去取下一批数据,有些遗憾的是该休眠时间有时候会多出1万多微秒,所以这在APP中休眠等待取数的时间不够精确,且该采样线程占用CPU也在90%左右。
   用shadowStar的建议,用硬件发出的硬件缓冲区半满信号INT2,来在驱动的中断处理程序中进行取数,这半满大概会花上160ms才能出一次中断。较无奈的是我已经在该driver中注册了前面所讲的按键中断INT1,并可以异步通知我的APP对该按键做些相应。若再在这同一个driver中安装INT2中断,同时在一个driver中存在两个中断号,似乎不行? 或者我该改进该driver,另外写一个driver,分别将这两个中断放在不同的两个驱动设备中,进行处理?
   上面测出来的网传速度4Mbps,可能是因为我还有其他线程的影响吧?若把其他线程都关掉,只进行数据发送,可能会达到你所说的这个速度。
   
   其实在我的数据处理线程中,我都把滤波这些都给关了,只是将采样线程中放在FIFO1的采样值转换为电压值放在FIFO2中而已,所以处理步骤是很简化的了。然后另外一个线程只是将FIFO2中的一定量的数据放入发送缓冲区中,main线程在有Windows客户端读取数据时,将数据发送出去而已。

论坛徽章:
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
17 [报告]
发表于 2010-06-05 16:53 |只看该作者
本帖最后由 smalloc 于 2010-06-05 16:56 编辑

回复 16# it-rocket


    一个driver中可以注册有2个中断号
,还有我前面看错了你的是20ms所以如果完成变量可用,就值得一试.
usleep就是忙等待

论坛徽章:
0
18 [报告]
发表于 2010-06-05 17:29 |只看该作者
本帖最后由 it-rocket 于 2010-06-05 17:41 编辑

回复 17# smalloc


    恩,好的,我查查资料试试。呵呵 非常感谢!

  其实那20480微秒,是针对我APP决定一次取2048个数来讲的,如果决定取其他个数(比如1024、4096),只需要控制不同的休眠时间(10240us、40960us)。

  另外你说的usleep是忙等待,但我查看usleep的定义,确是说调用该函数的线程被suspended了呢?难道是内核代码对它的实现不是这样的?
“The usleep() function will cause the calling thread to be suspended from execution until either the number of real-time microseconds specified by the argument useconds has elapsed or a signal is delivered to the calling thread and its action is to invoke a signal-catching function or to terminate the process. The suspension time may be longer than requested due to the scheduling of other activity by the system. ”

论坛徽章:
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
19 [报告]
发表于 2010-06-05 20:15 |只看该作者
本帖最后由 smalloc 于 2010-06-05 20:55 编辑

回复 18# it-rocket


    记错了.记成udelay了.
usleep的确实会睡眠.
不过比较奇怪它是如何实现的.
按道理说.不应该存在小于一个1/HZ (10ms)的睡眠精确度.
这是在C版一个高精确度睡眠的讨论
http://bbs2.chinaunix.net/thread-1713008-1-1.html

不过问题又来了.到底是为什么占用那么多CPU资源?
还有你确信T1是采集进程吗?T1,T2没有反掉?
丢失数据的原因还可能是你采集进程睡过头了.()根据上面的精确度推断存在这种可能).
还有你的数据处理算法到底能适应多大的数据流量?可不可能说下是什么算法?
如果你的处理器只有200MHZ很有可能应付不过来...

论坛徽章:
0
20 [报告]
发表于 2010-06-05 20:46 |只看该作者
回复 19# smalloc

    呵呵
    我看了一下lkd中的完成变量,它说是类似于同步在内核中的实现,由于对内核编程还不熟悉,用起来还真让我头疼,基本还没有什么思路。在驱动的INT2中断中进行数据获取,那它中断一次就有32kB的数据可以取了。但这32KB的数据要如何传到我的APP中才是最好的呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP